U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCklzc3VlICMgbnVtYmVycyBtZW50aW9uZWQgYmVsb3cgY2FuIGJlIGZvdW5kIG9uIEdpdGh1Yi4gRm9yIG1vcmUgZGV0YWlscywgYWRkCnRoZSBpc3N1ZSBudW1iZXIgdG8gdGhlIGVuZCBvZiB0aGUgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy8KClZlcnNpb24gNC4yLjEgKDI0IEZlYiAyMDI0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMjQtMDItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgICMyODE0IENvcnJlY3RseSBpZ25vcmUgZHVwbGljYXRlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gKHdoZW4gdGhlCiAgICAgICAgICAgIGR1cGxpY2F0ZSBjb250YWlucyB0eXBlZGVmJ2QgdGVtcGxhdGUgcGFyYW1ldGVycykuCgoyMDI0LTAyLTIyOiBlcmV6Z2V2YQogICAgICAgICAgICBbUnVieSwgT2N0YXZlLCBSXSAjMjI4NCBGaXggc2VnZmF1bHQgc2hyaW5raW5nIFNUTCBjb250YWluZXJzLgoKMjAyNC0wMi0yMjogc2ltYXJrCgkgICAgRml4IC1XdW5kZWYgd2FybmluZyBhYm91dCB0ZXN0aW5nIHRoZSB2YWx1ZSBvZiBfX2NwbHVzcGx1cyB3aGVuCgkgICAgY29tcGlsaW5nIFNXSUctZ2VuZXJhdGVkIEMgY29kZS4gIFdhcm5pbmcgaW50cm9kdWNlZCBieSBhIGNoYW5nZSBpbgoJICAgIFNXSUcgNC4yLjAuCgoyMDI0LTAyLTIxOiBvbGx5CgkgICAgIzI4MDggW1BIUF0gRml4IG1lbW9yeSBsZWFrIHdoZW4gZ2V0dGluZyBvciBzZXR0aW5nIGEgUEhQCgkgICAgYXR0cmlidXRlIHdoaWNoIHdyYXBzIGEgQysrIG1lbWJlciB2YXJpYWJsZS4gIEJ1ZyBpbnRyb2R1Y2VkIGluCgkgICAgU1dJRyA0LjEuMC4KCjIwMjQtMDItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNzQ1IEZpeCBmb3Igd3JhcHBpbmcgU1RMIGNvbnRhaW5lcnMgdGhhdCBhcmUgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMKICAgICAgICAgICAgb3IgZ2xvYmFsIHZhcmlhYmxlcyAobW9zdCBzY3JpcHRpbmcgbGFuZ3VhZ2VzKS4gUHJldmlvdXNseSBhIGNvcHkgb2YgdGhlCiAgICAgICAgICAgIFNUTCBjb250YWluZXIgd2FzIG1hZGUgaW50byBhIHRhcmdldCBsYW5ndWFnZSBjb250YWluZXIgd2hlbiByZWFkaW5nIHRoZQogICAgICAgICAgICB2YXJpYWJsZS4gQ2hhbmdlcywgc3VjaCBhcyBhZGp1c3RpbmcgYW4gZWxlbWVudCBvciBhZGRpbmcvZXJhc2luZwogICAgICAgICAgICBlbGVtZW50cywgd2VyZSBtYWRlIHRvIHRoZSBjb3B5IG9mIHRoZSBjb250YWluZXIgcmF0aGVyIHRoZSBhY3R1YWwKICAgICAgICAgICAgdW5kZXJseWluZyBDKysgY29udGFpbmVyLiBBbHNvIGFwcGxpZXMgdG8gY29uc3QgcmVmZXJlbmNlIFNUTCBzdGF0aWMKICAgICAgICAgICAgbWVtYmVycy4KCiAgICAgICAgICAgIElmIHlvdSByZWFsbHkgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIGluIHRoZSB0eXBlbWFwIHRoYXQgdXNlZAogICAgICAgICAgICB0byBwcm92aWRlIGl0LiBGb3IgZXhhbXBsZSwgZm9yIHN0ZDo6bGlzdDwgaW50ID4gYW5kCiAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDwgaW50ID4mLCB1c2U6CgogICAgICAgICAgICAgICV0eXBlbWFwKHZhcm91dCxub2Jsb2NrPTEsZnJhZ21lbnQ9IlNXSUdfIiAiVHJhaXRzIiAiXyIge3N0ZDo6bGlzdDwgaW50ID59KQogICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8IGludCA+LCBjb25zdCBzdGQ6Omxpc3Q8IGludCA+JiAgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHN3aWc6OmZyb20oc3RhdGljX2Nhc3Q8IHN0ZDo6bGlzdDwgaW50ID4gPigkMSkpOwogICAgICAgICAgICAgIH0KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDI0LTAyLTE1OiBvbGx5CgkgICAgSW1wcm92ZSB0eXBlIGRlZHVjdGlvbiBmb3IgZW51bSB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMuCgoyMDI0LTAyLTE1OiBybGFib2lzcwoJICAgICMyNzk5IFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgOS4wOyBmaXggd2FybmluZ3MgYWJvdXQgdXNlCgkgICAgb2YgZGVwcmVjYXRlZCBPY3RhdmUgQVBJcyB3aXRoIE9jdGF2ZSA3IGFuZCBsYXRlci4KCjIwMjQtMDItMTQ6IG9sbHkKCSAgICBTV0lHIG5vdyB3YXJucyBhbmQgaWdub3JlcyBpZiAlY29uc3RhbnQgaXMgdXNlZCB3aXRoIGFuIGltcGxpY2l0CgkgICAgdHlwZSB3aGljaCBTV0lHIGNhbid0IGRlZHVjZS4KCjIwMjQtMDItMTM6IG9sbHkKCSAgICBGaXggdHlwZSBkZWR1Y3Rpb24gZm9yIGNlcnRhaW4gY2FzZXMgaW52b2x2aW5nIEMtc3R5bGUgY2FzdHMsIG9yCgkgICAgd2hpY2ggYXJlIHN5bnRhY3RpY2FsbHkgbGlrZSBhIEMtc3R5bGUgY2FzdCBhcHBsaWVkIHRvIGFuIHVuYXJ5CgkgICAgb3BlcmF0b3IsIHN1Y2ggYXM6ICg3KSo2CgoyMDI0LTAyLTEzOiBvbGx5CgkgICAgIzI3OTYgRml4IGhhbmRsaW5nIG9mIGVudW0gaW5pdGlhbGlzZWQgYnkgZXhwcmVzc2lvbiBpbmNsdWRpbmcgYQoJICAgIGNhc3QgdG8gYSB0eXBlZGVmLWVkIHR5cGUuICBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gNC4yLjAuCgoyMDI0LTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjc5NCBGaXggU3dpZ1R5cGVfaXN2YXJpYWRpYyBhc3NlcnRpb24gdG8gYWRkIHN1cHBvcnQgZm9yIHZhcmlhZGljCiAgICAgICAgICAgIHRlbXBsYXRlZCBmdW5jdGlvbnMgaW4gYSB0ZW1wbGF0ZS4KCjIwMjQtMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNzYxIFtUY2xdIEZpeCBhc3NlcnQgaW4gU1dJR19UY2xfQ29udmVydFB0ckZyb21TdHJpbmcoKS4KCjIwMjQtMDItMDM6IHdzZnVsdG9uCiAgICAgICAgICAgICMxODk3IFtDIywgSmF2YV0gRml4IGNyYXNoIGhhbmRsaW5nIGVudW1zIHdpdGggc2FtZSBuYW1lIGluIGRpZmZlcmVudAogICAgICAgICAgICBuYW1lc3BhY2VzLgoKMjAyNC0wMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgIzI3ODEgQ29ycmVjdGx5IHJlcG9ydCBsaW5lIG51bWJlciB3YXJuaW5ncy9lcnJvcnMgZm9yIGJhc2UgY2xhc3NlcyB0aGF0CiAgICAgICAgICAgIGFyZSB0ZW1wbGF0ZXMuCgoyMDI0LTAxLTMxOiBvbGx5CgkgICAgRml4IGFzc2VydGlvbiBmYWlsdXJlIGFuZCBzZWdmYXVsdCB0cnlpbmcgdG8gdXNlICVjb25zdGFudCB0bwoJICAgIGRlZHVjZSB0aGUgdHlwZSBvZiBhICJmbG9hdCBfQ29tcGxleCIgY29uc3RhbnQuCgoyMDI0LTAxLTMxOiBqaW0tZWFzdGVyYnJvb2sKICAgICAgICAgICAgIzI3NzEgW1B5dGhvbl0gYnVpbHRpbiBmaXhlcyB0byBoYW5kbGUgTlVMTCB2YWx1ZXMgcGFzc2VkIHRvIHNsb3RzIHVzaW5nCiAgICAgICAgICAgIGZ1bmN0eXBlOiBzc2l6ZW9iamFyZ3Byb2MgYW5kIHRlcm5hcnlmdW5jLgoKMjAyNC0wMS0zMTogb2xseQoJICAgIFtKYXZhXSAjMjc2NiBGaXggc2VnZmF1bHQgdHJ5aW5nIHRvIHdyYXAgYSBjb25zdGFudCB3aG9zZSB0eXBlIGlzIHVua25vd24KCSAgICB0byBTV0lHIHdpdGggIiVqYXZhY29uc3QoMSk7IiBlbmFibGVkLgoKMjAyNC0wMS0zMTogd3NmdWx0b24KICAgICAgICAgICAgIzI3NjggRml4IHNlZyBmYXVsdCBoYW5kbGluZyB1cGNhc3Rpbmcgd2hlbiB1c2luZyAlc2hhcmVkX3B0ciBvbiBzb21lCiAgICAgICAgICAgIHRlbXBsYXRlcy4KCjIwMjQtMDEtMzE6IG9sbHkKCSAgICAjMjc4MyBGaXggaW5jb3JyZWN0bHkgZGVkdWNlZCB0eXBlIGZvciBmdW5jdGlvbiBjYWxsLiAgUmVncmVzc2lvbgoJICAgIGludHJvZHVjZWQgaW4gNC4yLjAuCgoyMDI0LTAxLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB3cmFwcGluZyB0d28gb3IgbW9yZSBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgaGF2ZSB0aGUgc2FtZSBmcmllbmQgb3BlcmF0b3Igb3ZlcmxvYWQgd2hlbiB0aGUgY2xhc3NlcyBhcmUgaW4gYSBuYW1lc3BhY2UuCgoyMDI0LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy85NjAvCiAgICAgICAgICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzgwNy8KICAgICAgICAgICAgRml4IHNvIHRoYXQgZnJpZW5kIG9wZXJhdG9ycyB3aXRoaW4gYSBuYW1lc3BhY2UgY2FuIGJlIGNvcnJlY3RseSBpZ25vcmVkCiAgICAgICAgICAgIG9yIHJlbmFtZWQuCgoyMDI0LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBXcmFwIGZyaWVuZCBmdW5jdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBvciBkZWNsYXJlZCB3aXRoaW4gYSBuYW1lc3BhY2UuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdW5xdWFsaWZpZWQgZnJpZW5kIGRlZmluaXRpb25zL2RlY2xhcmF0aW9ucyBpbiBhIG5hbWVzcGFjZSB3ZXJlCiAgICAgICAgICAgIGlnbm9yZWQuCgogICAgICAgICAgICBUaGUgdmlzaWJpbGl0eSBvZiB1bnF1YWxpZmllZCBmcmllbmQgZnVuY3Rpb25zIGluIEMrKyBpcyBzb21ld2hhdCBxdWlya3kKICAgICAgICAgICAgYW5kIHRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGVuaGFuY2VkIHRvIGFpZCB3cmFwcGluZyBvZiBmcmllbmRzLgoKMjAyNC0wMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgIzI3NDkgRml4IHNlZyBmYXVsdCBoYW5kbGluZyBmcmllbmQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuCgoyMDI0LTAxLTEyOiBvbGx5CgkgICAgW1J1YnksIFRjbF0gIzI3NTEgRml4IC1leHRlcm5hbC1ydW50aW1lIG91dHB1dCB0byBkZWZpbmUKCSAgICBTV0lHX3NucHJpbnRmIChidWcgaW50cm9kdWNlZCBpbiA0LjIuMCkuCgoyMDI0LTAxLTEyOiBvbGx5CgkgICAgSW1wcm92ZSBwcmVwcm9jZXNzb3Igd2FybmluZyBmb3IgdXNlIG9mIGFuIHVuZGVmaW5lZCBmdW5jdGlvbi1saWtlCgkgICAgbWFjcm8uIFNXSUcgbm93IHdhcm5zOgoKCSAgICBXYXJuaW5nIDIwMjogQ291bGQgbm90IGV2YWx1YXRlIGV4cHJlc3Npb24gJ01ZX1ZFUlNJT05fQVRfTEVBU1QoMSwyLDMpJwoJICAgIFdhcm5pbmcgMjAyOiBVc2Ugb2YgdW5kZWZpbmVkIGZ1bmN0aW9uLWxpa2UgbWFjcm8KCgkgICAgaW5zdGVhZCBvZjoKCgkgICAgV2FybmluZyAyMDI6IENvdWxkIG5vdCBldmFsdWF0ZSBleHByZXNzaW9uICdNWV9WRVJTSU9OX0FUX0xFQVNUKDEsMiwzKScKCSAgICBXYXJuaW5nIDIwMjogU3ludGF4IGVycm9yOiBleHBlY3RlZCBvcGVyYXRvcgoKMjAyNC0wMS0xMTogUGF1bE9iZXJtZWllcgoJICAgIFtUY2xdIEltcHJvdmUgc3VwcG9ydCBmb3IgVGNsIDkuMC4gIEFsbCBleGFtcGxlcyBhbmQgdGVzdHMgbm93IHBhc3MKCSAgICB3aXRoIFRjbCA5LjAuYjEuCgoyMDI0LTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMjc0NCBSZWdyZXNzaW9uIGZpeCAtIGFkZCBpbiBtaXNzaW5nIFN3aWdQeUl0ZXJhdG9yX1QgZnJhZ21lbnQgZm9yCiAgICAgICAgICAgIFN3aWdQeUl0ZXJhdG9yQ2xvc2VkX1Qgd2hlbiB1c2luZyAlaW1wb3J0IG9uIGFuIGluc3RhbnRpYXRlZCBzdGQ6Om1hcC4KClZlcnNpb24gNC4yLjAgKDMwIERlYyAyMDIzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMjMtMTItMjQ6IGRlZ2FzdXMKCSAgICBbUHl0aG9uXSAjMjQ5NCBGaXggaW50ZWdlciBvdmVyZmxvdyAvIHVuZGVmaW5lZCBiZWhhdmlvciBmb3IgcHl0aG9uCiAgICAgICAgICAgIGNhc3Rtb2RlIG9uIHNpemVvZihsb25nKT09OCBwbGF0Zm9ybXMgZm9yIGltcGxpY2l0IGNvbnZlcnNpb25zIGFyb3VuZAogICAgICAgICAgICBlZGdlIGNhc2VzIG9mIExPTkdfTUFYIGFuZCBVTE9OR19NQVgsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGFzX2wobG9uZyB4KTsgLy8gQyBpbnRlcmZhY2UKCiAgICAgICAgICAgIFVzYWdlIGZyb20gUHl0aG9uOgoKICAgICAgICAgICAgICBsbWF4ZCA9IG1hdGgubmV4dGFmdGVyKGZsb2F0KDIqKjYzKSwgMC4wKSAjIExPTkdfTUFYID09IDIqKjYzLTEKICAgICAgICAgICAgICAjIE5vdyBiZWxvdyBjb3JyZWN0bHkgcmFpc2VzIGEgVHlwZUVycm9yIGR1ZSB0byB0aGUgb3ZlcmZsb3cKICAgICAgICAgICAgICBhc19sKG1hdGgubmV4dGFmdGVyKGxtYXhkLCBmbG9hdCgnaW5mJykpKQoKMjAyMy0xMi0yMTogb2xseQoJICAgIFtQSFBdIGAlZmVhdHVyZSgicGhwOmFsbG93ZHluYW1pY3Byb3BlcnRpZXMiLCAwKSBGb287YCBpcyBub3cgaGFuZGxlZCBhcwoJICAgIHRoZSBmZWF0dXJlIGJlaW5nIG9mZiB0byBtYXRjaCBvdGhlciBib29sZWFuIGZlYXR1cmVzLiAgUHJldmlvdXNseQoJICAgIGFueSB2YWx1ZSBzZXQgd2FzIHRyZWF0ZWQgYXMgb24uCgoyMDIzLTEyLTIwOiB0cmVpdG1heXIKICAgICAgICAgICAgW1J1YnldICMyMDMzIEZpeCBtaXNzaW5nIGNoZWNrcyBmb3IgbmVnYXRpdmUgbnVtYmVycyB3aGVuIHBhc3NpbmcgbnVtYmVycwogICAgICAgICAgICB0byB1bnNpZ25lZCBsb25nL3Vuc2lnbmVkIGxvbmcgbG9uZyBDIHR5cGVzLgoKMjAyMy0xMi0yMDogY3JoaWx0b24KICAgICAgICAgICAgW0MjXSAjMjcyMiBBZGQgc3VwcG9ydCB0aGUgImNzOmRlZmF1bHRhcmdzIiBmZWF0dXJlLgoKICAgICAgICAgICAgVGhpcyBhZGRzIGEgd2F5IHRvIHdyYXAgQysrIGZ1bmN0aW9ucyB0aGF0IGhhdmUgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2l0aCBhbiBlcXVpdmFsZW50IEMjIGZ1bmN0aW9uIHdpdGggZGVmYXVsdCBhcmd1bWVudHMsIGluc3RlYWQgb2YKICAgICAgICAgICAgZ2VuZXJhdGluZyBhbiBvdmVybG9hZGVkIEMjIG1ldGhvZCBmb3IgZWFjaCBkZWZhdWx0ZWQgYXJndW1lbnQuCgoyMDIzLTEyLTIwOiB2YWR6LCB2YWRpbWNuLCB3YW5naXRvMzMsIHdzZnVsdG9uLCBjbGludG9uc3RpbXBzb24KICAgICAgICAgICAgW1B5dGhvbl0gIzE2MTMgIzE2ODcgIzE3MjcgIzIxOTAgIzI3MjcgIzI0MjggQWRkIHN1cHBvcnQgZm9yIHRoZSBQeXRob24gc3RhYmxlCiAgICAgICAgICAgIEFCSSB1c2luZyBkZWZhdWx0IFB5dGhvbiBvcHRpb25zLiBDb2RlIGlzIGdlbmVyYXRlZCB0aGF0IGNvbXBpbGVzIHdoZW4KICAgICAgICAgICAgc2V0dGluZyB0aGUgQyBtYWNybyBQeV9MSU1JVEVEX0FQSSB0byAweDAzMDQwMDAwIChhdCBDL0MrKyBjb21waWxlIHRpbWUpLgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIC1idWlsdGluLCAtZmFzdCAodXNlZCBieSAtTykgb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KCjIwMjMtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1vcmUgZWZmaWNpZW50IGlucHV0IHN0cmluZyBtYXJzaGFsbGluZyBmb3IgUHl0aG9uIDMuCgogICAgICAgICAgICBQcmV2aW91c2x5IGEgY29weSBvZiBhIHN0cmluZyB3YXMgbWFkZSB3aGlsZSBjb252ZXJ0aW5nIGZyb20gYSBQeXRob24gMwogICAgICAgICAgICBzdHJpbmcgdG8gYSBjaGFyICogb3Igc3RkOjpzdHJpbmcuIFRoaXMgY29weSBpcyBubyBsb25nZXIgbmVlZGVkIG1ha2luZwogICAgICAgICAgICBzdHJpbmcgbWFyc2hhbGxpbmcgbW9yZSBlZmZpY2llbnQuIERvZXMgbm90IGFwcGx5IHRvIHRoZSBzdGFibGUgQUJJCiAgICAgICAgICAgIHRhcmdldHRpbmcgUHl0aG9uIDwgMy4xMCB3aGVyZSBhIGNvcHkgaXMgc3RpbGwgcmVxdWlyZWQgd2hlcmUgdGhlIHN0YWJsZQogICAgICAgICAgICBBQkkgZG9lcyBub3QgcHJvdmlkZSBQeVVuaWNvZGVfQXNVVEY4QW5kU2l6ZS4KCjIwMjMtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgICMyMTkwIFJlcGxhY2UgU1dJR19QeXRob25fc3RyX0FzQ2hhciB3aXRoIFNXSUdfUHlVbmljb2RlX0FzVVRGOEFuZFNpemUuCgogICAgICAgICAgICBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyIGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gUHlfTElNSVRFRF9BUEkgaXMgZGVmaW5lZAogICAgICAgICAgICBhcyBpdCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBpbiBhIFB5Qnl0ZXMgb2JqZWN0IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy4KCiAgICAgICAgICAgIFNXSUdfUHlVbmljb2RlX0FzVVRGOEFuZFNpemUgaXMgYW4gZWZmaWNpZW50IHJlcGxhY2VtZW50LCBidXQgcmVxdWlyZXMgYQogICAgICAgICAgICBkaWZmZXJlbnQgQVBJIGFuZCB0aGUgY2FsbGVyIHRvIGRlY3JlbWVudCB0aGUgcmVmY291bnQgb24gdGhlIGludGVybWVkaWF0ZQogICAgICAgICAgICBQeU9iamVjdCBpbiB0aGUgUHlfTElNSVRFRF9BUEkgPCAweDAzMEEwMDAwIGltcGxlbWVudGF0aW9uLiBUaGUgYWx0ZXJuYXRpdmUKICAgICAgICAgICAgd291bGQgaGF2ZSByZXF1aXJlZCBjb3B5aW5nIHRoZSByZXR1cm5lZCBjaGFyICogc3RyaW5nIGFzIHdhcyBkb25lIGluIGEKICAgICAgICAgICAgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gcmVxdWlyaW5nIGEgY2FsbCB0byB0aGUgZGVmdW5jdCBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzCiAgICAgICAgICAgIGZ1bmN0aW9uLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjMtMTItMTQ6IFBhdWxPYmVybWVpZXIKCSAgICBbVGNsXSAjMjczMCBSZW5hbWUgU1dJRydzIFRjbF9HZXRCb29sRnJvbU9iaigpIHNpbmNlIFRjbCA4LjcgKFRJUCA2MTgpCgkgICAgaW50cm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZS4KCgkgICAgW1RjbF0gIzI3MjkgVXNlIFRjbF9HZXRTdHJpbmcoKSBpbnN0ZWFkIG9mIFRjbF9HZXRTdHJpbmdGcm9tT2JqKC4uLiwgTlVMTCkKCSAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFRjbCA5LgoKMjAyMy0xMi0wMzogb2xseQoJICAgIFtPY2FtbF0gUmVtb3ZlIC1zdWZmaXggY29tbWFuZCBsaW5lIG9wdGlvbiB3aGljaCBoYXMgZW1pdHRlZCBhCgkgICAgZGVwcmVjYXRpb24gd2FybmluZyBzaW5jZSBTV0lHIDMuMC40IC0gaWYgeW91IHdhbnQgdG8gc3BlY2lmeQoJICAgIGEgZGlmZmVyZW50IGZpbGVuYW1lIGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGVkIEMrKyBmaWxlcyB1c2UgLWNwcGV4dAoJICAgIGluc3RlYWQsIHdoaWNoIHdvcmtzIGZvciBhbGwgU1dJRyB0YXJnZXQgbGFuZ3VhZ2UgYmFja2VuZHMuCgoyMDIzLTEyLTAxOiBzYWlhcmNvdDg5NQogICAgICAgICAgICBbUHl0aG9uXSAjMjQxMyBQcmV2ZW50IHBvdGVudGlhbCBtdWx0aS10aHJlYWRpbmcgY3Jhc2g7IGdyYWNlZnVsbHkgZXhpdCBydW5uaW5nCiAgICAgICAgICAgIGRhZW1vbiB0aHJlYWRzIG9uIG1haW4gdGhyZWFkIGV4aXQuCgoyMDIzLTExLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgcGFyc2luZyBDKysyMCBjb25zdGV4cHIgZGVzdHJ1Y3RvcnMuCgoyMDIzLTExLTE5OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPCBhbmQgPiB0byBub3QKCSAgICBkcm9wIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgc3ViZXhwcmVzc2lvbiBhcyBkb2luZyBzbyBjYW4gY2hhbmdlCgkgICAgaXRzIHZhbHVlIGluIHNvbWUgY2FzZXMuCgoyMDIzLTExLTE4OiB5YXNhbW9rYSwgam1hcnJlYwogICAgICAgICAgICBbUHl0aG9uXSAjMjYzOSBBZGQgc3RkX2ZpbGVzeXN0ZW0uaSBmb3Igd3JhcHBpbmcgc3RkOjpmaWxlc3lzdGVtOjpwYXRoCiAgICAgICAgICAgIHdpdGggcGF0aGxpYi5QYXRoLgoKMjAyMy0xMS0xNzogY2hyc3RwaHJjaHZ6CgkgICAgW1RjbF0gIzI3MTEgRml4IC1XbWlzc2luZy1icmFjZXMgd2FybmluZyBpbiBnZW5lcmF0ZWQgY29kZS4KCjIwMjMtMTEtMTc6IGNocnN0cGhyY2h2egoJICAgIFtUY2xdICMyNzEwIFN0b3AgdXNpbmcgVGNsJ3MgQ09OU1QgbWFjcm8uICBJdCdzIG5vIGxvbmdlciBuZWVkZWQKCSAgICBhbmQgaXMgc2V0IHRvIGJlIGRlcHJlY2F0ZWQgaW4gVGNsIDguNywgYW5kIHJlbW92ZWQgaW4gVGNsIDkuMC4KCjIwMjMtMTEtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUmVwbGFjZSBlbXB0eSgpIG1ldGhvZCB3aXRoIElzRW1wdHkgcHJvcGVydHkgZm9yIHN0ZDo6dmVjdG9yLCBzdGQ6Omxpc3QsIHN0ZDo6bWFwCiAgICAgICAgICAgIGNvbnRhaW5lcnMgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBhbGwgY29udGFpbmVycy4KCiAgICAgICAgICAgIFRoZSBlbXB0eSgpIG1ldGhvZCBpcyBhY3R1YWxseSBzdGlsbCB3cmFwcGVkLCBidXQgYXMgYSBwcml2YXRlIHByb3h5IG1ldGhvZC4gRm9yIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmlsaXR5LCB0aGUgbWV0aG9kIGNhbiBiZSBtYWRlIHB1YmxpYyBhZ2FpbiB1c2luZyAlY3NtZXRob2Rtb2RpZmllcnMgZm9yIGFsbAogICAgICAgICAgICB2ZWN0b3JzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICVleHRlbmQgc3RkOjp2ZWN0b3IgewogICAgICAgICAgICAgICAgJWNzbWV0aG9kbW9kaWZpZXJzIGVtcHR5KCkgY29uc3QgInB1YmxpYyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKCiAgICAgICAgICAgIG9yIGFsdGVybmF0aXZlbHkgZm9yIGVhY2ggaW5kaXZpZHVhbCAldGVtcGxhdGUgaW5zdGFudGlhdGlvbiBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgc3RkOjp2ZWN0b3I8ZG91YmxlPjo6ZW1wdHkoKSBjb25zdCAicHVibGljIgogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JEb3VibGUpIHN0ZDo6dmVjdG9yPGRvdWJsZT47CgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjMtMTEtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN0ZF91bm9yZGVyZWRfc2V0LmkgZm9yIHdyYXBwaW5nIHN0ZDo6c3RkX3Vub3JkZXJlZF9zZXQsIGltcGxlbWVudGluZwogICAgICAgICAgICBDIyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JU2V0PD4uCgoyMDIzLTExLTA5OiBvbGx5CgkgICAgIzI1OTEgU1dJRyBub3cgc3VwcG9ydHMgY29tbWFuZCBsaW5lIG9wdGlvbnMgLXN0ZD1jWFggYW5kCgkgICAgLXN0ZD1jKytYWCB0byBzcGVjaWZ5IHRoZSBDL0MrKyBzdGFuZGFyZHMgdmVyc2lvbi4gIFRoZSBvbmx5IGVmZmVjdAoJICAgIG9mIHRoZXNlIG9wdGlvbnMgaXMgdG8gc2V0IGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgX19TVERDX1ZFUlNJT05fXwoJICAgIGFuZCBfX2NwbHVzcGx1cyByZXNwZWN0aXZlbHksIHdoaWNoIGlzIHVzZWZ1bCBpZiB5b3UncmUgd3JhcHBpbmcKCSAgICBoZWFkZXJzIHdoaWNoIGhhdmUgcHJlcHJvY2Vzc29yIGNoZWNrcyBiYXNlZCBvbiB0aGVpciB2YWx1ZXMuCgoyMDIzLTExLTA5OiBvbGx5CgkgICAgU1dJRyBub3cgZGVmaW5lcyBfX1NURENfXyB0byAxIHRvIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgSVNPIEMvQysrCgkgICAgY29tcGlsZXJzIC0gcHJldmlvdXNseSBpdCBoYWQgYW4gZW1wdHkgdmFsdWUuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMy0xMS0wOTogb2xseQoJICAgIFdoZW4gLWMrKyBpcyB1c2VkLCBTV0lHIG5vdyBkZWZpbmVzIF9fY3BsdXNwbHVzIHRvIGJlIDE5OTcxMUwgKHRoZQoJICAgIHZhbHVlIGZvciBDKys5OCkgYnkgZGVmYXVsdCAtIHByZXZpb3VzbHkgaXRzIHZhbHVlIHdhcyBzZXQgdG8KCSAgICBfX2NwbHVzcGx1cy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIzLTExLTA4OiBlbW1lbmxhdQogICAgICAgICAgICAjMjQ4MCBbQyNdIEFkZCBzdGRfdW5vcmRlcmVkX21hcC5pIGZvciB3cmFwcGluZyBzdGQ6OnN0ZF91bm9yZGVyZWRfbWFwLCBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgQyMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCjIwMjMtMTEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtELCBKYXZhXSBBZGQgdGhlIGRiZWdpbiBvcHRpb24gdG8gdGhlICVtb2R1bGUgZGlyZWN0aXZlIGZvciBnZW5lcmF0aW5nIGNvZGUgYXQKICAgICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBEIGZpbGUuIFNpbWlsYXJseSBqYXZhYmVnaW4gZm9yIEphdmEuIFRoaXMgZW5hYmxlcyBvbmUKICAgICAgICAgICAgdG8gYWRkIGEgY29tbW9uIGNvbW1lbnQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggRC9KYXZhIGZpbGUuCgoyMDIzLTExLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdICMyNjgxIFN1cHBvcnQgbnVsbGFibGUgcmVmZXJlbmNlIHR5cGVzLiBBIGdlbmVyaWMgQyMgb3B0aW9uIHRvIHRoZQogICAgICAgICAgICAlbW9kdWxlIGRpcmVjdGl2ZSBhbGxvd3Mgb25lIHRvIGFkZCBpbiBhbnkgY29kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5CiAgICAgICAgICAgIEMjIGZpbGUuIFRoaXMgY2FuIGFkZCB0aGUgI251bGxhYmxlIGVuYWJsZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGF0IHRoZSBiZWdpbm5pbmcKICAgICAgICAgICAgb2YgZXZlcnkgQyMgZmlsZSBpbiBvcmRlciB0byBlbmFibGUgbnVsbGFibGUgcmVmZXJlbmNlIHR5cGVzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICVtb2R1bGUoY3NiZWdpbj0iI251bGxhYmxlIGVuYWJsZVxuIikgbXltb2R1bGUKCjIwMjMtMTAtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNzgzIERvbid0IHN3YWxsb3cgYWxsIGV4Y2VwdGlvbnMgaW50byBhIE5vdEltcGxlbWVudGVkIHJldHVybgogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIG9wZXJhdG9ycyB3aGljaCBhcmUgbWFya2VkIHdpdGggJXB5dGhvbm1heWJlY2FsbC4gQ29ycmVjdHMgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIFBFUCAyMDcuCgoyMDIzLTEwLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIERdICM5MDIgVXNlIHRoZSBDKysxMSBlbnVtIGJhc2UsIHRoYXQgaXMsIHRoZSB1bmRlcmx5aW5nIGVudW0KICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIEZvciBDIywgaXQgaXMgdXNlZCBhcyB0aGUgdW5kZXJseWluZyB0eXBlIGluIHRoZSBnZW5lcmF0ZWQgQyMgZW51bS4KICAgICAgICAgICAgRm9yIEQsIGl0IGlzIHVzZWQgYXMgdGhlIGVudW0gYmFzZSB0eXBlIGluIHRoZSBnZW5lcmF0ZWQgRCBlbnVtLgoKMjAyMy0xMC0xNjogd3NmdWx0b24KICAgICAgICAgICAgIzI2ODcgQW5vdGhlciB1c2luZyBkZWNsYXJhdGlvbnMgZml4IGZvciBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyBtb3JlIHRoYW4KICAgICAgICAgICAgdHdvIGRlZXAgYW5kIHRoZSB1c2luZyBkZWNsYXJhdGlvbnMgYXJlIG92ZXJsb2FkZWQuIFVzaW5nIGRlY2xhcmF0aW9ucwogICAgICAgICAgICBmcm9tIGEgYmFzZSBjbGFzcycgYmFzZSB3ZXJlIG5vdCBhdmFpbGFibGUgZm9yIHVzZSBpbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIHdoZW4gdGhlIHVzaW5nIGRlY2xhcmF0aW9uIHdhcyBiZWZvcmUgYSBtZXRob2QgZGVjbGFyYXRpb24uCgoyMDIzLTEwLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEdvLCBHdWlsZSwgSmF2YSwgSmF2YXNjcmlwdCwgTHVhLCBPY2FtbCwgUiwgUmFja2V0XSAjMTY4MAogICAgICAgICAgICBjYXJyYXlzLmkgbGlicmFyeSBtb2RpZmllZCB0byB1c2Ugc2l6ZV90IGluc3RlYWQgb2YgaW50IGZvciB0aGUgZnVuY3Rpb25zCiAgICAgICAgICAgIHByb3ZpZGVkIGJ5ICVhcnJheV9mdW5jdGlvbnMgYW5kICVhcnJheV9jbGFzcy4KCiAgICAgICAgICAgIElmIHRoZSBvbGQgdHlwZXMgYXJlIHJlcXVpcmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlICVhcHBseSB0bwogICAgICAgICAgICByZXN0b3JlIHRoZSBvbGQgdHlwZXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImNhcnJheXMuaSIKICAgICAgICAgICAgICAlYXBwbHkgaW50IHsgc2l6ZV90IG5lbGVtZW50cywgc2l6ZV90IGluZGV4IH0KICAgICAgICAgICAgICAuLi4gJWFycmF5X2Z1bmN0aW9ucyBhbmQgJWFycmF5X2NsYXNzIC4uLgogICAgICAgICAgICAgICVjbGVhciBzaXplX3QgbmVsZW1lbnRzLCBzaXplX3QgaW5kZXg7ICMgVG8gYmUgc2FmZSBpbiBjYXNlIHVzZWQgZWxzZXdoZXJlCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMy0xMC0xMTogb2xseQoJICAgIFtQSFBdICMyNjg1IEZpeCB0ZXN0Y2FzZSBkaXJlY3Rvcl9maW5hbGl6ZXIgdG8gd29yayB3aXRoIFBIUCA4LjMuCgoyMDIzLTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjMwNyBzdGQ6OnZlY3Rvcjo6Y2FwYWNpdHkgYW5kIHN0ZDo6dmVjdG9yOjpyZXNlcnZlIHNpZ25hdHVyZSBjaGFuZ2VzLgoKICAgICAgICAgICAgSmF2YSBhcGkgY2hhbmdlcyBmcm9tOgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGNhcGFjaXR5KCkgeyAuLi4gfQogICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2VydmUobG9uZyBuKSB7IC4uLiB9CiAgICAgICAgICAgIHRvOgogICAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FwYWNpdHkoKSB7IC4uLiB9CiAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzZXJ2ZShpbnQgbikgeyAuLi4gfQogICAgICAgICAgICB0byBmaXQgaW4gd2l0aCB0aGUgdXN1YWwgSmF2YSBjb252ZW50aW9uIG9mIHVzaW5nIGludCBmb3IgY29udGFpbmVyCiAgICAgICAgICAgIGluZGV4aW5nIGFuZCBzaXppbmcuCgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgYXBpIGZvciBzdGQ6OnZlY3Rvcjo6cmVzZXJ2ZSBjYW4gYmUgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB2aWEKICAgICAgICAgICAgJWV4dGVuZCB0byBhZGQgaW4gYW4gb3ZlcmxvYWRlZCBtZXRob2QgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF92ZWN0b3IuaT4KICAgICAgICAgICAgICAlZXh0ZW5kIHN0ZDo6dmVjdG9yIHsKICAgICAgICAgICAgICAgIHZvaWQgcmVzZXJ2ZShqbG9uZyBuKSB0aHJvdyAoc3RkOjpsZW5ndGhfZXJyb3IsIHN0ZDo6b3V0X29mX3JhbmdlKSB7CiAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6Om91dF9vZl9yYW5nZSgidmVjdG9yIHJlc2VydmUgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlIik7CiAgICAgICAgICAgICAgICAgIHNlbGYtPnJlc2VydmUobik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgcGFydGlhbGx5IGRyaXZlbiBieSB0aGUgbmVlZCB0byBzZWFtbGVzc2x5IHN1cHBvcnQgdGhlIGZ1bGwKICAgICAgICAgICAgNjQtYml0IHJhbmdlIGZvciBzaXplX3QgZ2VuZXJpY2FsbHksIGFwYXJ0IGZyb20gdGhlIGN1c3RvbWlzYXRpb25zIGZvciB0aGUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lcnMsIGJ5IHVzaW5nOgoKICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyBsb25nIHsgc2l6ZV90IH07CiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmIHsgY29uc3Qgc2l6ZV90ICYgfTsKCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIzLTEwLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdICMyMzc5IERlZmluaW5nIFNXSUdXT1JEU0laRTY0IG5vdyBhcHBsaWVzIHRoZSAodW5zaWduZWQpCiAgICAgICAgICAgIGxvbmcgbG9uZyB0eXBlbWFwcyB0byAodW5zaWduZWQpIGxvbmcgZm9yIGEgYmV0dGVyIG1hdGNoIG9uIHN5c3RlbXMKICAgICAgICAgICAgd2hlcmUgbG9uZyBpcyA2NC1iaXRzLiBBIG5ldyAiVHlwZSBtYXBwaW5nIiBzZWN0aW9uIGhhcyBiZWVuIGFkZGVkIGludG8KICAgICAgICAgICAgdGhlIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24gY292ZXJpbmcgdGhpcyBhbmQgbWFyc2hhbGxpbmcgb2YgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzLiBDICh1bnNpZ25lZCkgbG9uZyBoYW5kbGluZyByZW1haW5zIGFzIGlzIGJ5IGRlZmF1bHQsIHRoYXQgaXMsCiAgICAgICAgICAgIG1hcnNoYWxsIGFzIDMyLWJpdC4KCiAgICAgICAgICAgIFRoZSBJTlBVVFtdLCBPVVRQVVRbXSwgSU5PVVRbXSwgRklYRURbXSB0eXBlbWFwcyBmb3IgbG9uZyBhbmQgdW5zaWduZWQgbG9uZwogICAgICAgICAgICBpbiBhcnJheXNfY3NoYXJwLmkgY2FuIG5vdyBiZSB1c2VkIGFuZCBjb21waWxlZCBvbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlCiAgICAgICAgICAgIHNpemVvZihsb25nKSAhPSBzaXplb2YoaW50KS4gUmVxdWlyZXMgU1dJR1dPUkRTSVpFNjQgdG8gYmUgZGVmaW5lZC4KCjIwMjMtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjNjQ2ICM2NDkgRGVmaW5pbmcgU1dJR1dPUkRTSVpFNjQgbm93IGFwcGxpZXMgdGhlICh1bnNpZ25lZCkKICAgICAgICAgICAgbG9uZyBsb25nIHR5cGVtYXBzIHRvICh1bnNpZ25lZCkgbG9uZyBmb3IgYSBiZXR0ZXIgbWF0Y2ggb24gc3lzdGVtcwogICAgICAgICAgICB3aGVyZSBsb25nIGlzIDY0LWJpdHMuCgoyMDIzLTA5LTE4OiBjaHJpc3RvcGhlLWNhbG1lamFuZQogICAgICAgICAgICAjMjYzMSBDKysxNyBzdGQ6Om1hcCBmaXggZm9yIHZhbHVlcyB0aGF0IGFyZSBub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgogICAgICAgICAgICBFbmhhbmNlbWVudHMgZm9yIGFsbCB0YXJnZXQgbGFuZ3VhZ2VzIGV4Y2VwdCBQeXRob24gYW5kIFJ1YnkuCgoyMDIzLTA5LTE0OiBtbW9tdGNoZXYKICAgICAgICAgICAgIzI2NzUgIzI2NzYgVGVtcG9yYXJ5IHZhcmlhYmxlIHplcm8gaW5pdGlhbGlzYXRpb24gaW4gdGhlIHdyYXBwZXJzIGZvcgogICAgICAgICAgICBjb25zaXN0ZW5jeSB3aXRoIGhhbmRsaW5nIHBvaW50ZXJzLgoKMjAyMy0wOS0xMTogZW1tZW5sYXUKICAgICAgICAgICAgIzIzOTQgQWRkIHN1cHBvcnQgdG8gcHJlcHJvY2Vzc29yIGZvciB0cnVlIGFuZCBmYWxzZS4gTm90ZSB0aGF0IHRoaXMKICAgICAgICAgICAgaXMgZm9yIEMrKyBub3QgQy4KCjIwMjMtMDktMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSAjMjYwNSBDb21wbGV0ZSB0cmFuc2l0aW9uIHRvIHJ0eXBlY2hlY2sgdHlwZW1hcHMgZnJvbSBoYXJkIGNvZGVkCiAgICAgICAgICAgIGxvZ2ljLiBBbHNvIHNlZSBlbnRyeSBkYXRlZCAyMDIyLTEwLTI4IGZvciBzd2lnLTQuMS4xLiBUaGUgcnR5cGVjaGVjawogICAgICAgICAgICB0eXBlbWFwcyBpbXBsZW1lbnQgdHlwZWNoZWNraW5nIGluIFIgZm9yIGVhY2ggZnVuY3Rpb24gcGFyYW1ldGVyIHVzaW5nCiAgICAgICAgICAgIGZ1bmN0aW9ucyBzdWNoIGFzIGlzLm51bWVyaWMsIGlzLmNoYXJhY3RlciwgaXMubG9naWNhbCwgaXMubnVsbCBldGMuCgoyMDIzLTA5LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy85MTkvCgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IHZhcmlhYmxlIHNldHRlcnMgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gd3JhcHBpbmcgYXJyYXlzLgogICAgICAgICAgICBBIHNldHRlciBpcyBubyBsb25nZXIgZ2VuZXJhdGVkIGlmIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBtZW1iZXJzCiAgICAgICAgICAgIGFyZSBub24tYXNzaWduYWJsZS4KCjIwMjMtMDktMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIE5vbi1hc3NpZ25hYmxlIGRldGVjdGlvbiBmaXhlcyB3aGVuIHdyYXBwaW5nIGNvbnN0IG1lbWJlciB2YXJpYWJsZXMuCiAgICAgICAgICAgIENvbnN0IG1lbWJlciB2YXJpYWJsZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub24tYXNzaWduYWJsZSBieQogICAgICAgICAgICBieSBkZWZhdWx0OgoKICAgICAgICAgICAgICBjaGFyICogY29uc3QgeDsKICAgICAgICAgICAgICBjb25zdCBpbnQgeDsKICAgICAgICAgICAgICBjb25zdCBpbnQgeFsxXTsKCiAgICAgICAgICAgIGJ1dCBub3Q6CgogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiB4OwoKICAgICAgICAgICAgVmFyaWFibGUgc2V0dGVycyBhcmUgbm90IGdlbmVyYXRlZCB3aGVuIHdyYXBwaW5nIHRoZXNlIG5vbi1hc3NpZ25hYmxlCiAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgY2xhc3NlcyBjb250YWluaW5nIHN1Y2ggbm9uLWFzc2lnbmFibGUgdmFyaWFibGVzLgoKMjAyMy0wOS0wNzogd3NmdWx0b24KICAgICAgICAgICAgTm9uLWFzc2lnbmFibGUgZGV0ZWN0aW9uIGZpeGVzIHdoZW4gd3JhcHBpbmcgcnZhbHVlIHJlZmVyZW5jZSB2YXJpYWJsZXMuCiAgICAgICAgICAgIFJ2YWx1ZSByZWZlcmVuY2UgdmFyaWFibGVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBhcmUgbm9uLWFzc2lnbmFibGUgYnkKICAgICAgICAgICAgYnkgZGVmYXVsdDoKCiAgICAgICAgICAgICAgWCAmJnY7CgogICAgICAgICAgICBWYXJpYWJsZSBzZXR0ZXJzIGFyZSBub3QgZ2VuZXJhdGVkIHdoZW4gd3JhcHBpbmcgdGhlc2Ugbm9uLWFzc2lnbmFibGUKICAgICAgICAgICAgdmFyaWFibGVzIGFuZCBjbGFzc2VzIGNvbnRhaW5pbmcgc3VjaCBub24tYXNzaWduYWJsZSB2YXJpYWJsZXMuCgoyMDIzLTA5LTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBOb24tYXNzaWduYWJsZSBkZXRlY3Rpb24gZml4ZXMgd2hlbiB3cmFwcGluZyByZWZlcmVuY2UgdmFyaWFibGVzLgogICAgICAgICAgICBSZWZlcmVuY2UgdmFyaWFibGVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBhcmUgbm9uLWFzc2lnbmFibGUgYnkKICAgICAgICAgICAgYnkgZGVmYXVsdDoKCiAgICAgICAgICAgICAgaW50ICZ2OwoKICAgICAgICAgICAgVmFyaWFibGUgc2V0dGVycyBhcmUgbm90IGdlbmVyYXRlZCB3aGVuIHdyYXBwaW5nIHRoZXNlIG5vbi1hc3NpZ25hYmxlCiAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgY2xhc3NlcyBjb250YWluaW5nIHN1Y2ggbm9uLWFzc2lnbmFibGUgdmFyaWFibGVzLgoKMjAyMy0wOS0wNjogd3NmdWx0b24KICAgICAgICAgICAgQXNzaWdubWVudCBvcGVyYXRvciBkZXRlY3Rpb24gZml4ZXMgd2hlbiB3cmFwcGluZyBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgIHZhcmlhYmxlcy4KCjIwMjMtMDktMDY6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDE2IEltcGxpY2l0IGFzc2lnbm1lbnQgb3BlcmF0b3IgZGV0ZWN0aW9uIGZpeGVzLgoKICAgICAgICAgICAgQSBjbGFzcyB0aGF0IGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgYXNzaWdubWVudCBvcGVyYXRvciBkb2VzIG5vdAogICAgICAgICAgICBoYXZlIGFuIGltcGxpY2l0IGFzc2lnbm1lbnQgb3BlcmF0b3IgaWYgYSBtZW1iZXIgdmFyaWFibGUgaXMgbm90CiAgICAgICAgICAgIGFzc2lnbmFibGUuIFNpbWlsYXJseSBzaG91bGQgb25lIG9mIHRoZSBiYXNlIGNsYXNzZXMgYWxzbyBub3QgYmUKICAgICAgICAgICAgYXNzaWduYWJsZS4gRGV0ZWN0aW9uIG9mIHRoZXNlIHNjZW5hcmlvcyBoYXMgYmVlbiBmaXhlZCBzbyB0aGF0IHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgYSB2YXJpYWJsZSB0aGF0IGlzIG5vdCBhc3NpZ25hYmxlLCBhIHZhcmlhYmxlIHNldHRlciBpcyBub3QKICAgICAgICAgICAgZ2VuZXJhdGVkIGluIG9yZGVyIHRvIGF2b2lkIGEgY29tcGlsZXIgZXJyb3IuCgogICAgICAgICAgICBUZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHZpYSAldGVtcGxhdGUgaXMgcmVxdWlyZWQgaW4gb3JkZXIgZm9yIHRoaXMgdG8KICAgICAgICAgICAgd29yayBmb3IgdGVtcGxhdGVzIHRoYXQgYXJlIG5vdCBhc3NpZ25hYmxlLgoKMjAyMy0wOS0wMzogd3NmdWx0b24KICAgICAgICAgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTAwNi8KICAgICAgICAgICAgRml4IGluY29ycmVjdCB2YXJpYWJsZSBzZXR0ZXJzIGJlaW5nIGdlbmVyYXRlZCB3aGVuIHRoZSB0eXBlIG9mIHRoZQogICAgICAgICAgICB2YXJpYWJsZSBpcyBub3QgYXNzaWduYWJsZSwgZHVlIHRvIHZhcmlhYmxlIHR5cGUgaW5oZXJpdGluZyBhIHByaXZhdGUKICAgICAgICAgICAgYXNzaWdubWVudCBvcGVyYXRvciBmdXJ0aGVyIHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiAoZnVydGhlciB1cCB0aGFuCiAgICAgICAgICAgIHRoZSBpbW1lZGlhdGUgYmFzZSkuCgoyMDIzLTA5LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbR3VpbGUsIE9jYW1sLCBQZXJsXSBEb24ndCBhdHRlbXB0IHRvIGdlbmVyYXRlIGEgc2V0dGVyIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgdmFyaWFibGVzIHdoaWNoIGhhdmUgYSBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3IgYXMgYXNzaWdubWVudCBpcyBub3QKICAgICAgICAgICAgcG9zc2libGUuIFRoaXMgbm93IG1hdGNoZXMgdGhlIGJlaGF2aW91ciBvZiBhbGwgdGhlIG90aGVyIHRhcmdldCBsYW5ndWFnZXMuCgoyMDIzLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcHJvYmxlbXMgd3JhcHBpbmcgZGVsZXRlZCBkZXN0cnVjdG9ycy4gRGVyaXZlZCBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29uc3RydWN0aWJsZSwgc28gZG9uJ3QgYXR0ZW1wdCB0byBnZW5lcmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9yCiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3Igd3JhcHBlcnMuCgogICAgICAgICAgICAgIHN0cnVjdCBTdGFja09ubHkxIHsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc3RydWN0aWJsZSBvbiB0aGUgc3RhY2sKICAgICAgICAgICAgICAgIH5TdGFja09ubHkxKCkgPSBkZWxldGU7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBzdHJ1Y3QgU3RhY2tPbmx5RGVyaXZlZDEgOiBTdGFja09ubHkxIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2xhc3MgaXMgbm90IGNvbnN0cnVjdGlibGUgZHVlIHRvIGRlbGV0ZWQgYmFzZSBkZXN0cnVjdG9yCiAgICAgICAgICAgICAgfTsKCjIwMjMtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlY29weWN0b3IgZmVhdHVyZSB3aGVuIHVzZWQgb24gY2xhc3NlcyB3aXRoIGRlbGV0ZWQgY29weSBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIEEgZGVmYXVsdCBjb25zdHJ1Y3RvciB3cmFwcGVyIHdhcyBzb21ldGltZXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkLgoKMjAyMy0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgIzE2NDQgRml4IHdyYXBwaW5nIHR5cGVzIHBhc3NlZCBieSB2YWx1ZSB3aGVyZSB0aGUgdHlwZSBoYXMgYSBkZWxldGVkCiAgICAgICAgICAgIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDIzLTA4LTE2OiBzaGFkY2hpbgogICAgICAgICAgICBbUHl0aG9uXSAjMjY2NSBGaXggbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgd2FybmluZyB0byBwcm92aWRlIHN1cHBvcnQKICAgICAgICAgICAgZm9yIHB5dGhvbi0zLjEyLgoKMjAyMy0wOC0wOTogb2xseQoJICAgIFtSdWJ5XSBSZW1vdmUgLWZlYXR1cmUgY29tbWFuZCBsaW5lIG9wdGlvbiB3aGljaCBoYXMgYmVlbgoJICAgIGRlcHJlY2F0ZWQgc2luY2UgU1dJRyAxLjMuMzIgaW4gMjAwNy4gIFVzZSAtaW5pdG5hbWUgaW5zdGVhZC4KCjIwMjMtMDgtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciB1c2luZyBkZWNsYXJhdGlvbnMgdG8gaW50cm9kdWNlIHRlbXBsYXRlZCBtZW1iZXIKICAgICAgICAgICAgbWV0aG9kcyBhbmQgZm9yIGluaGVyaXRpbmcgdGVtcGxhdGVkIGNvbnN0cnVjdG9ycywgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgLy8gdGVtcGxhdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQmFzZShjb25zdCBUICZ0LCBjb25zdCBjaGFyICpzKSB7fQogICAgICAgICAgICAgICAgLy8gdGVtcGxhdGVkIG1lbWJlciBtZXRob2QKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHRlbXBsYXRlX21ldGhvZChjb25zdCBUICZ0LCBjb25zdCBjaGFyICpzKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShCYXNlKSBCYXNlOjpCYXNlPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHRlbXBsYXRlX21ldGhvZCkgQmFzZTo6dGVtcGxhdGVfbWV0aG9kPGRvdWJsZT47CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICB1c2luZyBCYXNlOjpCYXNlOwogICAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6dGVtcGxhdGVfbWV0aG9kOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSB0ZW1wbGF0ZWQgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIHdlcmUgaWdub3JlZCBhbmQKICAgICAgICAgICAgbm90IGludHJvZHVjZWQgaW50byB0aGUgRGVyaXZlZCBjbGFzcy4KCjIwMjMtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgZm9yIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIG1vcmUgdGhhbgogICAgICAgICAgICB0d28gZGVlcCBhbmQgdGhlIHVzaW5nIGRlY2xhcmF0aW9ucyBhcmUgb3ZlcmxvYWRlZC4gVXNpbmcgZGVjbGFyYXRpb25zCiAgICAgICAgICAgIGZyb20gYSBiYXNlIGNsYXNzJyBiYXNlIHdlcmUgbm90IGF2YWlsYWJsZSBmb3IgdXNlIGluIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UuIEZvciBleGFtcGxlIGluIHRoZSBjb2RlIGJlbG93LCBVc2luZzE6OnVzaW5nbWV0aG9kKGludCBpKQogICAgICAgICAgICB3YXMgbm90IHdyYXBwZWQgZm9yIHVzZSBpbiBVc2luZzM6CgogICAgICAgICAgICAgIHN0cnVjdCBVc2luZzEgewogICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgdXNpbmdtZXRob2QoaW50IGkpIHt9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBzdHJ1Y3QgVXNpbmcyIDogVXNpbmcxIHsKICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICB2b2lkIHVzaW5nbWV0aG9kKGludCBpLCBpbnQgaikge30KICAgICAgICAgICAgICAgIHVzaW5nIFVzaW5nMTo6dXNpbmdtZXRob2Q7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBzdHJ1Y3QgVXNpbmczIDogVXNpbmcyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNpbmdtZXRob2QoaW50IGksIGludCBqLCBpbnQgaykge30KICAgICAgICAgICAgICAgIHVzaW5nIFVzaW5nMjo6dXNpbmdtZXRob2Q7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgQysrMTEgdXNpbmcgZGVjbGFyYXRpb25zIGZvciBpbmhlcml0aW5nIGNvbnN0cnVjdG9ycy4KCjIwMjMtMDgtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzkzMi8KICAgICAgICAgICAgRml4IG1pc3NpbmcgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiBkdWUgdG8gYWJzdHJhY3QgY2xhc3MgdGVzdAogICAgICAgICAgICBmYWlsdXJlIHdoZW4gYSBtZXRob2QgaXMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIGFsb25nIHdpdGggYQogICAgICAgICAgICB1c2luZyBkZWNsYXJhdGlvbiBhbmQgdGhlIHVzaW5nIGRlY2xhcmF0aW9uIGlzIGRlY2xhcmVkIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIHRoYXQgaW1wbGVtZW50ZWQgdGhlIHB1cmUgdmlydHVhbCBtZXRob2QsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBDb25jcmV0ZURlcml2ZWQgOiBBYnN0cmFjdEJhc2UgewogICAgICAgICAgICAgICAgQ29uY3JldGVEZXJpdmVkKCkge30gLy8gd2FzIG5vdCB3cmFwcGVkCiAgICAgICAgICAgICAgICB1c2luZyBBYnN0cmFjdEJhc2U6OmY7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZihpbnQgbikgb3ZlcnJpZGUge30KICAgICAgICAgICAgICB9OwoKMjAyMy0wOC0wMjogb2xseQoJICAgIFtQSFBdIEltcGxlbWVudCBvdmVybG9hZGluZyBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlZ2VyIHR5cGVzIGFuZAoJICAgIGJldHdlZW4gZG91YmxlIGFuZCBmbG9hdC4KCjIwMjMtMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzY3OC8KICAgICAgICAgICAgRml4ICVjb3B5Y3RvciB1c2VkIG9uIGNsYXNzIGhpZXJhcmNoaWVzIHdpdGggbm9uLWNvbnN0IGNvcHkKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBQcmV2aW91c2x5IFNXSUcgYWx3YXlzIGF0dGVtcHRlZCB0byBjYWxsIGEgY29weQogICAgICAgICAgICBjb25zdHJ1Y3RvciB0YWtpbmcgYSBjb25zdCByZWZlcmVuY2UgcGFyYW1ldGVyIGluc3RlYWQgb2YgYQogICAgICAgICAgICBub24tY29uc3QgcmVmZXJlbmNlIHBhcmFtZXRlci4KCjIwMjMtMDctMjg6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNTQxIEZpeCBvdmVybG9hZGluZyBvZiB0ZW1wbGF0ZWQgY29uc3RydWN0b3JzIGFuZCAlY29weWN0b3IuCgoyMDIzLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBhIGRlZmF1bHQgY29uc3RydWN0b3Igd3JhcHBlciB3aGVuIGEgY2xhc3MgaGFzIGEKICAgICAgICAgICAgdGVtcGxhdGVkIGNvbnN0cnVjdG9yLCBhcyB0aGVyZSBpc24ndCBhY3R1YWxseSBhbiBpbXBsaWVkIGRlZmF1bHQKICAgICAgICAgICAgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVENvbnN0cnVjdG9yMyB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUQ29uc3RydWN0b3IzKFQgdmFsKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5IHdyYXBwZXJzIHdlcmUgZ2VuZXJhdGVkIGZvciBhIG5vbi1leGlzdGVudCBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yIHdoaWNoIGZhaWxlZCB0byBjb21waWxlLgoKMjAyMy0wNy0xNTogd3NmdWx0b24KICAgICAgICAgICAgQysrMTEgdXNpbmcgZGVjbGFyYXRpb25zIGZvciBpbmhlcml0aW5nIGNvbnN0cnVjdG9ycyBoYXMgbm93IGJlZW4KICAgICAgICAgICAgZXh0ZW5kZWQgdG8gc3VwcG9ydCB0aGUgZGlyZWN0b3JzIGZlYXR1cmUuCgoyMDIzLTA3LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSB1c2luZyBkZWNsYXJhdGlvbnMgZm9yIGluaGVyaXRpbmcgY29uc3RydWN0b3JzIHN1cHBvcnQgbm93CiAgICAgICAgICAgIGFsc28gaW5jbHVkZXMgaW5oZXJpdGluZyBpbXBsaWNpdGx5IGRlZmluZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgZnJvbSB0aGUgYmFzZSBjbGFzcy4KCjIwMjMtMDctMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNjQxIEFkZCBzdXBwb3J0IGZvciBDKysxMSB1c2luZyBkZWNsYXJhdGlvbnMgZm9yIGluaGVyaXRpbmcKICAgICAgICAgICAgY29uc3RydWN0b3JzLgoKMjAyMy0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgIzI2NDAgRml4IHN5bnRheCBlcnJvciBwYXJzaW5nIGFuIGV4cHJlc3Npb24gd2hpY2ggY2FsbHMgYSBmdW5jdGlvbgogICAgICAgICAgICB3aXRoIG5vIHBhcmFtZXRlcnMgd2l0aGluIGFkZGl0aW9uYWwgYnJhY2tldHMuCgoyMDIzLTA2LTI3OiBtbW9tdGNoZXYKICAgICAgICAgICAgW0phdmFzY3JpcHRdICMyNTQ1IE5ldyBKYXZhc2NyaXB0IGdlbmVyYXRvciB0YXJnZXRpbmcgdGhlIE5vZGUuanMKICAgICAgICAgICAgYmluYXJ5IHN0YWJsZSBBQkkgTm9kZS1BUEkuCgoyMDIzLTA2LTI3OiBvbGx5CgkgICAgW0phdmFdIENvbXBsZXRlbHkgcmVtb3ZlIHByYWdtYXMgd2hpY2ggd2VyZSBkZXByZWNhdGVkIGluIDIwMDIgYW5kCgkgICAgaGF2ZSB0cmlnZ2VyZWQgYW4gZXJyb3Igc2luY2UgU1dJRyAyLjA6CgoJICAgIG1vZHVsZWltcG9ydAkJVXNlIHRoZSBtb2R1bGVpbXBvcnRzIHByYWdtYQoJICAgIG1vZHVsZWludGVyZmFjZQkJVXNlIHRoZSBtb2R1bGVpbnRlcmZhY2VzIHByYWdtYQoJICAgIG1vZHVsZW1ldGhvZG1vZGlmaWVycwlVc2UgJWphdmFtZXRob2Rtb2RpZmllcnMKCSAgICBhbGxzaGFkb3dpbXBvcnQJCVVzZSAldHlwZW1hcChqYXZhaW1wb3J0cykKCSAgICBhbGxzaGFkb3djb2RlCQlVc2UgJXR5cGVtYXAoamF2YWNvZGUpCgkgICAgYWxsc2hhZG93YmFzZQkJVXNlICV0eXBlbWFwKGphdmFiYXNlKQoJICAgIGFsbHNoYWRvd2ludGVyZmFjZQkJVXNlICV0eXBlbWFwKGphdmFpbnRlcmZhY2VzKQoJICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCVVzZSAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpCgkgICAgc2hhZG93Y29kZQkJCVVzZSAldHlwZW1hcChqYXZhY29kZSkKCSAgICBzaGFkb3dpbXBvcnQJCVVzZSAldHlwZW1hcChqYXZhaW1wb3J0cykKCSAgICBzaGFkb3diYXNlCQkJVXNlICV0eXBlbWFwKGphdmFiYXNlKQoJICAgIHNoYWRvd2ludGVyZmFjZQkJVXNlICV0eXBlbWFwKGphdmFpbnRlcmZhY2VzKQoJICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCVVzZSAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpCgoyMDIzLTA2LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjYxNiBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMTAyLyBGaXggZGlyZWN0b3JzIGFuZAogICAgICAgICAgICBhbGxwcm90ZWN0ZWQgbW9kZSBhbmQgdXNpbmcgZGVjbGFyYXRpb25zLiBQcmV2aW91c2x5IFNXSUcgZWl0aGVyCiAgICAgICAgICAgIHNlZyBmYXVsdGVkIG9yIGdlbmVyYXRlZCBjb2RlIHRoYXQgZGlkIG5vdCBjb21waWxlLgoKMjAyMy0wNi0yMDogb2xseQoJICAgICMyNDg2IEZpeCBoYW5kbGluZyBvZiB0ZW1wbGF0ZSBpbiBhcnJheSBzaXplLCB3aGljaCB3YXMgYmVpbmcKCSAgICByZWplY3RlZCBieSBTV0lHIGJlY2F1c2UgdGhlIHR5cGUgc3RyaW5nIGNvbnRhaW5zICc8JyBub3QgZm9sbG93ZWQKCSAgICBieSAnKCcuICBEcm9wIHRoaXMgY2hlY2sgYXMgaXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IG5vdyBzaW5jZSB0aGUKCSAgICBmaXhlcyB0aGF0IGVuc3VyZSB0aGF0IHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGVuY2xvc2VkIHdpdGhpbgoJICAgICc8KCcgYW5kICcpPicuCgoyMDIzLTA2LTE2OiBvbGx5CgkgICAgW0phdmFdIFJlbW92ZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb25zIHdoaWNoIGhhdmUgZG9uZQoJICAgIG5vdGhpbmcgZXhjZXB0IGVtaXQgYSBkZXByZWNhdGlvbiBtZXNzYWdlIHNpbmNlIDIwMDIgb3IgYmVmb3JlOgoKCSAgICAtam5pYyAvIC1qbmljcHAJSk5JIGNhbGxpbmcgY29udmVudGlvbiBub3cgYXV0b21hdGljLgoJICAgIC1ub2ZpbmFsaXplCQlVc2UgamF2YWZpbmFsaXplIHR5cGVtYXAgaW5zdGVhZC4KCSAgICAtcHJveHkgLyAtc2hhZG93CU5vdyBvbiBieSBkZWZhdWx0LgoKMjAyMy0wNi0xNjogb2xseQoJICAgIFtHdWlsZV0gRHJvcCBzdXBwb3J0IGZvciAtTGlua2FnZSBsdGRsbW9kIHdoaWNoIHdhcyBvbmx5IHVzZWZ1bAoJICAgIGZvciBHdWlsZSA8PSAxLjQgd2hpY2ggd2Ugbm8gbG9uZ2VyIHN1cHBvcnQuCgoyMDIzLTA2LTE1OiBvbGx5CgkgICAgW0d1aWxlXSBUaGUgLWdoIGFuZCAtc2NtIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgYmVlbiByZW1vdmVkLgoJICAgIFRoZXNlIGhhdmUgZG9uZSBub3RoaW5nIGV4Y2VwdCBlbWl0IGEgbWVzc2FnZSBzaW5jZSAyMDEzIHdoZW4KCSAgICBTV0lHIGRyb3BwZWQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBiaW5kaW5ncyB3aGljaCB1c2VkIEdILgoKMjAyMy0wNi0xNTogb2xseQoJICAgIFJlbW92ZSBwb2ludGVyLmkgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5LiAgSXQncyBiZWVuIGEgZHVtbXkgZmlsZQoJICAgIHdoaWNoIGhhcyBkb25lIG5vdGhpbmcgZXhjZXB0ICVlY2hvIGEgZGVwcmVjYXRpb24gbWVzc2FnZSBzaW5jZQoJICAgIDIwMDIuICBUaGUgcmVwbGFjZW1lbnQgaXMgY3BvaW50ZXIuaS4KCjIwMjMtMDYtMTU6IG9sbHkKCSAgICBTV0lHIHdpbGwgbm8gbG9uZ2VyIGZhbGwgYmFjayB0byB1c2luZyB0aGUgaW5jbHVkZSBwYXRoIHRvIGZpbmQgdGhlCgkgICAgaW5wdXQgZmlsZSwgd2hpY2ggaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgZW1pdHRlZCBhIHdhcm5pbmcgc2luY2UKCSAgICBTV0lHIDEuMy4zNyAoMjAwOS0wMS0xMykuICBUaGlzIG1ha2VzIHRoZSBiZWhhdmlvdXIgb2YgU1dJRyB0aGUKCSAgICBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBhbmQgd29ya3Mgd2l0aCBjY2FjaGUuCgoyMDIzLTA2LTE1OiBvbGx5CgkgICAgUmVtb3ZlIGZlYXR1cmVzIGRlcHJlY2F0ZWQgaW4gU1dJRyAxLnggYW5kIDIueC4gIE1vc3Qgb2YgdGhlc2UgaGF2ZQoJICAgIGVtaXR0ZWQgYSBkZXByZWNhdGlvbiB3YXJuaW5nIG9yIGVycm9yIGZvciB3ZWxsIG92ZXIgYSBkZWNhZGUgYW5kCgkgICAgaGF2ZSByZXBsYWNlbWVudHMgd2l0aCBmZXdlciBzaG9ydGNvbWluZ3Mgc28gd2UgZXhwZWN0IHVzZXJzIHdpbGwKCSAgICBoYXZlIG1pZ3JhdGVkIGF3YXkgZnJvbSB0aGVtIGxvbmcgYWdvLCBidXQgaW4gY2FzZSB5b3UgbmVlZAoJICAgIHRoZW0gcmVwbGFjZW1lbnRzIGFyZSBub3RlZCBiZWxvdzoKCgkgICAgJWFkZG1ldGhvZHMJCVVzZSAlZXh0ZW5kIGluc3RlYWQuCgkgICAgJWF0dHJpYnV0ZV9yZWYgICAgICBVc2UgJWF0dHJpYnV0ZXJlZiBpbnN0ZWFkIChOQjogSWYgY2FsbGVkIHdpdGgKCQkJCTQgcGFyYW1ldGVycywgdGhlIDNyZCBhbmQgNHRoIG5lZWQgc3dpdGNoaW5nKS4KCSAgICAlZGlzYWJsZWRvYwkJVXNlIERveHlnZW4gc3VwcG9ydCBpbnN0ZWFkLgoJICAgICVkb2Nvbmx5CQlVc2UgRG94eWdlbiBzdXBwb3J0IGluc3RlYWQuCgkgICAgJWVuYWJsZWRvYwkJVXNlIERveHlnZW4gc3VwcG9ydCBpbnN0ZWFkLgoJICAgICVleGNlcHQJCVVzZSAlZXhjZXB0aW9uIGluc3RlYWQuCgkgICAgJWV4dGVybgkJVXNlICVpbXBvcnQgaW5zdGVhZC4KCSAgICAlbG9jYWxzdHlsZQkJVXNlIERveHlnZW4gc3VwcG9ydCBpbnN0ZWFkLgoJICAgICVuYW1lCQlVc2UgJXJlbmFtZSBpbnN0ZWFkLgoJICAgICVuZXcJCVVzZSAlbmV3b2JqZWN0IGluc3RlYWQuCgkgICAgJW91dAkJJWFwcGx5IE9VVFBVVCB0eXBlbWFwIHJ1bGUgaW5zdGVhZC4KCSAgICAlcmVhZG9ubHkJCVVzZSAlaW1tdXRhYmxlIGluc3RlYWQuCgkgICAgJXJlYWR3cml0ZQkJVXNlICVtdXRhYmxlIGluc3RlYWQuCgkgICAgJXNlY3Rpb24JCVVzZSBEb3h5Z2VuIHN1cHBvcnQgaW5zdGVhZC4KCSAgICAlc3R5bGUJCVVzZSBEb3h5Z2VuIHN1cHBvcnQgaW5zdGVhZC4KCSAgICAlc3Vic2VjdGlvbgkJVXNlIERveHlnZW4gc3VwcG9ydCBpbnN0ZWFkLgoJICAgICVzdWJzdWJzZWN0aW9uCVVzZSBEb3h5Z2VuIHN1cHBvcnQgaW5zdGVhZC4KCSAgICAldGV4dAkJVXNlIERveHlnZW4gc3VwcG9ydCBpbnN0ZWFkLgoJICAgICV0aXRsZQkJVXNlIERveHlnZW4gc3VwcG9ydCBpbnN0ZWFkLgoJICAgICV0eXBlbWFwKGV4Y2VwdCkJVXNlICVleGNlcHRpb24gaW5zdGVhZC4KCSAgICAldHlwZW1hcChpZ25vcmUpCVVzZSAldHlwZW1hcChpbixudW1pbnB1dHM9MCkgaW5zdGVhZC4KCSAgICAldmFsCQlVc2UgdHlwZW1hcHMgaW5zdGVhZC4KCSAgICAtZGVidWdfdGVtcGxhdGUJVXNlIC1kZWJ1Zy10ZW1wbGF0ZSBpbnN0ZWFkLgoJICAgIC1kZWJ1Z190eXBlbWFwCVVzZSAtZGVidWctdHlwZW1hcCBpbnN0ZWFkLgoJICAgIC1kdW1wX2NsYXNzZXMJVXNlIC1kZWJ1Zy1jbGFzc2VzIGluc3RlYWQuCgkgICAgLWR1bXBfbWVtb3J5CVVzZSAtZGVidWctbWVtb3J5IGluc3RlYWQuCgkgICAgLWR1bXBfbW9kdWxlCVVzZSAtZGVidWctbW9kdWxlIDQgaW5zdGVhZC4KCSAgICAtZHVtcF9wYXJzZV9tb2R1bGUJVXNlIC1kZWJ1Zy1tb2R1bGUgMSBpbnN0ZWFkLgoJICAgIC1kdW1wX3BhcnNlX3RvcAlVc2UgLWRlYnVnLXRvcCAxIGluc3RlYWQuCgkgICAgLWR1bXBfdGFncwkJVXNlIC1kZWJ1Zy10YWdzIGluc3RlYWQuCgkgICAgLWR1bXBfdG9wCQlVc2UgLWRlYnVnLXRvcCA0IGluc3RlYWQuCgkgICAgLWR1bXBfdHJlZQkJVXNlIC1kZWJ1Zy10b3AgNCBpbnN0ZWFkLgoJICAgIC1kdW1wX3R5cGVkZWYJVXNlIC1kZWJ1Zy10eXBlZGVmIGluc3RlYWQuCgkgICAgLWR1bXBfeG1sCQlVc2UgLXhtbG91dCAvZGV2L3N0ZG91dCBpbnN0ZWFkLgoJICAgIC1tYWtlX2RlZmF1bHQJT24gYnkgZGVmYXVsdCBzaW5jZSBTV0lHIDEuMy43ICgyMDAxLTA5LTAzKS4KCSAgICAtbWFrZWRlZmF1bHQJT24gYnkgZGVmYXVsdCBzaW5jZSBTV0lHIDEuMy43ICgyMDAxLTA5LTAzKS4KCSAgICAtbm9fZGVmYXVsdAkJVXNlICVub2RlZmF1bHRjdG9yLyVub2RlZGVmYXVsdGR0b3IgaW5zdGVhZC4KCSAgICAtbm9kZWZhdWx0CQlVc2UgJW5vZGVmYXVsdGN0b3IvJW5vZGVkZWZhdWx0ZHRvciBpbnN0ZWFkLgoJICAgIC1ub2V4dGVybiBvcHRpb24JT24gYnkgZGVmYXVsdCBzaW5jZSBTV0lHIDEuMy4yNiAoMjAwNS0xMC0wOSkuCgkgICAgLW5vcnVudGltZQkJVHlwZSBzaGFyaW5nIGhhcHBlbnMgdmlhIHRhcmdldCBsYW5nIGdsb2JhbC4KCSAgICAtcnVudGltZQkJVHlwZSBzaGFyaW5nIGhhcHBlbnMgdmlhIHRhcmdldCBsYW5nIGdsb2JhbC4KCSAgICAtc2hvd190ZW1wbGF0ZXMJVXNlIC1kZWJ1Zy10ZW1wbGF0ZSBpbnN0ZWFkLgoJICAgIC10bV9kZWJ1ZwkJVXNlIC1kZWJ1Zy10eXBlbWFwIGluc3RlYWQuCgkgICAgLXhtbCBvdXQueG1sCVVzZSAteG1sIC1vIG91dC54bWwgaW5zdGVhZC4KCSAgICBCT1RIIHR5cGVtYXAgcnVsZQlVc2UgSU5PVVQgdHlwZW1hcCBydWxlIGluc3RlYWQuCgkgICAgU1dJR19JTlRSVVNJVkVfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCgkJCQlVc2UgJWludHJ1c2l2ZV9wdHIoVFlQRSkgaW5zdGVhZC4KCSAgICBTV0lHX0lOVFJVU0lWRV9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoJCQkJVXNlICVpbnRydXNpdmVfcHRyKFRZUEUpIGluc3RlYWQuCgkgICAgU1dJR19JTlRSVVNJVkVfUFRSX05PX1dSQVAoUFJPWFlDTEFTUywgVFlQRSkKCQkJCVVzZSAlaW50cnVzaXZlX3B0cl9ub193cmFwKFRZUEUpIGluc3RlYWQuCgkgICAgU1dJR19JTlRSVVNJVkVfUFRSX0RFUklWRURfTk9fV1JBUChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoJCQkJVXNlICVpbnRydXNpdmVfcHRyX25vX3dyYXAoVFlQRSkgaW5zdGVhZC4KCSAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKCQkJCVVzZSAlc2hhcmVkX3B0cihUWVBFKSBpbnN0ZWFkLgoJICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUuLi4pCgkJCQlVc2UgJXNoYXJlZF9wdHIoVFlQRSkgaW5zdGVhZC4KCSAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRShDU1RZUEUsIENUWVBFKQoJCQkJVXNlIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChDVFlQRSkgaW5zdGVhZC4KCSAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCgkJCQlObyBsb25nZXIgcmVxdWlyZWQgLSByZW1vdmUgdXNlcy4KCSAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoJCQkJTm8gbG9uZ2VyIHJlcXVpcmVkIC0gcmVtb3ZlIHVzZXMuCgkgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2tleQoJCQkJTm8gbG9uZ2VyIHJlcXVpcmVkIC0gcmVtb3ZlIHVzZXMuCgkgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX3ZhbHVlCgkJCQlObyBsb25nZXIgcmVxdWlyZWQgLSByZW1vdmUgdXNlcy4KCjIwMjMtMDYtMTU6IG9sbHkKCSAgICBbR3VpbGVdIEZpeCBmcmVlYXJnIHR5cGVtYXBzIHRvIGdvIHdpdGggY2hhciAqKklOT1VUIGFuZCBjaGFyCgkgICAgKklOT1VUIGluIHR5cGVtYXBzLiAgUHJldmlvdXNseSB0aGUgY2hhciAqKklOT1VUIHR5cGVtYXAgd291bGQKCSAgICBsZWFrIG1lbW9yeSBpZiBtdXN0X2ZyZWUkYXJnbnVtIHdhcyB0cnVlLCBhbmQgdGhlIGNoYXIgKklOT1VUCgkgICAgdHlwZW1hcCB3b3VsZCBnZW5lcmF0ZSBjb2RlIHRoYXQgZGlkbid0IGNvbXBpbGUuCgoyMDIzLTA2LTA3OiBvbGx5CgkgICAgIzI2MzAgRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBhIHNsYXNoIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5CgkgICAgYSBzaW5nbGUgcXVvdGUsIHdoaWNoIHdhc24ndCBnZXR0aW5nIHJlY29nbmlzZWQgYXMgc3RhcnRpbmcgYQoJICAgIGNoYXJhY3RlciBsaXRlcmFsLgoKMjAyMy0wNi0wNzogb2xseQoJICAgICMyNjMwIEZpeCBwYXJzaW5nIG9mIDw9IGFuZCA+PSBpbiB0ZW1wbGF0ZWQgbGFtYmRhLgoKCSAgICBTa2lwcGluZyBiZXR3ZWVuIG1hdGNoaW5nIGRlbGltaXRlcnMgaXMgbm93IGRvbmUgYXQgdGhlIHRva2VuIGxldmVsCgkgICAgcmF0aGVyIHRoYW4gdGhlIGNoYXJhY3RlciBsZXZlbC4KCjIwMjMtMDYtMDI6IG1tb210Y2hldgoJICAgIFtKYXZhc2NyaXB0XSAjMjYyMiBGaXggc3VwcG9ydCBmb3IgJXR5cGVtYXAoZGVmYXVsdCkgYW5kIGltcHJvdmUKCSAgICBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBpbiBnZW5lcmFsLgoKMjAyMy0wNi0wMTogb2xseQoJICAgIFtQZXJsXSAjMjQ3MCBGaXggc29tZSBpbnRlZ2VyIHRydW5jYXRpb24gd2FybmluZ3MgaW4gZ2VuZXJhdGVkCgkgICAgd3JhcHBlcnMuCgoyMDIzLTA1LTMwOiBvbGx5CgkgICAgW0x1YV0gRml4IGJ1ZyB3aGVuIHBhc3NpbmcgYSBMdWEgbnVtYmVyIHRvIGEgQysrIGZ1bmN0aW9uIGV4cGVjdGVkCgkgICAgc3RkOjpzdHJpbmcuICBPcmRlciBvZiBldmFsdWF0aW9uIG9mIEMrKyBmdW5jdGlvbiBhcmd1bWVudHMgaXMgbm90CgkgICAgZGVmaW5lZCwgYW5kIGlmIGx1YV9yYXdsZW4oKSB3YXMgY2FsbGVkIGJlZm9yZSBsdWFfdG9zdHJpbmcoKSB0aGVuCgkgICAgaXQgd291bGQgcmV0dXJuIDAgKGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBzdGlsbCBhIG51bWJlcikgYW5kIGFuCgkgICAgZW1wdHkgc3RyaW5nIHdvdWxkIGJlIHBhc3NlZC4KCjIwMjMtMDUtMzA6IG1tb210Y2hldgoJICAgIFtKYXZhc2NyaXB0XSAjMjYxOCBGaXggaGFuZGxpbmcgb2YgQysrIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uLgoKMjAyMy0wNS0yNTogb2xseQoJICAgICMxMDMyIEFsbG93IHR5cGVuYW1lIGRpc2FtYmlndWF0b3IgaW46CgoJICAgIHVzaW5nIHR5cGVuYW1lIE5vZGVUOjpsaW5rc190eXBlOwoKMjAyMy0wNS0yNTogb2xseQoJICAgIFNXSUcgbm93IGRpc2NyaW1pbmF0ZXMgYmV0d2VlbiBsb25nIGRvdWJsZSwgZG91YmxlIGFuZCBmbG9hdAoJICAgIGNvbnN0YW50cy4gIEZvciBleGFtcGxlLCB0aGlzIG1lYW5zIHRoYXQgZm9yIHRhcmdldCBsYW5ndWFnZXMgd2hpY2gKCSAgICBzdXBwb3J0IGEgc2VwYXJhdGUgZmxvYXQgdHlwZSAoc3VjaCBhcyBDIyBhbmQgRCkgdGhpcyB3aWxsIG5vdwoJICAgIGNyZWF0ZSBhIGZsb2F0IGNvbnN0YW50IGluc3RlYWQgb2YgYSBkb3VibGUgY29uc3RhbnQgaW4gdGhlIHRhcmdldAoJICAgIGxhbmd1YWdlOgoKCSAgICAjZGVmaW5lIFBJX0lTSCAzLjE0MTRmCgoyMDIzLTA1LTI1OiBvbGx5CgkgICAgQysrMTEgYGF1dG9gIHZhcmlhYmxlcyBhbmQgYGRlY2x0eXBlKClgIGNhbiBub3cgZGVkdWNlIHRoZQoJICAgIHR5cGUgb2Ygc29tZSBleHByZXNzaW9ucyB3aGljaCBpbnZvbHZlIGxpdGVyYWxzIG9mIGJ1aWx0LWluIHR5cGVzLgoKMjAyMy0wNS0yNTogb2xseQoJICAgICMxMTI1IFN1cHBvcnQgcGFyc2luZyBDKysxMSBhdXRvIHZhcmlhYmxlcy4gIFRoaXMgdXNlcyB0aGUKCSAgICBleGlzdGluZyB0eXBlIGRlZHVjdGlvbiBjb2RlIGZyb20gZGVjbHR5cGUgc28gaGFzIHRoZSBzYW1lCgkgICAgbGltaXRhdGlvbnMsIGFuZCBzdWNoIHZhcmlhYmxlcyB3aWxsIG9ubHkgYWN0dWFsbHkgYmUgd3JhcHBlZAoJICAgIHdoZW4gU1dJRyBjYW4gZGVkdWNlIHRoZSB0eXBlLgoKMjAyMy0wNS0yMzogb2xseQoJICAgIFtSdWJ5XSBGaXggZGVwcmVjYXRpb24gd2FybmluZ3MgYWJvdXQgQU5ZQVJHUyB3aGVuIGNvbXBpbGluZwoJICAgIEMrKyBjb2RlIGZvciBTV0lHLWdlbmVyYXRlZCBSdWJ5IHdyYXBwZXJzIHdpdGggUnVieSAzLnguCgoJICAgIFRoaXMgaXMgYSByZWN1cnJlbmNlIG9mIGEgcHJvYmxlbSBmaXhlZCBpbiA0LjAuMi4gIE91ciBmaXggd2FzCgkgICAgY29uZGl0aW9uYWwgb24gUkJfTUVUSE9EX0RFRklOSVRJT05fREVDTCBiZWluZyBkZWZpbmVkLCBidXQgUnVieQoJICAgIDMuMCBzdG9wcGVkIGRlZmluaW5nIHRoaXMuCgoyMDIzLTA1LTIzOiBvbGx5CgkgICAgIzI2MDYgSW1wcm92ZSBlcnJvciBvdXRwdXQgd2hlbiBTV0lHIHJlYWNoZXMgRU9GIHdoaWxlIGxvb2tpbmcgZm9yCgkgICAgYSBjbG9zaW5nIGRlbGltaXRlci4gIFRoaXMgaXMgcmVwb3J0ZWQgd2l0aCBhbiBlcnJvciBsaWtlOgoKCSAgICBFcnJvcjogTWlzc2luZyAnfScuIFJlYWNoZWQgZW5kIG9mIGlucHV0LgoKCSAgICBXZSBub3cgZXhpdCBhZnRlciByZXBvcnRpbmcgdGhpcyBhbmQgc28gbm8gbG9uZ2VyIHJlcG9ydCBhIHNlY29uZAoJICAgIG1vcmUgZ2VuZXJpYyBlcnJvciBsaWtlOgoKCSAgICBFcnJvcjogU3ludGF4IGVycm9yIGluIGlucHV0KDEpLgoKMjAyMy0wNS0yMjogbW1vbXRjaGV2CgkgICAgW0phdmFzY3JpcHRdICMyNjAwIEltcHJvdmUgdGVzdCBjb3ZlcmFnZSBieSBhZGRpbmcgX3J1bm1lLmpzIGZpbGVzCgkgICAgZm9yIDIyIHRlc3QgY2FzZXMuCgoyMDIzLTA1LTIwOiBlcmV6Z2V2YQoJICAgIFtDIywgRCwgSmF2YSwgSmF2YXNjcmlwdCwgR3VpbGUsIFNjaWxhYl0gIzI1NTIgSW1wbGVtZW50IGFyZ2Nhcmd2LmkKICAgICAgICAgICAgbGlicmFyeSBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjIwMjMtMDUtMjA6IGVyZXpnZXZhCgkgICAgW0RdICM1NiAjMjUzOCAjMjU3MCBUaGUgZ2VuZXJhdGVkIGNvZGUgbm93IHdvcmtzIHdpdGggcmVjZW50IEQgcmVsZWFzZXM6CiAgICAgICAgICAgIGFkZHMgb3ZlcnJpZGUga2V5d29yZCBvbiBvdmVycmlkZGVuIG1ldGhvZHMuCgogICAgICAgICAgICBTdXBwb3J0IGlzIG5vdyB3b3JraW5nIHVzaW5nIERNRCwgZ2NjIEQgYW5kIExMVk0gRCBjb21waWxlcnMuCgoyMDIzLTA1LTIwOiBvbGx5CgkgICAgU3VwcG9ydCBkZWR1Y2luZyB0aGUgdHlwZSBmb3IgZGVjbHR5cGUoZmFsc2UpIGFuZAoJICAgIGRlY2x0eXBlKHRydWUpLgoKMjAyMy0wNS0xOTogb2xseQoJICAgICMyNDQ2IEFkZCBzdXBwb3J0IGZvciBhdXRvIHdpdGhvdXQgdHJhaWxpbmcgcmV0dXJuIHR5cGUsIHdoaWNoIGlzIGEKCSAgICBDKysxNCBmZWF0dXJlLgoKMjAyMy0wNS0xOTogb2xseQoJICAgIFNXSUcgbm8gbG9uZ2VyIGRlZmluZXMgcHJlcHJvY2Vzc29yIHN5bWJvbHMgY29ycmVzcG9uZGluZyB0bwoJICAgIGNvbW1hbmQgbGluZSBvcHRpb25zIChlLmcuIGAtbW9kdWxlIGJsYWhgIHdhcyByZXN1bHRpbmcgaW4KCSAgICBgU1dJR09QVF9NT0RVTEVgIGJlaW5nIHNldCB0byBgYmxhaGApLiAgVGhpcyBmZWF0dXJlIHdhcyBhZGRlZCBpbgoJICAgIDIwMDEgc28gdGhhdCAiW21db2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyCgkgICAgY29kZSBnZW5lcmF0aW9uIGlmIG5lZWRlZCIsIGJ1dCBpdCdzIG5ldmVyIGJlZW4gdXNlZCBmb3IgdGhhdAoJICAgIHB1cnBvc2UgaW4gb3ZlciAyMCB5ZWFycywgYW5kIGhhcyBuZXZlciBiZWVuIGRvY3VtZW50ZWQgb3V0c2lkZSBvZgoJICAgIENIQU5HRVMuCgoyMDIzLTA1LTE4OiBvbGx5CgkgICAgIzI1OTEgQWRkIG5ldyAtVSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHVuZGVmaW5lIGEgcHJlcHJvY2Vzc29yCgkgICAgc3ltYm9sLgoKMjAyMy0wNS0xODogb2xseQoJICAgICMxNTg5ICMyMzM1IFN1cHBvcnQgcGFyc2luZyBhcmJpdHJhcnkgZXhwcmVzc2lvbiBpbiBkZWNsdHlwZS4KCgkgICAgVXNlIHBhcnNlciBlcnJvciByZWNvdmVyeSB0byBza2lwIHRvIHRoZSBjbG9zaW5nIG1hdGNoaW5nIGApYCBhbmQKCSAgICBpc3N1ZSBhIHdhcm5pbmcgdGhhdCB3ZSBjYW4ndCBkZWR1Y2UgdGhlIGRlY2x0eXBlIGZvciB0aGUKCSAgICBleHByZXNzaW9uIChsaWtlIHdlIGFscmVhZHkgZG8gZm9yIGFueSBleHByZXNzaW9uIHdoaWNoIGlzbid0IGEKCSAgICBzaW1wbGUgdmFyaWFibGUgb3Igc2ltaWxhcikuCgoyMDIzLTA1LTEyOiBtbW9tdGNoZXYsIGVyZXpnZXZhCgkgICAgW0phdmFzY3JpcHRdICMyNTYxIFN1cHBvcnQgY2hlY2sgdHlwZW1hcHMgZm9yIEphdmFzY3JpcHQuCgoyMDIzLTA1LTEyOiBvbGx5CgkgICAgW0phdmFdICMyNTU2IFN1cHByZXNzIEphdmEgcmVtb3ZhbCB3YXJuaW5ncyBvbiBmaW5hbGl6ZSBtZXRob2QuCgkgICAgU1dJRyB3aWxsIG5lZWQgdG8gc3RvcCByZWx5aW5nIG9uIGZpbmFsaXplIG1ldGhvZHMsIGJ1dCB3ZSBrbm93CgkgICAgdGhhdCBhbmQgbWVhbndoaWxlIHRoZXNlIHdhcm5pbmdzIG1ha2UgdGhlIHRlc3RzdWl0ZSBvdXRwdXQgdmVyeQoJICAgIG5vaXN5LgoKMjAyMy0wNS0xMTogb2xseQoJICAgICMzMDIgIzIwNzkgIzI0NzQgUGFyc2Ugc3RvcmFnZSBjbGFzcyBtb3JlIGZsZXhpYmx5LgoKCSAgICBQcmV2aW91c2x5IHdlIGhhZCBhIGhhcmQtY29kZWQgbGlzdCBvZiBhbGxvd2VkIGNvbWJpbmF0aW9ucyBpbiB0aGUKCSAgICBncmFtbWFyLCBidXQgdGhpcyBzdWZmZXJzIGZyb20gY29tYmluYXRvcmlhbCBleHBsb3Npb24sIGFuZCByZXN1bHRzCgkgICAgaW4gYSB2YWd1ZSBgU3ludGF4IGVycm9yIGluIGlucHV0YCBlcnJvciBmb3IgaW52YWxpZCAoYW5kIG1pc3NpbmcpCgkgICAgY29tYmluYXRpb25zLgoKCSAgICBUaGlzIG1lYW5zIHdlIG5vdyBzdXBwb3J0IGEgbnVtYmVyIG9mIGNhc2VzIHdoaWNoIGFyZSB2YWxpZCBDKysgYnV0CgkgICAgd2VyZW4ndCBzdXBwb3J0ZWQsIGluY2x1ZGluZyBgZnJpZW5kIGNvbnN0ZXhwcmAgYW5kIGB2aXJ0dWFsCgkgICAgZXhwbGljaXRgLgoKMjAyMy0wNS0wODogb2xseQoJICAgICMxNTY3IEFkZCBzdXBwb3J0IGZvciBzdGQ6OnN0cmluZ192aWV3IChuZXcgaW4gQysrMTcpIGZvciBDIywgSmF2YSwKCSAgICBMdWEsIFBlcmwsIFBIUCwgUHl0aG9uLCBSdWJ5IGFuZCBUY2wuCgoyMDIzLTA1LTA4OiBvbGx5CgkgICAgW1BIUF0gIzI1NDQgV3JhcCBvdmVybG9hZGVkIG1ldGhvZCB3aXRoIGJvdGggc3RhdGljIGFuZCBub24tc3RhdGljCgkgICAgZm9ybXMuICBXZSBub3cgd3JhcCB0aGlzIGFzIGEgbm9uLXN0YXRpYyBtZXRob2QgaW4gUEhQLCB3aGljaCBtZWFucwoJICAgIHRoZSBzdGF0aWMgZm9ybSBpcyBvbmx5IGNhbGxhYmxlIHZpYSBhbiBvYmplY3QuCgoJICAgIFByZXZpb3VzbHkgdGhpcyBjYXNlIGNvdWxkIGVuZCB1cCB3cmFwcGVkIGFzIHN0YXRpYyBvciBub24tc3RhdGljCgkgICAgaW4gUEhQLiAgSWYgaXQgd2FzIHdyYXBwZWQgYXMgc3RhdGljLCBhdHRlbXB0aW5nIHRvIGNhbGwgbm9uLXN0YXRpYwoJICAgIG92ZXJsb2FkZWQgZm9ybXMgd291bGQgY3Jhc2ggd2l0aCBhIHNlZ21lbnRhdGlvbiBmYXVsdC4KCjIwMjMtMDUtMDY6IG1tb210Y2hldiwgd3NmdWx0b24KICAgICAgICAgICAgIzI1NTAgRml4IHR5cGVkZWYvdXNpbmcgZGVjbGFyYXRpb25zIHRvIGEgdHlwZWRlZiBzdHJ1Y3QvY2xhc3MuCgoyMDIzLTA1LTA0OiBlcmV6Z2V2YQoJICAgIFtEXSAjMjUzOCBEcm9wIHN1cHBvcnQgZm9yIEQxL1RhbmdvLCB3aGljaCB3YXMgZGlzY29udGludWVkIGluCgkgICAgMjAxMi4gIFdyYXBwZXJzIGZvciBEMi9QaG9ib3MgYXJlIG5vdyBnZW5lcmF0ZWQgYnkgZGVmYXVsdCwgdGhvdWdoCgkgICAgdGhlIC1kMiBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHN0aWxsIGFjY2VwdGVkIChhbmQgbm93IGlnbm9yZWQpIGZvcgoJICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMy0wNC0yNzogb2xseQoJICAgICMyNTAyIEFsbG93IHVzaW5nIHNucHJpbnRmKCkgaW5zdGVhZCBvZiBzcHJpbnRmKCkgaW4gd3JhcHBlcnMuCgoJICAgIFdlIGFpbSB0byBwcm9kdWNlIGNvZGUgdGhhdCB3b3JrcyB3aXRoIEM5MCBvciBDKys5OCBzbyB3ZSBjYW4ndAoJICAgIGFzc3VtZSBzbnByaW50ZigpIGlzIGF2YWlsYWJsZSwgYnV0IGl0IGFsbW9zdCBhbHdheXMgaXMgKGV2ZW4KCSAgICBvbiBzeXN0ZW1zIGZyb20gYmVmb3JlIGl0IHdhcyBzdGFuZGFyZGlzZWQpIHNvIGhhdmluZyBhIHdheSB0bwoJICAgIHVzZSBpdCBpcyBoZWxwZnVsLgoKCSAgICBXZSBlbmFibGUgdGhpcyBhdXRvbWF0aWNhbGx5IGlmIHRoZSBjb21waWxlciBjbGFpbXMgY29uZm9ybWFuY2UKCSAgICB3aXRoIGF0IGxlYXN0IEM5OSBvciBDKysxMS4gSXQgY2FuIGFsc28gYmUgZW5hYmxlZCBtYW51YWxseSBieQoJICAgIGRlZmluaW5nIFNXSUdfSEFWRV9TTlBSSU5URi4gIERlZmluZSBTV0lHX05PX1NOUFJJTlRGIHRvIGRpc2FibGUKCSAgICBjb21wbGV0ZWx5LgoKCSAgICBUaGUgZmFsbGJhY2sgaXMgdG8gY2FsbCBzcHJpbnRmKCkgd2l0aG91dCBhIGJ1ZmZlciBzaXplIGNoZWNrLAoJICAgIHdoaWNoIGlzIHdoYXQgd2UndmUgZG9uZSB1bnRpbCBub3cuICBBZGRpbmcgYSBjaGVjayBhZnRlciB0aGUKCSAgICBjYWxsIHNlZW1zIG9mIGxpbWl0ZWQgYmVuZWZpdCAtIGlmIHRoZSBidWZmZXIgd2FzIG92ZXJmbG93ZWQKCSAgICB0aGVuIGl0J3MgdG9vIGxhdGUgdG8gYmxvY2sgaXQsIGFuZCBtb3N0IG9mIG91ciB1c2VzIGVpdGhlciBoYXZlIGEKCSAgICBmaXhlZCBtYXhpbXVtIHBvc3NpYmxlIHNpemUgb3IgZHluYW1pY2FsbHkgYWxsb2NhdGUgYSBidWZmZXIgdGhhdCdzCgkgICAgbGFyZ2UgZW5vdWdoLgoKMjAyMy0wNC0yNjogbW1vbXRjaGV2CgkgICAgW0phdmFzY3JpcHRdIFRha2UgaW50byBhY2NvdW50IG51bWlucHV0cyB3aGVuIGNvdW50aW5nIGFyZ3VtZW50cy4KCjIwMjMtMDQtMjQ6IG9sbHkKCSAgICBbUEhQXSBBZGQgdGhyb3dzIHR5cGVtYXBzIGZvciBzdGQ6c3RyaW5nKiBhbmQgY29uc3Qgc3RkOjpzdHJpbmcqLgoKMjAyMy0wNC0yMzogb2xseQoJICAgIFtKYXZhc2NyaXB0XSAjMjQ1MyBUaGUgdGVzdHN1aXRlIGFuZCBleGFtcGxlcyBub3cgc2VsZWN0IHdoaWNoCgkgICAgSmF2YXNjcmlwdCBlbmdpbmUgdG8gdGVzdCBiYXNlZCBvbiB3aGF0IHdhcyBkZXRlY3RlZCBieSBjb25maWd1cmUuCgkgICAgUHJldmlvdXNseSB0aGV5J2QgYWx3YXlzIHRlc3Qgd2l0aCBub2RlIHlvdSBzcGVjaWZpZWQgYSBkaWZmZXJlbnQKCSAgICBlbmdpbmUgKGUuZy4gd2l0aCBgRU5HSU5FPWpzY2Agb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lKS4gIE5vdyB5b3UKCSAgICBvbmx5IG5lZWQgdG8gc3BlY2lmeSBFTkdJTkUgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBlbmdpbmUKCSAgICBpbnN0YWxsZWQuCgoyMDIzLTA0LTIzOiBvbGx5CgkgICAgW0phdmFzY3JpcHRdIFR1cm4gb24gQysrIG91dHB1dCB3aGVuIHdyYXBwaW5nIGZvciBub2RlLCBsaWtlCgkgICAgd2UgYWxyZWFkeSBkbyB3aGVuIHdyYXBwaW5nIGZvciBWOC13aXRob3V0LW5vZGUuCgoJICAgIFRoZSB0ZXN0c3VpdGUgd2FzIG1hc2tpbmcgdGhpcyBidWcgYnkgdXNpbmcgU1dJRyBvcHRpb25zCgkgICAgYC12OCAtREJVSUxESU5HX05PREVfRVhURU5TSU9OPTFgIHJhdGhlciB0aGFuIGAtbm9kZWAgd2hlbiB0ZXN0aW5nCgkgICAgd2l0aCBub2RlanMsIHdoaWxlIHRoZSBqYXZhc2NyaXB0IGV4YW1wbGVzIHdlcmUgbWFza2luZyB0aGlzIGJ5CgkgICAgYWxsIGdldHRpbmcgcHJvY2Vzc2VkIHdpdGggLWMrKy4KCgkgICAgVGhpcyBzaG91bGRuJ3QgYmUgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSBmb3IgdXNlcnMsIGFzIGlmIHlvdSdyZQoJICAgIHdyYXBwaW5nIGEgQyBBUEkgeW91J2QgaGF2ZSB0byBiZSB3b3JraW5nIGFyb3VuZCB0aGUgcHJvYmxlbSBiZWZvcmUKCSAgICB0aGlzIGNoYW5nZSAobGlrZSBvdXIgdGVzdHN1aXRlIGFuZCBleGFtcGxlcyB3ZXJlKSwgYW5kIHRoaXMgY2hhbmdlCgkgICAgc2hvdWxkbid0IGJyZWFrIHlvdXIgd29ya2Fyb3VuZCAtIGl0IGp1c3QgbWFrZXMgaXQgdW5uZWNlc3NhcnkuCgoyMDIzLTA0LTIxOiBtbW9tdGNoZXYKCSAgICBbSmF2YXNjcmlwdF0gRml4IG5hbWluZyBvZiBpbnRlcm5hbCBDKysgaGVscGVyIGZvciB3cmFwcGluZwoJICAgIHZhcmlhYmxlcyBmb3Igbm9kZSB0byB1c2UgdGhlICJnZXR0ZXIiIG5hbWluZyBzY2hlbWUgcmF0aGVyCgkgICAgdGhhbiB0aGUgZnVuY3Rpb24gd3JhcHBpbmcgb25lLiAgSW4gcHJhY3RpY2UgdGhpcyBkaWRuJ3QgYWN0dWFsbHkKCSAgICBjYXVzZSBwcm9ibGVtcyBiZWNhdXNlIE5vZGUgd3JhcHBlcnMgYXJlIGFsd2F5cyBjb21waWxlZCBhcyBDKysKCSAgICBhbmQgdGhlIHBhcmFtZXRlcnMgYXJlIGFsd2F5cyBkaWZmZXJlbnQgZXZlbiBpZiB0aGUgbmFtZXMgYXJlCgkgICAgdGhlIHNhbWUuCgoyMDIzLTA0LTIxOiBvbGx5CgkgICAgW1BIUF0gU3VwcG9ydCBJTlBVVCxJTk9VVCxPVVRQVVQgZm9yIHN0ZDo6c3RyaW5nJi4KCgkgICAgQnkgZGVmYXVsdCBTV0lHL1BIUCB3cmFwcyBzdGQ6OnN0cmluZyYgYXMgYSBwYXNzLWJ5LXJlZmVyZW5jZSBQSFAKCSAgICBzdHJpbmcgcGFyYW1ldGVyLCBidXQgc29tZXRpbWVzIHN1Y2ggYSBwYXJhbWV0ZXIgaXMgb25seSBmb3IgaW5wdXQKCSAgICBvciBvbmx5IGZvciBvdXRwdXQsIHNvIGFkZCBzdXBwb3J0IGZvciB0aGUgbmFtZWQgdHlwZW1hcHMgdGhhdCBvdGhlcgoJICAgIHRhcmdldCBsYW5ndWFnZXMgc3VwcG9ydC4KCjIwMjMtMDQtMjE6IGRlZ2FzdXMKCSAgICAjMjUxOSBGaXggQ2FuQ2FzdEFzSW50ZWdlciByYW5nZSBjaGVjayB0byBjbGVhciBlcnJubyBmaXJzdCB0byBmaXgKCSAgICBib2d1cyBmYWlsdXJlcyBmb3IgdmFsaWQgaW5wdXRzLmlmIGVycm5vIGlzIHNldC4KCjIwMjMtMDQtMjE6IFphY2tlcnlTcHl0egoJICAgIFtPQ2FtbF0gIzE0MzkgRml4IHJlZmVyZW5jZSB0eXBlbWFwcyBmb3Igc3RkOjpzdHJpbmcKCjIwMjMtMDQtMjE6IG9sbHkKCSAgICAjMjE4MyBGaXggI2lmZGVmIGFuZCAjaWZuZGVmIHRvIHdvcmsgaW5zaWRlIGEgJWRlZmluZS4gIFByZXZpb3VzbHkKCSAgICB0aGV5IHdlcmUgc2lsZW50bHkgaWdub3JlZCBpbiB0aGlzIGNvbnRleHQgKGJ1dCAjaWYgZGVmaW5lZCBhbHJlYWR5CgkgICAgd29ya2VkIGhlcmUgaWYgeW91IG5lZWQgYSB3b3JrYXJvdW5kIHdoaWNoIHdvcmtzIGZvciBvbGRlcgoJICAgIHZlcnNpb25zKS4KCjIwMjMtMDQtMjA6IGVyZXpnZXZhCgkgICAgW0dvXSAjMjUzMyBJbXBsZW1lbnQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGZvciBHby4KCjIwMjMtMDQtMTk6IGRhdmlkY2wKICAgICAgICAgICAgW1NjaWxhYl0gQWRkIHN1cHBvcnQgZm9yIFNjaWxhYiAyMDIzLnguCgkgICAgSW50cm9kdWNlIGEgbmV3IGAtZ2F0ZXdheXhtbDZgIG9wdGlvbiB0byBnZW5lcmF0ZSBYTUwgd2l0aCBmdWxsCgkgICAgZnVuY3Rpb24gbmFtZXMuCgoyMDIzLTA0LTE5OiBtbW9tdGNoZXYKCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMTYzLyAjMTg4MiAjMjUyNQoJICAgIEZpeCBwcmVwcm9jZXNzb3IgZXhwYW5zaW9uIHdoZW4gYSBtYWNybyBleHBhbmRzIHRvIHRoZSBuYW1lIG9mCgkgICAgYW5vdGhlciBtYWNybyB3aGljaCB0YWtlcyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IGZvbGxvd2luZyB0aGUKCSAgICBvcmlnaW5hbCBtYWNybyBleHBhbnNpb24uCgoyMDIzLTA0LTE5OiB3aWxkbWFwbGVzCgkgICAgW1J1YnldICMyNTI3IEZpeCAidW5kZWZpbmluZyB0aGUgYWxsb2NhdG9yIG9mIFRfREFUQSIgd2FybmluZyBzZWVuCgkgICAgd2l0aCBSdWJ5IDMuMi4KCjIwMjMtMDQtMTg6IGRhdmlkY2wKCSAgICBbU2NpbGFiXSAjODk0IGV4dHJhY3QgdmFsdWVzIHdpdGggIjoiIGZvciB0eXBlbWFwIChpbnQqIElOLCBpbnQgSU5fU0laRSkKCjIwMjMtMDQtMTQ6IG9sbHkKCSAgICBbUEhQN10gU3VwcG9ydCBmb3IgUEhQNyBoYXMgYmVlbiByZW1vdmVkLiAgUEhQNyBzZWN1cml0eSBzdXBwb3J0CgkgICAgZW5kZWQgMjAyMi0xMS0yOCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaW5jbHVkZSBzdXBwb3J0IGZvcgoJICAgIGl0IGluIHRoZSBTV0lHIDQuMi54IHJlbGVhc2Ugc2VyaWVzLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjMtMDQtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMyNTE1IEFkZCBzdXBwb3J0IGZvciBhbGwgU1RMIGNvbnRhaW5lcnMgdG8gYmUgY29uc3RydWN0aWJsZSBmcm9tIGEgUHl0aG9uIHNldC4KCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB1c2VkIHRoZSBQeXRob24gU2VxdWVuY2UgUHJvdG9jb2wgdG8gY29udmVydCBmcm9tIFB5dGhvbiB0eXBlcwogICAgICAgICAgICB0byBTVEwgY29udGFpbmVycy4gVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBQeXRob24gSXRlcmF0b3IgUHJvdG9jb2wgaW5zdGVhZCBhbmQKICAgICAgICAgICAgdGhlcmVieSBjYW4gY29udmVydCBmcm9tIGEgUHl0aG9uIHNldCB0b28uCgoyMDIzLTAzLTI1OiBhbGF0aW5hCiAgICAgICAgICAgIFtPY3RhdmVdICMyNTEyIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgOC4xLgoKMjAyMy0wMy0yMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjMjQ3OCBNaW5vciBlbmhhbmNlbWVudHMgdG8gc3RkOjphcnJheSB3cmFwcGVycyBpbiBzdGRfYXJyYXkuaS4KCjIwMjMtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEltcHJvdmVkIGVycm9yIGNoZWNraW5nIHdoZW4gdXNpbmcgJXRlbXBsYXRlIHRvIGluc3RhbnRpYXRlIHRlbXBsYXRlcyB3aXRoaW4KICAgICAgICAgICAgdGhlIGNvcnJlY3Qgc2NvcGUuCgogICAgICAgICAgICAxLiBXaGVuIGEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkIHZpYSAldGVtcGxhdGUgYW5kIHVzZXMgdGhlIHVuYXJ5IHNjb3BlCiAgICAgICAgICAgIG9wZXJhdG9yIDo6LCBhbiBlcnJvciBvY2N1cnMgaWYgdGhlIGluc3RhbnRpYXRpb24gaXMgYXR0ZW1wdGVkIHdpdGhpbiBhCiAgICAgICAgICAgIG5hbWVzcGFjZSB0aGF0IGRvZXMgbm90IGVuY2xvc2UgdGhlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCBub3cgZXJyb3IgYXMgOjp0ZXN0OjptYXggaXMgbm90IGVuY2xvc2VkIHdpdGhpbiB0ZXN0MToKCiAgICAgICAgICAgIEVycm9yOiAnOjp0ZXN0OjptYXgnIHJlc29sdmVzIHRvICd0ZXN0OjptYXgnIGFuZCB3YXMgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIGluCiAgICAgICAgICAgIHNjb3BlICd0ZXN0MScgaW5zdGVhZCBvZiB3aXRoaW4gc2NvcGUgJ3Rlc3QnLgogICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0MSB7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4Y2hhcikgOjp0ZXN0OjptYXg8Y2hhcj47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgMi4gU1dJRyBwcmV2aW91c2x5IGZhaWxlZCB0byBhbHdheXMgZGV0ZWN0IGEgdGVtcGxhdGUgZGlkIG5vdCBleGlzdCB3aGVuIHVzaW5nCiAgICAgICAgICAgICV0ZW1wbGF0ZS4gSW4gcGFydGljdWxhciB3aGVuIGluc3RhbnRpYXRpbmcgYSBnbG9iYWwgdGVtcGxhdGUgaW5jb3JyZWN0bHkgd2l0aGluCiAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGNvZGUgYmVsb3cgbm93IGNvcnJlY3RseSBlbWl0cyBhbiBlcnJvcjoKCiAgICAgICAgICAgIEVycm9yOiBUZW1wbGF0ZSAndGVzdDU6Okdsb2JhbFZlY3RvcicgdW5kZWZpbmVkLgogICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0NSB7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBHbG9iYWxWZWN0b3Ige307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEdWSSkgdGVzdDU6Okdsb2JhbFZlY3RvcjxpbnQ+OwoKMjAyMy0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgRXJyb3Igb3V0IGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWZpbmUgYSBjbGFzcyB1c2luZyB0aGUgdW5hcnkgc2NvcGUKICAgICAgICAgICAgb3BlcmF0b3IgOjouIFRoZSBmb2xsb3dpbmcgaXMgbm90IGxlZ2FsIEMrKyBhbmQgbm93IHJlc3VsdHMgaW4gYW4gZXJyb3I6CgogICAgICAgICAgICBFcnJvcjogVXNpbmcgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yIDo6IGluIGNsYXNzIGRlZmluaXRpb24gJzo6U3BhY2UyOjpCJyBpcyBpbnZhbGlkLgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgc3RydWN0IEI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0cnVjdCA6OlNwYWNlMjo6QiB7fTsKCjIwMjMtMDMtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkdXBsaWNhdGUgY29uc3QgaW4gZ2VuZXJhdGVkIGNvZGUgd2hlbiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHR5cGUgaXMgY29uc3QKICAgICAgICAgICAgYW5kIHVzZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgYWxzbyBleHBsaWNpdGx5IGNvbnN0LCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IENvbnN0ZXIgewogICAgICAgICAgICAgICAgdm9pZCBjY2NjMShUIGNvbnN0JiB0KSB7fQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKENvbnN0ZXJJbnQpIENvbnN0ZXI8Y29uc3QgaW50PjsKCiAgICAgICAgICAgIEFib3ZlIHByZXZpb3VzbHkgbGVkIHRvIGdlbmVyYXRlZCBjb2RlOgogICAgICAgICAgICAgIChhcmcxKS0+Y2NjYzEoKGludCBjb25zdCBjb25zdCAmKSphcmcyKTsKICAgICAgICAgICAgaW5zdGVhZCBvZgogICAgICAgICAgICAgIChhcmcxKS0+Y2NjYzEoKGludCBjb25zdCAmKSphcmcyKTsKCjIwMjMtMDMtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZml4ZXMgdG8gc3VwcG9ydCBkZWZhdWx0IGFyZ3VtZW50cyBmcm9tIHRoZSBwcmltYXJ5CiAgICAgICAgICAgIHRlbXBsYXRlJ3MgcGFyYW1ldGVyIGxpc3QuCgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFksIGNsYXNzIFQ9aW50PiBzdHJ1Y3QgWCB7IHZvaWQgcHJpbWFyeSgpIHt9IH07CiAgICAgICAgICAgICAgLy8gUHJldmlvdXNseSB0aGUgc3BlY2lhbGl6YXRpb24gYmVsb3cgcmVzdWx0ZWQgaW46CiAgICAgICAgICAgICAgLy8gRXJyb3I6IEluY29uc2lzdGVudCBhcmd1bWVudCBjb3VudCBpbiB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAxIDIKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBZWT4gc3RydWN0IFg8WVkqPiB7IHZvaWQgc3BlY2lhbChZWSopIHt9IH07CgogICAgICAgICAgICAgIC8vIEJvdGggb2YgdGhlc2UgY29ycmVjdGx5IHdyYXAgdGhlIHBhcnRpYWxseSBzcGVjaWFsaXplZCB0ZW1wbGF0ZQogICAgICAgICAgICAgICV0ZW1wbGF0ZShTdHJpbmdQdHIpIFg8Y29uc3QgY2hhciAqPjsKICAgICAgICAgICAgICAldGVtcGxhdGUoU2hvcnRQdHIpIFg8c2hvcnQgKiwgaW50PjsKCjIwMjMtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgICMxMzAwIEZ1cnRoZXIgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBmaXhlcy4KICAgICAgICAgICAgRml4ZXMgd2hlbiB0ZW1wbGF0ZXMgYXJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW4gYSBwYXJ0aWFsbHkgc3BlY2lhbGl6ZWQKICAgICAgICAgICAgaW5zdGFudGlhdGlvbiBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWPiBzdHJ1Y3QgVmVjdCB7fTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0eXBlbmFtZSBUVD4gY2xhc3MgRm9vIHsgLi4uIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVFMsIHR5cGVuYW1lIFRUUz4gY2xhc3MgRm9vPFZlY3Q8VFM+LCBUVFM+IHsgLi4uIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RJbnQpIFZlY3Q8aW50PjsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vVmVjdEludERvdWJsZSkgRm9vPFZlY3Q8aW50PiwgZG91YmxlPjsgLy8gd2FzIHByZXZpb3VzbHkgYXR0ZW1wdGluZyB0byB1c2UgcHJpbWFyeSB0ZW1wbGF0ZQoKICAgICAgICAgICAgQWxzbyBmaXhlcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdoZXJlIHRoZSBzYW1lIHRlbXBsYXRlIHBhcmFtZXRlciBuYW1lIGlzIHVzZWQgdHdpY2UsCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPiBzdHJ1Y3QgSCB7IC4uLiB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBIPFQsIFQ+IHsgLi4uIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEhJbnRzKSBIPGludCwgaW50PjsgLy8gd2FzIHByZXZpb3VzbHkgYXR0ZW1wdGluZyB0byB1c2UgcHJpbWFyeSB0ZW1wbGF0ZQoKMjAyMy0wMS0yNzoganNjaHVlbGxlcgoJICAgICMyNDkyIFtweXRob25dIEZpeCB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmdzIGZvciBzZWxmIHBhcmFtZXRlciBpbgoJICAgIGdlbmVyYXRlZCBDL0MrKyB3cmFwcGVyIGNvZGUuCgoyMDIzLTAxLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGVkdWN0aW9uIG9mIHBhcnRpYWxseSBzcGVjaWFsaXplZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdoZW4gdGhlIHNwZWNpYWxpemVkCiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub24tdHJpdmlhbCwgdXNlZCBpbiBhIHdyYXBwZWQgbWV0aG9kIGFuZCB0aGUgdHlwZSB0byAldGVtcGxhdGUgdXNlcwogICAgICAgICAgICB0eXBlZGVmcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlICYgRG91YmxlUmVmOwogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgWFgge307CiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBYWDxUICY+IHsgdm9pZCBmbihUIHQpIHt9IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFhYRCkgWFg8RG91YmxlUmVmPjsKCiAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBmb3IgZm4gaXMgbm93IGNvcnJlY3RseSBkZWR1Y2VkCiAgICAgICAgICAgIGFzIGRvdWJsZS4KCjIwMjMtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgICM5ODMgRml4IHNlZyBmYXVsdCB3aGVuIGluc3RhbnRpYXRpbmcgdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0aGF0IGFyZSBmdW5jdGlvbgogICAgICAgICAgICBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGVtcGxhdGVzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoTXlDKSBDPGludChzdGQ6OnZlY3RvcjxpbnQ+KT47CgoyMDIzLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBDb21wbGV0ZSBzdXBwb3J0IGZvciBDKysxMSB2YXJpYWRpYyBmdW5jdGlvbiB0ZW1wbGF0ZXMuIFN1cHBvcnQgd2FzIHByZXZpb3VzbHkgbGltaXRlZAogICAgICAgICAgICB0byBqdXN0IG9uZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuIE5vdyB6ZXJvIG9yIG1vcmUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkCiAgICAgICAgICAgIGluIHRoZSAldGVtcGxhdGUgaW5zdGFudGlhdGlvbi4KCjIwMjItMTItMjk6IHdzZnVsdG9uCiAgICAgICAgICAgICMxODYzIFN5bnRheCBlcnJvciBmaXhlcyBwYXJzaW5nIG1vcmUgZWxhYm9yYXRlIHBhcmFtZXRlciBwYWNrIGFyZ3VtZW50cyB0aGF0IGFyZQogICAgICAgICAgICB1c2VkIGluIGZ1bmN0aW9uIHBvaW50ZXJzLCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnM6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBWPiBzdHJ1Y3QgVmFyaWFkaWNQYXJtcyB7CiAgICAgICAgICAgICAgICB2b2lkIFBhcm1zRnVuY1B0clB0cihpbnQgKCopKFYqLi4uKSkge30KICAgICAgICAgICAgICAgIHZvaWQgUGFybXNGdW5jUHRyUHRyUmVmKGludCAoKikoViomLi4uKSkge30KICAgICAgICAgICAgICAgIHZvaWQgUGFybXNGdW5jUHRyUHRyUlZhbHVlUmVmKGludCAoKikoViomJi4uLikpIHt9CiAgICAgICAgICAgICAgICB2b2lkIFBhcm1zRnVuY1B0clJlZihpbnQgKCopKFYmLi4uKSkge30KICAgICAgICAgICAgICAgIHZvaWQgUGFybXNGdW5jUHRyUlZhbHVlUmVmKGludCAoKikoViYmLi4uKSkge30KCiAgICAgICAgICAgICAgICB2b2lkIFBhcm1zTWVtRnVuY1B0clB0cihpbnQgKEtsYXNzTWVtRnVuY3M6OiopKFYqLi4uKSkge30KICAgICAgICAgICAgICAgIHZvaWQgUGFybXNNZW1GdW5jUHRyUHRyUmVmKGludCAoS2xhc3NNZW1GdW5jczo6KikoViomLi4uKSkge30KICAgICAgICAgICAgICAgIHZvaWQgUGFybXNNZW1GdW5jUHRyUHRyUlZhbHVlUmVmKGludCAoS2xhc3NNZW1GdW5jczo6KikoViomJi4uLikpIHt9CiAgICAgICAgICAgICAgICB2b2lkIFBhcm1zTWVtRnVuY1B0clJlZihpbnQgKEtsYXNzTWVtRnVuY3M6OiopKFYmLi4uKSkge30KICAgICAgICAgICAgICAgIHZvaWQgUGFybXNNZW1GdW5jUHRyUlZhbHVlUmVmKGludCAoS2xhc3NNZW1GdW5jczo6KikoViYmLi4uKSkge30KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoVmFyaWFkaWNQYXJtczApIFZhcmlhZGljUGFybXM8PjsKICAgICAgICAgICAgICAldGVtcGxhdGUoVmFyaWFkaWNQYXJtczEpIFZhcmlhZGljUGFybXM8QT47CgogICAgICAgICAgICBBbHNvIGluIHZhcmlvdXMgb3RoZXIgcGxhY2VzIHN1Y2ggYXMgd2l0aGluIG5vZXhjZXB0IHNwZWNpZmllcnM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CiAgICAgICAgICAgICAgdm9pZCBlbXBsYWNlKEFyZ3MgJiYuLi4gYXJncykgbm9leGNlcHQoCiAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPFQsIEFyZ3MgJiYuLi4+Ojp2YWx1ZSk7CgoyMDIyLTEyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5zdGFudGlhdGlvbiBvZiB2YXJpYWRpYyBjbGFzcyB0ZW1wbGF0ZXMgY29udGFpbmluZyBwYXJhbWV0ZXIgcGFjayBhcmd1bWVudHMgdGhhdAogICAgICAgICAgICBhcmUgZnVuY3Rpb24gcG9pbnRlcnMuCgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBWPiBzdHJ1Y3QgVmFyaWFkaWNQYXJtcyB7CiAgICAgICAgICAgICAgICB2b2lkIFBhcm1zRnVuY1B0clZhbChpbnQgKCopKFYuLi4pKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShWYXJpYWRpY1Bhcm1zMCkgVmFyaWFkaWNQYXJtczw+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShWYXJpYWRpY1Bhcm1zMSkgVmFyaWFkaWNQYXJtczxBPjsKCjIwMjItMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgICMxODYzIEZpeCBzeW50YXggZXJyb3IgcGFyc2luZyB2YXJpYWRpYyB0ZW1wbGF0ZXMgY29udGFpbmluZyBwYXJhbWV0ZXIgcGFjayBhcmd1bWVudHMgdGhhdAogICAgICAgICAgICBhcmUgZnVuY3Rpb24gcG9pbnRlcnMuCgoyMDIyLTEyLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBDb21wbGV0ZSBzdXBwb3J0IGZvciBDKysxMSB2YXJpYWRpYyBjbGFzcyB0ZW1wbGF0ZXMuIFN1cHBvcnQgd2FzIHByZXZpb3VzbHkgbGltaXRlZAogICAgICAgICAgICB0byBqdXN0IG9uZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuIE5vdyB6ZXJvIG9yIG1vcmUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkLgoKMjAyMi0xMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgIzE2MzYgRml4IHN5bnRheCBlcnJvciBmb3IgbWlzcGxhY2VkIERveHlnZW4gY29tbWVudCBhZnRlciBzdHJ1Y3QvY2xhc3MgbWVtYmVyLgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHVzaW5nIERveHlnZW4gbWVtYmVyIGdyb3VwcyBzeW50YXgsICIvLy8qfSIsIHdoZW4gdXNlZCBhZnRlcgogICAgICAgICAgICBmaW5hbCBzdHJ1Y3QvY2xhc3MgbWVtYmVyLgoKMjAyMi0xMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgIzIwMjMgRml4IGdhcmJsZWQgRG94eWdlbiBwb3N0IGNvbW1lbnRzIGluIHBhcmFtZXRlciBsaXN0cy4KICAgICAgICAgICAgRml4IHN5bnRheCBlcnJvciBwYXJzaW5nIGEgdHJhaWxpbmcgRG94eWdlbiBjb21tZW50IGluIHBhcmFtZXRlciBsaXN0cy4KCjIwMjItMTItMDM6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNjA5IEZpeCBzeW50YXggZXJyb3IgcGFyc2luZyBvZiBEb3h5Z2VuIGNvbW1lbnRzIGFmdGVyIGxhc3QgZW51bSBpdGVtLgoKMjAyMi0xMi0wMzogd3NmdWx0b24KICAgICAgICAgICAgIzE3MTUgRml4IHN5bnRheCBlcnJvciBwYXJzaW5nIG9mIHVuY29udmVudGlvbmFsbHkgcGxhY2VkIERveHlnZW4gcG9zdAogICAgICAgICAgICBjb21tZW50cyBmb3IgZW51bSBpdGVtcy4KCjIwMjItMTItMDI6IHdzZnVsdG9uCiAgICAgICAgICAgICM2MjQgIzEwMjEgSW1wcm92ZWQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyBzdXBwb3J0LiBQcmV2aW91c2x5LCBzcGVjaWZ5aW5nIG1vcmUKICAgICAgICAgICAgdGhhbiBvbmUgc2ltcGxlIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciByZXN1bHRlZCBpbiBhIHBhcnNlIGVycm9yLiBOb3cKICAgICAgICAgICAgbXVsdGlwbGUgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgd29ya2luZyBpbmNsdWRpbmcgaW5zdGFudGlhdGlvbiB3aXRoCiAgICAgICAgICAgICV0ZW1wbGF0ZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHRlbXBsYXRlPHRlbXBsYXRlPGNsYXNzPiBjbGFzcywgY2xhc3M+IGNsYXNzIE9wLCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgWCwgY2xhc3MgWT4KICAgICAgICAgICAgICBjbGFzcyBDIHsgLi4uIH07CgoyMDIyLTExLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTU4OSAjMTU5MCBTbGlnaHRseSBiZXR0ZXIgZGVjbHR5cGUoKSBzdXBwb3J0IGZvciBleHByZXNzaW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgLi4uICBkZWNsdHlwZSgmaSkgLi4uCgogICAgICAgICAgICBUaGVzZSByZXN1bHQgaW4gYSB3YXJuaW5nIGZvciBub24tdHJpdmlhbCBleHByZXNzaW9ucyB3aGljaCBTV0lHIGNhbm5vdCBldmFsdWF0ZToKCiAgICAgICAgICAgICAgV2FybmluZyAzNDQ6IFVuYWJsZSB0byBkZWR1Y2UgZGVjbHR5cGUgZm9yICcmaScuCgogICAgICAgICAgICBTZWUgJ1R5cGUgSW5mZXJlbmNlJyBpbiBDUGx1c1BsdXMuaHRtbCBmb3Igd29ya2Fyb3VuZHMuCgoyMDIyLTExLTIyOiB3c2Z1bHRvbgoJICAgICMzNjYgIzEwMzcgRml4IHNlZyBmYXVsdCBoYW5kbGluZyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZXhwcmVzc2lvbnMKCSAgICBjb250YWluaW5nICc8PScgb3IgJz49Jy4KCjIwMjItMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIER1cGxpY2F0ZSBjbGFzcyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyB2aWEgJXRlbXBsYXRlIG5vdyBpc3N1ZSBhIHdhcm5pbmcgYW5kIGFyZSBpZ25vcmVkLgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBaW50KSBBPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoQWludDIpIEE8aW50PjsgLy8gTm93IGlnbm9yZWQgYW5kIGlzc3VlcyBhIHdhcm5pbmcKCiAgICAgICAgICAgIGV4YW1wbGUuaTo3OiBXYXJuaW5nIDQwNDogRHVwbGljYXRlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gb2YgJ0E8IGludCA+JyB3aXRoIG5hbWUgJ0FpbnQyJyBpZ25vcmVkLAogICAgICAgICAgICBleGFtcGxlLmk6NjogV2FybmluZyA0MDQ6IHByZXZpb3VzIGluc3RhbnRpYXRpb24gb2YgJ0E8IGludCA+JyB3aXRoIG5hbWUgJ0FpbnQnLgoKICAgICAgICAgICAgQSBzaW5nbGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBiZWZvcmUgYSBuYW1lZCBpbnN0YW50aWF0aW9uIGlzIHRoZSBvbmUgZXhjZXB0aW9uCiAgICAgICAgICAgIGZvciBhbGxvd2luZyBkdXBsaWNhdGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMgYXMgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZG9lcyBub3QKICAgICAgICAgICAgY3JlYXRlIGEgd3JhcHBlciBmb3IgdGhlIHRlbXBsYXRlLCBpdCBtZXJlbHkgYWRkcyB0aGUgaW5zdGFudGlhdGlvbiBpbnRvIFNXSUcncyBpbnRlcm5hbAogICAgICAgICAgICB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgRHVwbGljYXRlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIGFyZSBxdWlldGx5IGlnbm9yZWQuCgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgQjxpbnQ+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEJpbnQpIEI8aW50PjsgLy8gT0sKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBDPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBDPGludD47IC8vIFF1aWV0bHkgaWdub3JlZCBub3cKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShDaW50KSBDPGludD47IC8vIE9LCgogICAgICAgICAgICBOb3RlIHRoYXQgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBjb25zaWRlcmVkIHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVID0gc2hvcnQ+IHN0cnVjdCBEIHt9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKERpbnQpIEQ8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShEaW50c2hvcnQpIEQ8aW50LCBzaG9ydD47CgogICAgICAgICAgICBleGFtcGxlLmk6NzogV2FybmluZyA0MDQ6IER1cGxpY2F0ZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIG9mICdEPCBpbnQsc2hvcnQgPicgd2l0aCBuYW1lICdEaW50c2hvcnQnIGlnbm9yZWQsCiAgICAgICAgICAgIGV4YW1wbGUuaTo2OiBXYXJuaW5nIDQwNDogcHJldmlvdXMgaW5zdGFudGlhdGlvbiBvZiAnRDwgaW50ID4nIHdpdGggbmFtZSAnRGludCcuCgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBhbHdheXMgd2FzIGlnbm9yZWQsIGJ1dCB0aGF0IHdhcyBiZWNhdXNlIHRoZSBjaG9zZW4gbmFtZSB3YXMgYQogICAgICAgICAgICBkdXBsaWNhdGUgcmF0aGVyIHRoYW4gdGhlIHRlbXBsYXRlIGJlaW5nIGEgZHVwbGljYXRlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShFaW50KSBFPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRWludCkgRTxpbnQ+OyAvLyBBbHdheXMgaGFzIGJlZW4gaWdub3JlZCBhcyBhIHJlZGVmaW5lZCBpZGVudGlmaWVyCgogICAgICAgICAgICBUaGUgb2xkIHdhcm5pbmcgd2FzOgoKICAgICAgICAgICAgZXhhbXBsZS5pOjc6IFdhcm5pbmcgMzAyOiBJZGVudGlmaWVyICdFaW50JyByZWRlZmluZWQgKGlnbm9yZWQpIChSZW5hbWVkIGZyb20gJ0U8IGludCA+JyksCiAgICAgICAgICAgIGV4YW1wbGUuaTo2OiBXYXJuaW5nIDMwMjogcHJldmlvdXMgZGVmaW5pdGlvbiBvZiAnRWludCcgKFJlbmFtZWQgZnJvbSAnRTwgaW50ID4nKS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgpWZXJzaW9uIDQuMS4xICgzMCBOb3YgMjAyMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDIyLTExLTI5OiBiZXJvCiAgICAgICAgICAgIEZpeCBtaXNtYXRjaCBiZXR3ZWVuICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaCBhbmQgcG9wIHN0YXRlbWVudHMKCjIwMjItMTEtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNDQ5IEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGluIGNjYWNoZS1zd2lnIGNhbGN1bGF0aW5nIG1kNCBoYXNoZXMgYW5kIHBvc3NpYmx5CiAgICAgICAgICAgIGFsc28gaGFuZGxpbmcgZXJyb3JzIHdoZW4gQ0NBQ0hFX0NQUDIgaXMgc2V0LgoKMjAyMi0xMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgIzk2MSBGaXggc3ludGF4IGVycm9yIHBhcnNpbmcgdW5uYW1lZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggYSBkZWZhdWx0IHZhbHVlLgoKMjAyMi0xMS0yNTogb2xseQoJICAgICMyNDQ3IEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGluIHN3aWcncyBwYXJzZXIgd2hlbiBoYW5kbGluZwoJICAgIGRlZmF1bHQgcGFyYW1ldGVyIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgbWV0aG9kIGNhbGxzLgoKMjAyMi0xMS0xMzogb2xseQoJICAgIFtQSFBdICMyNDE5IFVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoYXQgU1dJRyA0LjEuMAoJICAgIGRyb3BwZWQgc3VwcG9ydCBmb3IgLW5vcHJveHkgd2hlbiBnZW5lcmF0aW5nIFBIUCB3cmFwcGVycy4KCjIwMjItMTEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICMyNDE3IEZpeCAtc3dpZ2xpYiBmb3IgV2luZG93cyB3aGVuIGJ1aWxkaW5nIHdpdGggQ01ha2UuCgoyMDIyLTExLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICAjMjQxOCBGaXggaW5maW5pdGUgbG9vcCBoYW5kbGluZyBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgoKICAgICAgICAgICAgRml4ZXMgaW5maW5pdGUgbG9vcCBkdWUgdG8gKCkgYnJhY2tldHMgaW4gYSBub24tdHlwZSB0ZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXIgY29udGFpbmluZyBhbiBleHByZXNzaW9uLgoKMjAyMi0xMC0yODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFIgcnR5cGVjaGVjayB0eXBlbWFwcwoKICAgICAgICAgICAgRnVydGhlciBzd2l0Y2ggdG8gdXNlIHJ0eXBlY2hlY2sgdHlwZW1hcHMgaW5zdGVhZCBvZiBoYXJkIGNvZGVkIGxvZ2ljLgogICAgICAgICAgICBUaGUgZnVsbCBzd2l0Y2ggdG8gdHlwZW1hcHMgaXMgZGVmZXJyZWQgdW50aWwgc3dpZy00LjIgYXMgaXQgY2FuJ3QgYmUgZnVsbHkKICAgICAgICAgICAgYmFja3dhcmRzIGNvbXBhdGlibGUuIEZvciBub3cgYSB3YXJuaW5nIGlzIHByb3ZpZGVkIHRvIGhlbHAgdGhlCiAgICAgICAgICAgIHRyYW5zaXRpb24uIEl0IHByb3ZpZGVzIHRoZSBmdWxsIHR5cGVtYXAgdGhhdCBzaG91bGQgYmUgcGxhY2VkIGludG8KICAgICAgICAgICAgYSB1c2VyJ3MgaW50ZXJmYWNlIGZpbGUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXR5cGVtYXAoInJ0eXBlIikgaW50MzJfdCAqICJpbnRlZ2VyIgogICAgICAgICAgICB2b2lkIHRlc3RtZXRob2QoaW50MzJfdCAqIGkpOwogICAgICAgICAgICB2b2lkIHRlc3RtZXRob2QoKTsKCiAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHJ0eXBlY2hlY2sgdHlwZW1hcCBmb3IgaW50MzJfdCAqLCB0aGUgd2FybmluZyBzaG93biBpczoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjc6IFdhcm5pbmcgNzUwOiBPcHRpb25hbCBydHlwZWNoZWNrIGNvZGUgaXMgZGVwcmVjYXRlZC4gQWRkIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyB0eXBlbWFwIHRvIGZpeCBhcyB0aGUgbmV4dCB2ZXJzaW9uIG9mIFNXSUcgd2lsbCBub3Qgd29yayB3aXRob3V0IGl0OgogICAgICAgICAgICAgICV0eXBlbWFwKCJydHlwZWNoZWNrIikgaW50MzJfdCAqICV7IChpcy5pbnRlZ2VyKCRhcmcpIHx8IGlzLm51bWVyaWMoJGFyZykpICV9CgogICAgICAgICAgICBUaGUgd2FybmluZyBpcyBzaG93biBmb3IgYW55IGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgIm51bWVyaWMiLCAiaW50ZWdlciIgb3IKICAgICAgICAgICAgImNoYXJhY3RlciIgZm9yIHRoZSBydHlwZSB0eXBlbWFwLiBDb3B5aW5nIHRoZSBydHlwZWNoZWNrIHR5cGVtYXAgYXMKICAgICAgICAgICAgc2hvd24gaW50byB0aGUgdXNlciBpbnRlcmZhY2UgZmlsZSB3aWxsIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGZpeCBhbmQKICAgICAgICAgICAgdGhlIHdhcm5pbmcgd2lsbCBkaXNhcHBlYXIuIFRoaXMgaXMgaW1wb3J0YW50IHRvIGRvIGFzIHN3aWctNC4yIHdpbGwKICAgICAgICAgICAgbm90IGJlIGFibGUgdG8gcHJvdmlkZSB0aGlzIGhlbHBmdWwgd2FybmluZy4KCjIwMjItMTAtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBbGxvdyBOVUxMIHRvIGJlIHVzZWQgaW4gb3ZlcmxvYWRlZCBmdW5jdGlvbnMgdGFraW5nIHNoYXJlZF9wdHIuCiAgICAgICAgICAgIEFsc28gZml4ZXMgc3BlY2lhbCB2YXJpYWJsZSAkYXJndHlwZSBleHBhbnNpb24gaW4gcnR5cGVjaGVjayB0eXBlbWFwcy4KCjIwMjItMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBJbXByb3ZlIFIgd3JhcHBlciBlcnJvciBtZXNzYWdlIHdoZW4gY2FsbGluZyBvdmVybG9hZGVkIG1ldGhvZHMKICAgICAgICAgICAgd2hlbiBpbmNvcnJlY3QgdHlwZXMgcGFzc2VkIGFyZSBwYXNzZWQgdG8gdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KCiAgICAgICAgICAgIE9sZCB1bmhlbHBmdWwgZXJyb3IgbWVzc2FnZToKICAgICAgICAgICAgICBFcnJvciBpbiBmKC4uLikgOiBjb3VsZCBub3QgZmluZCBmdW5jdGlvbiAiZiIKCiAgICAgICAgICAgIEV4YW1wbGUgb2YgbmV3IGltcHJvdmVkIGVycm9yIG1lc3NhZ2U6CiAgICAgICAgICAgICAgRXJyb3IgaW4gdXNlX2NvdW50KGspIDoKICAgICAgICAgICAgICAgIGNhbm5vdCBmaW5kIG92ZXJsb2FkZWQgZnVuY3Rpb24gZm9yIHVzZV9jb3VudCB3aXRoIGFyZ3R5cGVzIChOVUxMKQoKMjAyMi0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW1JdICMyMzg2IEZpeCBtZW1vcnkgbGVhayBpbiBSIHNoYXJlZF9wdHIgd3JhcHBlcnMuCiAgICAgICAgICAgIEZpeCBsZWFrIHdoZW4gYSBjYXN0IHVwIGEgY2xhc3MgaW5oZXJpdGFuY2UgY2hhaW4gaXMgcmVxdWlyZWQuCgpWZXJzaW9uIDQuMS4wICgyNCBPY3QgMjAyMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDIyLTEwLTI0OiB3c2Z1bHRvbiwgQW5kTExBCiAgICAgICAgICAgIFtSXSAjMjM4NiBGaXggcHJvYmxlbXMgaW4gc2hhcmVkX3B0ciB3cmFwcGVycyB3aGVyZSB0aGUgY2xhc3MgbmFtZXMKICAgICAgICAgICAgd2VyZSBub3QgY29uc2lzdGVudCB3aGVuIHVzaW5nIHRoZSBzaGFyZWRfcHRyIHRlbXBsYXRlIG9yIHRoZSBhY3R1YWwKICAgICAgICAgICAgdW5kZXJseWluZyB0eXBlLgoKMjAyMi0xMC0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFkZCBzdXBwb3J0IGZvciBzcGVjaWFsIHZhcmlhYmxlIHJlcGxhY2VtZW50IGluIHRoZSAkdHlwZW1hcCgpCiAgICAgICAgICAgIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8gZm9yIFIgc3BlY2lmaWMgdHlwZW1hcHMgKHJ0eXBlLCBydHlwZWNoZWNrLAogICAgICAgICAgICBzY29lcmNlaW4sIHNjb2VyZW91dCkuCgoyMDIyLTEwLTI0OiB3c2Z1bHRvbgoJICAgIFtSXSBQb2x5bW9ycGhpc20gaW4gdGhlIHdyYXBwZXJzIHdhcyBvbmx5IHdvcmtpbmcgZm9yIEMrKyBjbGFzc2VzLAogICAgICAgICAgICBub3cgdGhpcyB3b3JrcyBmb3IgQysrIHN0cnVjdHMgdG9vLgoKMjAyMi0xMC0xOTogb2xseQoJICAgIFtMdWFdICMyMTI2IEZpeCB0eXBlIHJlc29sdXRpb24gYmV0d2VlbiBtdWx0aXBsZSBTV0lHLXdyYXBwZWQKCSAgICBtb2R1bGVzLgoKMjAyMi0xMC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdICMyMzg1IEFkZCBzdXBwb3J0IGZvciBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+LgoKMjAyMi0xMC0xNDogbXVyaWxsbzEyOAoJICAgIFtKYXZhc2NyaXB0XSAjMjEwOSBUd2VhayB1bnNpZ25lZCBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgdG8gY3JlYXRlIGEgdjg6Ok51bWJlciBpbnN0ZWFkIG9mIHY4OjpJbnRlZ2VyIGlmIHRoZSB2YWx1ZSBleGNlZWRzCiAgICAgICAgICAgIHRoZSBzaXplIG9mIHY4OjpJbnRlZ2VyLiBOb3RlIHRoYXQgdGhlIHY4OjpOdW1iZXIgdmFsdWUgd2lsbCBiZQogICAgICAgICAgICBpbXByZWNpc2UgaWYgdGhlIHZhbHVlIGlzID4gTUFYX1NBRkVfSU5URUdFUi4KCjIwMjItMTAtMTQ6IG9sbHkKCSAgICBbUl0gQXJyYW5nZSB0aGF0IGRlc3RydWN0b3JzIG9mIGxvY2FsIEMrKyBvYmplY3RzIGluIHRoZSB3cmFwcGVyCgkgICAgZnVuY3Rpb24gZ2V0IHJ1biBvbiBTV0lHX2ZhaWwgKHdoaWNoIGNhbGxzIFJmX2Vycm9yKCkgd2hpY2ggY2FsbHMKCSAgICBsb25nam1wKCkpLgoKMjAyMi0xMC0xNDogb2xseQoJICAgIFtMdWFdIEFycmFuZ2UgdGhhdCBkZXN0cnVjdG9ycyBvZiBsb2NhbCBDKysgb2JqZWN0cyBpbiB0aGUgd3JhcHBlcgoJICAgIGZ1bmN0aW9uIGdldCBydW4gb24gU1dJR19mYWlsICh3aGljaCBjYWxscyBsdWFfZXJyb3IoKSB3aGljaCBjYWxscwoJICAgIGxvbmdqbXAoKSkuCgoyMDIyLTEwLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIG1pc3NpbmcgU1dJR1RZUEUgKmNvbnN0JiB0eXBlbWFwcyBmb3Igc3VwcG9ydGluZyBwb2ludGVycwogICAgICAgICAgICBieSBjb25zdCByZWZlcmVuY2UuCgoyMDIyLTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICAjMjE2MCBGaXggY29tcGlsZSBlcnJvciB3aGVuIHVzaW5nIHRlbXBsYXRlcyB3aXRoIG1vcmUgdGhhbiBvbmUgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVyIGFuZCB1c2VkIGFzIGFuIGlucHV0IHBhcmFtZXRlciBpbiBhIHZpcnR1YWwgbWV0aG9kIGluIGEKICAgICAgICAgICAgZGlyZWN0b3IgY2xhc3MgKHByb2JsZW0gYWZmZWN0aW5nIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMpLgoKMjAyMi0xMC0xMDogdHJlaXRtYXlyLCB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5XSAjMTgxMSAjMTgyMyBGaXggaW52YWxpZCBjb2RlIGdlbmVyYXRlZCBpbiBzb21lIGNhc2VzIHdoZW4KICAgICAgICAgICAgcmV0dXJuaW5nIGEgcG9pbnRlciBvciByZWZlcmVuY2UgdG8gYSBkaXJlY3Rvci1lbmFibGVkIGNsYXNzIGluc3RhbmNlLgogICAgICAgICAgICBUaGlzIHByZXZpb3VzbHkgb25seSB3b3JrZWQgaW4gdmVyeSBzaW1wbGUgY2FzZXMsIG5vdyByZXR1cm4gdHlwZXMgYXJlCiAgICAgICAgICAgIHJlc29sdmVkIHRvIGZpeC4gQSBidWcgaW4gdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMgdXNpbmcgcG9pbnRlcnMgYWxzbwogICAgICAgICAgICB3b3JrcyBub3cuCgoyMDIyLTEwLTA2OiB3c2Z1bHRvbgoJICAgIFtDRkZJXSAjMTk2NiAjMjIwMCBSZW1vdmUgY29kZSBmb3IgQ29tbW9uIExpc3AgQ0ZGSS4gIFdlIGRyb3BwZWQgc3VwcG9ydAoJICAgIGZvciBpdCBpbiBTV0lHIDQuMC4wIGJ5IGRpc2FibGluZyBpdCBhcyB0aGUgZmlyc3Qgc3RhZ2UuIFRoaXMgaXMgdGhlCiAgICAgICAgICAgIGZpbmFsIHN0YWdlIGZvciBjb21wbGV0ZSByZW1vdmFsIGFzIHRoZXJlIGhhcyBiZWVuIG5vIG1lYW5pbmdmdWwKICAgICAgICAgICAgcHJvZ3Jlc3MgdG8gcmV2aXZlIGl0IHRvIHRoZSBzdGF0dXMgb2YgZXhwZXJpbWVudGFsIGxhbmd1YWdlLgoKMjAyMi0xMC0wNjogb2xseQoJICAgIFtQeXRob25dICMyMzkwIFJlbW92ZSBkZXByZWNhdGVkIGFuZCBhcHBhcmVudGx5IHVzZWxlc3MgZGVmYXJnLnN3ZwoKCSAgICBUaGUgb25seSBkb2N1bWVudGF0aW9uIGlzIGluIHRoZSBmaWxlIGl0c2VsZiBhbmQgZGVzY3JpYmVzIGEgUHl0aG9uCgkgICAgd3JhcHBlciBhcm91bmQgdGhlIEMgZnVuY3Rpb24gZGVmaW5lZCBoZXJlLCBidXQgZGlnZ2luZyB0aG91Z2ggdGhlCgkgICAgZ2l0IGhpc3RvcnkgdGhpcyBQeXRob24gd3JhcHBlciBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBldmVyIGFjdHVhbGx5CgkgICAgYmVlbiBnZW5lcmF0ZWQgYnkgU1dJRy4KCgkgICAgVGhpcyBmaWxlIHdhcyBhbHNvIG1hcmtlZCBhcyBkZXByZWNhdGVkIGluIDIwMDUuCgoyMDIyLTEwLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzIwNDggRml4IHF1b3RpbmcgZm9yIGRveHlnZW4gXGltYWdlIGNvbW1hbmQgdG8gcXVvdGUgdGhlIG91dHB1dAogICAgICAgICAgICBmaWxlIG5hbWUgZ2VuZXJhdGVkIGludG8gdGhlIGh0bWwgc3JjIGF0dHJpYnV0ZS4KCjIwMjItMTAtMDU6IGJlbmphbWluLXNjaAogICAgICAgICAgICBbUHl0aG9uXSBhZGRlZCBhbiBpbnRlcnByZXRlciBjb3VudGVyIHRvIGZpeCBkZWluaXRpYWxpemF0aW9uCiAgICAgICAgICAgIGlzc3VlcyBpZiBtdWx0aXBsZSBzdWJpbnRlcnByZXRlcnMgYXJlIHVzZWQKCjIwMjItMTAtMDU6IG9sbHksIHdzZnVsdG9uCiAgICAgICAgICAgICM2NzIgQWRkIHN1cHBvcnQgZm9yIHBhcnNpbmcgQysrMTEgZmluYWwgY2xhc3NlcyBzdWNoIGFzOgoKICAgICAgICAgICAgICBjbGFzcyBYIGZpbmFsIHt9OwoKICAgICAgICAgICAgVGhpcyBubyBsb25nZXIgZ2l2ZXMgYSBzeW50YXggZXJyb3IuCgoyMDIyLTEwLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbT0NhbWxdIEZpeCAlcmVuYW1lIGZvciBlbnVtIGl0ZW1zLiBQcmV2aW91c2x5IHRoZSByZW5hbWUgaGFkIG5vIGVmZmVjdC4KCjIwMjItMTAtMDU6IG9sbHkKCSAgICAjMTQ2NSBSZXBvcnQgZXJyb3JzIGluIHByZXByb2Nlc3NvciBleHByZXNzaW9ucyBieSBkZWZhdWx0CgoJICAgIFVudGlsIG5vdyBTV0lHIHF1aWV0bHkgaWdub3JlZCBzdWNoIGVycm9ycyB1bmxlc3MgLVdleHRyYSAob3IgLVdhbGwKCSAgICB3aGljaCBpbXBsaWVzIC1XZXh0cmEpIHdhcyBwYXNzZWQsIGJ1dCB0aGlzIGlzIHVuaGVscGZ1bCBhcyBpdCB0ZW5kcwoJICAgIHRvIGhpZGUgZ2VudWluZSBwcm9ibGVtcy4gIFRvIGlsbHVzdHJhdGUgdGhpcyBwb2ludCwgZW5hYmxpbmcgdGhpcwoJICAgIHdhcm5pbmcgYnkgZGVmYXVsdCByZXZlYWxlZCBhIHR5cG8gaW4gdGhlIHByZXByb2NfZGVmaW5lZC5pCgkgICAgdGVzdGNhc2UgaW4gU1dJRydzIG93biB0ZXN0c3VpdGUuCgoJICAgIElmIHlvdSByZWFsbHkgZG9uJ3Qgd2FudCB0byBzZWUgdGhpcyB3YXJuaW5nLCB5b3UgY2FuIHN1cHByZXNzIGl0CgkgICAgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uIC13MjAyIG9yIGJ5IHVzaW5nIHRoaXMgaW4geW91ciBpbnRlcmZhY2UKCSAgICBmaWxlOgoKCSAgICAld2FybmZpbHRlcihTV0lHV0FSTl9QUF9FVkFMVUFUSU9OKTsKCgkgICAgQm90aCB3aWxsIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHIHRvby4KCjIwMjItMTAtMDQ6IG9sbHkKCSAgICAjMTA1MCBDb25zaXN0ZW50bHkgZGVmaW5lIFNXSUdfVkVSU0lPTiBib3RoIGF0IFNXSUctdGltZSBhbmQgaW4KCSAgICB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIuICBCZXN0IHByYWN0aWNlIHJlbWFpbnMgdG8gY2hlY2sgYXQgU1dJRy10aW1lCgkgICAgd2hlcmUgcG9zc2libGUgYmVjYXVzZSB0aGF0IHJlc3VsdHMgaW4gc21hbGxlciBnZW5lcmF0ZWQgd3JhcHBlcgoJICAgIHNvdXJjZXMuCgoJICAgIFNXSUdHTyBhbmQgU1dJR0pBVkFTQ1JJUFQgYXJlIG5vdyBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKCSAgICB0byBtYXRjaCBiZWhhdmlvdXIgZm9yIGFsbCBvdGhlciB0YXJnZXQgbGFuZ3VhZ2VzLgoKCSAgICBUaGUgdW5kb2N1bWVudGVkIFNXSUdWRVJTSU9OIG1hY3JvIGlzIG5vIGxvbmdlciBkZWZpbmVkLgoKMjAyMi0wOS0yOTogb2xseQoJICAgICMyMzAzIFNXSUcncyBpbnRlcm5hbCBoYXNoIHRhYmxlcyBub3cgdXNlIGEgYmV0dGVyIGhhc2ggZnVuY3Rpb24uCgoJICAgIFRoZSBvbGQgaGFzaCBmdW5jdGlvbiBvbmx5IGNvbnNpZGVyZCB0aGUgbGFzdCBmaXZlIGNoYXJhY3RlcnMKCSAgICBwbHVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxhc3QtYnV0LXNpeHRoIGNoYXJhY3RlciwKCSAgICB3aGljaCBhcyB5b3UgbWlnaHQgZ3Vlc3MgZ2VuZXJhdGVkIGEgbG90IG9mIG1hbnktd2F5IGNvbGxpc2lvbnMuCgoJICAgIFRoaXMgY2hhbmdlIHNlZW1zIHRvIGdpdmUgYWJvdXQgYSA0JSByZWR1Y3Rpb24gaW4gd2FsbGNsb2NrIHRpbWUKCSAgICBmb3IgcHJvY2Vzc2luZyBsaV9zdGRfbGlzdF93cmFwLmkgZnJvbSB0aGUgdGVzdHN1aXRlIGZvciBQeXRob24uCgkgICAgVGhlIGhhc2ggY29sbGlzaW9uIHJhdGUgZm9yIHRoaXMgZXhhbXBsZSBkcm9wcyBmcm9tIDM5JSB0byAwIQoKMjAyMi0wOS0yOTogd3NmdWx0b24KICAgICAgICAgICAgIzIzMDMgVHlwZSB0YWJsZXMgYXJlIG5vdyBvdXRwdXQgaW4gYSBmaXhlZCBvcmRlciB3aGVyZWFzIHByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG9yZGVyIG1heSBjaGFuZ2Ugd2l0aCBhbnkgbWlub3IgaW5wdXQgY29kZSBjaGFuZ2UuIFRoaXMgc2hvdWxkbid0CiAgICAgICAgICAgIGFmZmVjdCB1c2VycyBleGNlcHQgU1dJR19UeXBlUHJldHR5TmFtZSBtYXkgb3V0cHV0IGEgZGlmZmVyZW50IEMvQysrCiAgICAgICAgICAgIHR5cGVkZWYgdG8gYSB0eXBlIC0gaXQncyB1c2VkIG1vc3RseSBmb3Igc2hvd2luZyBlcnJvcnMgd2hlbiB0aGUgdHlwZQogICAgICAgICAgICBwYXNzZWQgdG8gYSBmdW5jdGlvbiBpcyB3cm9uZy4KCjIwMjItMDktMjk6IG9sbHkKCSAgICBbUEhQXSBEeW5hbWljIGNsYXNzIHByb3BlcnRpZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4KCgkgICAgSGlzdG9yaWNhbGx5IFBIUCBoYXMgc3VwcG9ydGVkIGR5bmFtaWMgY2xhc3MgcHJvcGVydGllcyBhbmQgU1dJRwoJICAgIGhhcyBpbXBsZW1lbnRlZCB0aGVtIHRvbyAoYmVjYXVzZSB3ZSBpbXBsZW1lbnQgdGhlIG1hZ2ljIF9fZ2V0KCksCgkgICAgX19zZXQoKSBhbmQgX19pc3NldCgpIG1ldGhvZHMgd2UgbmVlZCB0byBpbmNsdWRlIGV4cGxpY2l0CgkgICAgaGFuZGxpbmcpLgoKCSAgICBQSFAgOC4yIGRlcHJlY2F0ZXMgZHluYW1pYyBjbGFzcyBwcm9wZXJ0aWVzIC0gaW5pdGlhbGx5IHRoZXknbGwKCSAgICB3YXJuLCBhbmQgYXBwYXJlbnRseSB0aGV5J2xsIG5vdCB3b3JrIGJ5IGRlZmF1bHQgaW4gUEhQIDkuMDoKCSAgICBodHRwczovL3dpa2kucGhwLm5ldC9yZmMvZGVwcmVjYXRlX2R5bmFtaWNfcHJvcGVydGllcwoKCSAgICBJbiBQSFAgY29kZSBkeW5hbWljIHByb3BlcnRpZXMgY2FuIGJlIGVuYWJsZWQgZm9yIGEgY2xhc3MgYnkKCSAgICBtYXJraW5nIHRoYXQgY2xhc3Mgd2l0aCB0aGUgYXR0cmlidXRlIGAjW0FsbG93RHluYW1pY1Byb3BlcnRpZXNdYC4KCgkgICAgVG8gZm9sbG93IHRoaXMgUEhQIGNoYW5nZSwgaW4gU1dJRyB5b3Ugbm93IG5lZWQgdG8gc3BlY2lmeQoJICAgIGAlZmVhdHVyZSgicGhwOmFsbG93ZHluYW1pY3Byb3BlcnRpZXMiLCAxKSBGb287YCAob3IKCSAgICBgJWZlYXR1cmUoInBocDphbGxvd2R5bmFtaWNwcm9wZXJ0aWVzIiwgMSlgIHRvIGVuYWJsZSBpdCBmb3IKCSAgICBhbGwgd3JhcHBlZCBjbGFzc2VzKS4gIFVua25vd24gZmVhdHVyZXMgYXJlIGlnbm9yZWQsIHNvIHlvdSBjYW4gYWRkCgkgICAgaXQgdW5jb25kaXRpb25hbGx5IGFuZCBpdCdsbCB3b3JrIHdpdGggb2xkZXIgU1dJRyB0b28uCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wOS0xOTogd3NmdWx0b24KICAgICAgICAgICAgIzE0ODQgRml4ZXMgZm9yIGNsYXNzIGluaGVyaXRhbmNlIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcwogICAgICAgICAgICBzdWNoIGFzOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgQSB7IGNsYXNzIEJhciB7fTsgfQogICAgICAgICAgICAgIG5hbWVzcGFjZSBCIHsgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gY2xhc3MgQmFyIDogcHVibGljIEE6OkJhciB7fTsgfQoKMjAyMi0wOS0xOTogd3NmdWx0b24KICAgICAgICAgICAgIzIzMTYgUmVtb3ZlIHN3aWcuc3BlYyBmaWxlIGFuZCBzcmNycG0gbWFrZWZpbGUgdGFyZ2V0LiBUaGVzZSBhcmUgdmVyeSBvdXQgb2YgZGF0ZQogICAgICAgICAgICBhbmQgZG9uJ3Qgc2VlbSB0byBiZSB1c2VkIGJ5IFJQTSBiYXNlZCBMaW51eCBkaXN0cmlidXRpb25zIHdoaWNoIGhhdmUgdGhlaXIKICAgICAgICAgICAgb3duIHZlcnNpb24gb2Ygc3dpZy5zcGVjLgoKMjAyMi0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvLCBHdWlsZSwgUmFja2V0LCBTY2lsYWJdIEFkZCB0aHJvd3MgdHlwZW1hcHMgZm9yIHN0ZDo6c3RyaW5nIHNvIHRoYXQgdGhyb3duCiAgICAgICAgICAgIHN0cmluZyBleGNlcHRpb24gbWVzc2FnZXMgY2FuIGJlIHNlZW4uCgoyMDIyLTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUmFja2V0XSBBZGQgdGhyb3dzIHR5cGVtYXBzIGZvciBjaGFyICogc28gdGhhdCB0aHJvd24gc3RyaW5nIGV4Y2VwdGlvbgogICAgICAgICAgICBtZXNzYWdlcyBjYW4gYmUgc2VlbiBmcm9tIFJhY2tldC4KCjIwMjItMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0LCBPY3RhdmUsIFJdIEltcHJvdmUgZXhjZXB0aW9ucyBmb3IgJWNhdGNoZXMgYW5kIGV4Y2VwdGlvbgogICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyBmb3IgbmF0aXZlIHR5cGVzLiBTdHJpbmcgZXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBzaG93biBhcwogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgaW5zdGVhZCBvZiBqdXN0IHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24uCgoyMDIyLTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgbWlzc2luZyB0eXBlY2hlY2sgdHlwZW1hcHMgZm9yIHN0ZDo6YXV0b19wdHIgYW5kIHN0ZDo6dW5pcXVlX3B0ciB0bwogICAgICAgICAgICBmaXggb3ZlcmxvYWRpbmcgd2hlbiB1c2luZyB0aGVzZSB0eXBlcy4KCjIwMjItMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHdWlsZV0gQWRkIGVycm9yIGNoZWNraW5nIHRvIFNXSUdUWVBFIGFuZCBTV0lHVFlQRSAmIGluIHR5cGVtYXBzIHRvIHByZXZlbnQKICAgICAgICAgICAgc2VnIGZhdWx0cyB3aGVuIHBhc3NpbmcgI25pbCB0byB0aGVzZSBwYXJhbWV0ZXIgdHlwZXMuCgoyMDIyLTA5LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICAjOTk5IFByb3ZpZGUgU1dJR1RZUEUgTU9WRSB0eXBlbWFwcyBpbiBzd2lnbW92ZS5pIGZvciBpbXBsZW1lbnRpbmcgZnVsbAogICAgICAgICAgICBtb3ZlIHNlbWFudGljcyB3aGVuIHBhc3NpbmcgcGFyYW1ldGVycyBieSB2YWx1ZS4KCjIwMjItMDgtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgICM5OTkgSW1wcm92ZSBtb3ZlIHNlbWFudGljcyB3aGVuIHVzaW5nIHJ2YWx1ZSByZWZlcmVuY2VzLgogICAgICAgICAgICBUaGUgU1dJR1RZUEUgJiYgaW5wdXQgdHlwZW1hcHMgbm93IGFzc3VtZSB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vdmVkLgoKICAgICAgICAgICAgVGhlc2UgdHlwZW1hcHMgaGF2ZSBiZWVuIGNoYW5nZWQgYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbCwKICAgICAgICAgICAgdGhlIHJ2YWx1ZSByZWZlcmVuY2UgcGFyYW1ldGVyIGhhcyBiZWVuIG1vdmVkLiBUaGUgcGFyYW1ldGVyJ3MgcHJveHkgY2xhc3MKICAgICAgICAgICAgdGhhdCBvd25zIHRoZSBDKysgb2JqZWN0IHRodXMgaGFzIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIgc2V0IHRvIG51bGwKICAgICAgICAgICAgc28gdGhhdCB0aGUgKG1vdmVkIGZyb20sIGJ1dCBzdGlsbCB2YWxpZCkgQysrIG9iamVjdCBjYW5ub3QgYmUgdXNlZCBhZ2FpbgogICAgICAgICAgICBhbmQgdGhlIG9iamVjdCBpcyBhZGRpdGlvbmFsbHkgZGVsZXRlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wOC0yODogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gU1dJRyBub3cgbWFyc2hhbHMgYSBDL0MrKyBOVUxMIHBvaW50ZXIgaW50byB0aGUgbnVsbCBtYXRyaXgsIFtdLgogICAgICAgICAgICBTV0lHIGhhcyBhbHdheXMgbWFyc2hhbGxlZCB0aGUgbnVsbCBtYXRyaXggaW50byBhIE5VTEwgcG9pbnRlcjsgdGhpcyByZW1haW5zCiAgICAgICAgICAgIGFuZCBub3cgd2UgaGF2ZSBjb25zaXN0ZW5jeSBpbiByZXByZXNlbnRpbmcgYSBOVUxMIHBvaW50ZXIuCgoyMDIyLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUmFja2V0XSBTV0lHIG5vdyBtYXJzaGFscyBhIEMvQysrIE5VTEwgcG9pbnRlciBpbnRvIGEgbnVsbCB2YWx1ZSBieSBjYWxsaW5nCiAgICAgICAgICAgIHNjaGVtZV9tYWtlX251bGwoKSwgc28gdGhhdCBzY2hlbWUncyBudWxsPyBpcyB0cnVlIGZvciBhIE5VTEwgQy9DKysgcG9pbnRlciB2YWx1ZS4KCjIwMjItMDgtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSYWNrZXRdIEFkZCBzdXBwb3J0IGZvciBzdGQ6OnVuaXF1ZV9wdHIgaW4gc3RkX3VuaXF1ZV9wdHIuaS4KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6YXV0b19wdHIgaW4gc3RkX2F1dG9fcHRyLmkuCgoyMDIyLTA4LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbR3VpbGVdIEFkZCBzdXBwb3J0IGZvciBzdGQ6OnVuaXF1ZV9wdHIgaW4gc3RkX3VuaXF1ZV9wdHIuaS4KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHN0ZDo6YXV0b19wdHIgaW4gc3RkX2F1dG9fcHRyLmkuCgoyMDIyLTA4LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjp1bmlxdWVfcHRyIGluIHN0ZF91bmlxdWVfcHRyLmkuCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBzdGQ6OmF1dG9fcHRyIGluIHN0ZF9hdXRvX3B0ci5pLgoKMjAyMi0wOC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0RdIEZpeCBvY2Nhc2lvbmFsIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2l0aCBpbmhlcml0YW5jZSBoaWVyYXJjaGllcywgcGFydGljdWxhcmx5CiAgICAgICAgICAgIHdoZW4gdXNpbmcgdmlydHVhbCBpbmhlcml0YW5jZSBhcyB0aGUgcG9pbnRlcnMgd2VyZW4ndCBjb3JyZWN0bHkgdXBjYXN0IGZyb20gZGVyaXZlZAogICAgICAgICAgICBjbGFzcyB0byBiYXNlIGNsYXNzIHdoZW4gc3RvcmVkIGluIHRoZSBiYXNlJ3MgcHJveHkgY2xhc3MuCgoyMDIyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbRF0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dW5pcXVlX3B0ciBpbiBzdGRfdW5pcXVlX3B0ci5pLgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3Igc3RkOjphdXRvX3B0ciBpbiBzdGRfYXV0b19wdHIuaS4KCjIwMjItMDgtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBBZGQgc3VwcG9ydCBmb3Igc3RkOjp1bmlxdWVfcHRyIGluIHN0ZF91bmlxdWVfcHRyLmkuCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBzdGQ6OmF1dG9fcHRyIGluIHN0ZF9hdXRvX3B0ci5pLgoKMjAyMi0wOC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dW5pcXVlX3B0ciBpbiBzdGRfdW5pcXVlX3B0ci5pLgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3Igc3RkOjphdXRvX3B0ciBpbiBzdGRfYXV0b19wdHIuaS4KCjIwMjItMDgtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBpbml0aWFsaXNlcnMgZm9yIGFkZGl0aW9uYWwgbWVtYmVycyBpbiBQeUhlYXBUeXBlT2JqZWN0CiAgICAgICAgICAgIChidWlsdGluIG1vZGUpIGZvciBQeXRob24tMy4xMSAtIF9odF90cG5hbWUsIF9zcGVjX2NhY2hlLgoKMjAyMi0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgQysrMjAgaGFzIGRlcHJlY2F0ZWQgc3RkOjpiYXNpY19zdHJpbmc8Pjo6cmVzZXJ2ZSgpIGFuZCB0aGUgQysrMTEgbWV0aG9kCiAgICAgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPD46OnNocmlua190b19maXQoKSBpcyBhIHJlcGxhY2VtZW50IHRoYXQgY2FuIGJlIHVzZWQuCiAgICAgICAgICAgIHN0ZF9zdHJpbmcuaSBhbmQgc3RkX3dzdHJpbmcuaSBwcm92aWRlZCB3cmFwcGVycyBmb3IgcmVzZXJ2ZSB3aXRoIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnM6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh3c3RyaW5nKSBzdGQ6OmJhc2ljX3N0cmluZzx3Y2hhcl90PjsKCiAgICAgICAgICAgIFRoZSByZXNlcnZlIG1ldGhvZCBpcyBubyBsb25nZXIgd3JhcHBlZCwgaG93ZXZlciB0aGUgc2hyaW5rX3RvX2ZpdCgpIG1ldGhvZAogICAgICAgICAgICBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmcm9tIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgKHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKICAgICAgICAgICAgY2FsbCByZXNlcnZlKCkgaW5zdGVhZCBpZiBDKys8PTIwKS4KCiAgICAgICAgICAgIE5vdGUgdGhhdCBzdGQ6OmJhc2ljX3N0cmluZzw+OjpyZXNlcnZlKHNpemVfdCBuKSBpcyBzdGlsbCB3cmFwcGVkIHVuY2hhbmdlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dW5pcXVlX3B0ciBpbiBzdGRfdW5pcXVlX3B0ci5pLgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3Igc3RkOjphdXRvX3B0ciBpbiBzdGRfYXV0b19wdHIuaS4KCjIwMjItMDctMjc6IFphY2tlcnlTcHl0eiwgb2xseQoJICAgICMxNjc4IFN1cHBvcnQgcGFyc2luZyBDKysyMCB0ZW1wbGF0ZWQgbGFtYmRhcy4KCjIwMjItMDctMjc6IFphY2tlcnlTcHl0eiwgb2xseQoJICAgICMxNjIyIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrMjAgc3BhY2VzaGlwIG9wZXJhdG9yICg8PT4pLgoKMjAyMi0wNy0yNjogb2xseQoJICAgIFtUY2xdIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzk3Ny8KCSAgICBGaXggaGFuZGxpbmcgb2YgbG9uZyBsb25nIG9uIDMyLWJpdCBwbGF0Zm9ybXMuICBUaGlzIGZpeCByYWlzZXMKCSAgICBTV0lHJ3MgbWluaW11bSBzdXBwb3J0ZWQgVGNsIHZlcnNpb24gdG8gOC40LjAgKHdoaWNoIHdhcyByZWxlYXNlZAoJICAgIGp1c3QgdW5kZXIgMjAgeWVhcnMgYWdvKS4KCjIwMjItMDctMjY6IG9sbHkKICAgICAgICAgICAgRml4IGluY29ycmVjdCBvcGVyYXRvciBwcmVjZWRlbmNlIGluIHByZXByb2Nlc3NvciBleHByZXNzaW9ucy4KCjIwMjItMDctMjU6IG9sbHkKCSAgICBTdXBwb3J0IGZvciBDKysxNCBiaW5hcnkgaW50ZWdlciBsaXRlcmFscyBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuCgoyMDIyLTA3LTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEVuc3VyZSB0aGUgb3JkZXIgb2YgaW50ZXJmYWNlcyBnZW5lcmF0ZWQgaW4gcHJveHkgaW50ZXJmYWNlcyBmb3IgdGhlCiAgICAgICAgICAgICVpbnRlcmZhY2UgZmFtaWx5IG9mIG1hY3JvcyBpcyB0aGUgc2FtZSBhcyB0aGF0IHBhcnNlZCBmcm9tIHRoZSBiYXNlcyBpbiBDKysuCgoyMDIyLTA3LTIwOiBqaWNrcywgSW5nZW5lcjc0LCBvbGx5CgkgICAgIzQyMiBbUHl0aG9uXSBGaXggbWlzaGFuZGxpbmcgb2YgYSBQeXRob24gY2xhc3MgaW5oZXJpdGluZyBmcm9tCgkgICAgbXVsdGlwbGUgU1dJRy13cmFwcGVkIGRpcmVjdG9yIGNsYXNzZXMuCgoyMDIyLTA3LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICAjNjkyIFtDIywgSmF2YSwgUGVybCwgUHl0aG9uLCBSdWJ5XSBzdGQ6OnVuaXF1ZV9wdHIgYW5kIHN0ZDo6YXV0b19wdHIgdHlwZW1hcHMKICAgICAgICAgICAgcHJvdmlkZWQgZm9yIGlucHV0cyB0eXBlcyBpbiBzdGRfdW5pcXVlX3B0ci5pIGFuZCBzdGRfYXV0b19wdHIuaS4KCiAgICAgICAgICAgIE5vdyB0aGVzZSBzbWFydCBwb2ludGVycyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9ucy4gQSBwcm94eQogICAgICAgICAgICBjbGFzcyBpbnN0YW5jZSB0cmFuc2ZlcnMgbWVtb3J5IG93bmVyc2hpcCBvZiB0aGUgdW5kZXJseWluZyBDKysgb2JqZWN0IGZyb20gdGhlCiAgICAgICAgICAgIHByb3h5IGNsYXNzIHRvIGEgc21hcnQgcG9pbnRlciBpbnN0YW5jZSBwYXNzZWQgdG8gdGhlIHdyYXBwZWQgZnVuY3Rpb24uCgoyMDIyLTA3LTE5OiBqc2NodWVsbGVyCgkgICAgW1B5dGhvbl0gIzIzMTQgRHJvcCBzdXBwb3J0IGZvciBQeXRob24gMy4yLgoKMjAyMi0wNy0xOTogb2xseQoJICAgIFJlbW92ZSByZW1haW5pbmcgc3VwcG9ydCBjb2RlIGZvciBjbGFzc2ljIG1hY29zLCB3aGljaCBoYXMgbm90IGJlZW4KCSAgICBzdXBwb3J0ZWQgYnkgQXBwbGUgZm9yIG92ZXIgMjAgeWVhcnMgbm93LgoKMjAyMi0wNy0xMjogd3NmdWx0b24KICAgICAgICAgICAgIzk5OSBQZXJmb3JtYW5jZSBvcHRpbWlzYXRpb24gZm9yIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHZhbHVlIHRoYXQgYXJlIEMrKzExIG1vdmFibGUuCiAgICAgICAgICAgIFRoZSBDKysgd3JhcHBlcnMgY3JlYXRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBhIHBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gYQogICAgICAgICAgICBmdW5jdGlvbi4gVGhpcyBpcyBpbml0aWFsbHkgZGVmYXVsdCBjb25zdHJ1Y3RlZCBhbmQgdGhlbiBjb3B5IGFzc2lnbmVkIGZyb20gdGhlCiAgICAgICAgICAgIGluc3RhbmNlIGJlaW5nIHBhc3NlZCBpbiBmcm9tIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgaXMgdW5jaGFuZ2VkLCBob3dldmVyLAogICAgICAgICAgICB3aGVuIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgaXMgcGFzc2VkIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLCBpdCBpcyBub3cgZG9uZSB1c2luZwogICAgICAgICAgICBzdGQ6Om1vdmUuIElmIHRoZSB0eXBlIGlzIG1vdmUgY29uc3RydWN0aWJsZSwgdGhlIG1vdmUgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkCiAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGNvcHkgY29uc3RydWN0b3IuCgoyMDIyLTA3LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQWRkIHN0ZDo6YXV0b19wdHIgc3VwcG9ydCBpbiBzdGRfYXV0b19wdHIuaSBsaWJyYXJ5IGZpbGUuCgoyMDIyLTA3LTEyOiBlcmV6Z2V2YQogICAgICAgICAgICBbUGVybF0gQWRkIHN0ZDo6dW5pcXVlX3B0ciBzdXBwb3J0IGluIHN0ZF91bmlxdWVfcHRyLmkgbGlicmFyeSBmaWxlLgoKMjAyMi0wNy0wNzogam1hcnJlYwoJICAgICMxMTU4ICMyMjg2IEFkZCBiYXNpYyBzdXBwb3J0IGZvciBDKysxMSBhdHRyaWJ1dGVzLiAgVGhlc2UgYXJlIG5vdwoJICAgIGNydWRlbHkgaWdub3JlZCBieSBTV0lHJ3MgcGFyc2VyJ3MgdG9rZW5pc2VyLCB3aGljaCBpcyBiZXR0ZXIgdGhhbgoJICAgIGZhaWxpbmcgd2l0aCBhIHBhcnNlIGVycm9yLgoKMjAyMi0wNy0wNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dICMyMjQ1IEhhbmRsZSBOVUxMIHBvaW50ZXJzIGZvciBzdHJpbmcqIGNvbnZlcnNpb25zLgoJICAgIFJlYXJyYW5nZSBnZW5lcmF0aW9uIG9mIGRpcmVjdG9yIG1ldGhvZHMgYW5kIHJlbmFtZQoJICAgIHJlY2VpdmVyIGFyZ3VtZW50IGZyb20gcCB0byBzd2lnX3AuCgoyMDIyLTA3LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICAjOTk5IFBlcmZvcm1hbmNlIG9wdGltaXNhdGlvbiBmb3IgZGlyZWN0b3JzIGZvciBjbGFzc2VzIHBhc3NlZCBieSB2YWx1ZS4gVGhlIGRpcmVjdG9yaW4KICAgICAgICAgICAgdHlwZW1hcHMgaW4gdGhlIGRpcmVjdG9yIG1ldGhvZHMgbm93IHVzZSBzdGQ6Om1vdmUgb24gdGhlIGlucHV0IHBhcmFtZXRlciB3aGVuCiAgICAgICAgICAgIGNvcHlpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzdGFjayB0byB0aGUgaGVhcCBwcmlvciB0byB0aGUgY2FsbGJhY2sgaW50byB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlLCB0aGVyZWJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YgbW92ZSBzZW1hbnRpY3MgaWYgYXZhaWxhYmxlLgoKMjAyMi0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgIzE3MjIgW0MjLCBKYXZhLCBQeXRob24sIFJ1YnldIEFkZCBzdGQ6OnVuaXF1ZV9wdHIgc3VwcG9ydC4gUG9ydGVkIGZyb20gc3RkOjphdXRvX3B0ci4KICAgICAgICAgICAgVXNlIHRoZSAldW5pcXVlX3B0cihUKSBtYWNybyBhcyBmb2xsb3dzIGZvciB1c2FnZSBzdGQ6OnVuaXF1ZV9wdHI8VD4uIEZvciBleGFtcGxlLCBmb3IKICAgICAgICAgICAgYSBjbGFzcyBjYWxsZWQgS2xhc3M6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfdW5pcXVlX3B0ci5pIgogICAgICAgICAgICAgICV1bmlxdWVfcHRyKEtsYXNzKQoKICAgICAgICAgICAgU3VwcG9ydCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byBvbmx5IHJldHVybmluZyBhIHN0ZDo6dW5pcXVlX3B0ciBmcm9tIGEgZnVuY3Rpb24uCgoyMDIyLTA2LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICAjOTk5ICMxMDQ0IEVuaGFuY2UgU1dJR1RZUEUgIm91dCIgdHlwZW1hcHMgdG8gdXNlIHN0ZDo6bW92ZSB3aGVuIGNvcHlpbmcKICAgICAgICAgICAgb2JqZWN0cywgdGhlcmVieSBtYWtpbmcgdXNlIG9mIG1vdmUgc2VtYW50aWNzIHdoZW4gd3JhcHBpbmcgYSBmdW5jdGlvbiByZXR1cm5pbmcKICAgICAgICAgICAgYnkgdmFsdWUgaWYgdGhlIHJldHVybmVkIHR5cGUgc3VwcG9ydHMgbW92ZSBzZW1hbnRpY3MuCgogICAgICAgICAgICBXcmFwcGluZyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbW92ZSBvbmx5IHR5cGVzICdieSB2YWx1ZScgbm93IHdvcmsgb3V0IHRoZSBib3gKICAgICAgICAgICAgd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBjdXN0b20gdHlwZW1hcHMuCgogICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gcmVtb3ZlZCBhbGwgY2FzdHMgaW4gdGhlICJvdXQiIHR5cGVtYXBzIHRvIGFsbG93IHRoZSBjb21waWxlciB0bwogICAgICAgICAgICBhcHByb3ByaWF0ZWx5IGNob29zZSBjYWxsaW5nIGEgbW92ZSBjb25zdHJ1Y3Rvciwgd2hlcmUgcG9zc2libGUsIG90aGVyd2lzZSBhIGNvcHkKICAgICAgICAgICAgY29uc3RydWN0b3IuIFRoZSBpbXBsZW1lbnRhdGlvbiBhbHNvIHJlcXVpcmVkIG1vZGlmeWluZyBTd2lnVmFsdWVXcmFwcGVyIHRvCiAgICAgICAgICAgIGNoYW5nZSBhIGNhc3Qgb3BlcmF0b3IgZnJvbToKCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlcjo6b3BlcmF0b3IgVCYoKSBjb25zdDsKCiAgICAgICAgICAgIHRvCgogICAgICAgICAgICAgICNpZiBfX2NwbHVzcGx1cyA+PTIwMTEwM0wKICAgICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXI6Om9wZXJhdG9yIFQmJigpIGNvbnN0OwogICAgICAgICAgICAgICNlbHNlCiAgICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyOjpvcGVyYXRvciBUJigpIGNvbnN0OwogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgVGhpcyBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUgZm9yIEMrKzExIGFuZCBsYXRlciB3aGVuIHVzaW5nIHRoZSB2YWx1ZXdyYXBwZXIgZmVhdHVyZQogICAgICAgICAgICBpZiBhIGNhc3QgaXMgZXhwbGljaXRseSBiZWluZyBtYWRlIGluIHVzZXIgc3VwcGxpZWQgIm91dCIgdHlwZW1hcHMuIFN1Z2dlc3RlZCBjaGFuZ2UKICAgICAgICAgICAgaW4gY3VzdG9tICJvdXQiIHR5cGVtYXBzIGZvciBDKysxMSBhbmQgbGF0ZXIgY29kZToKCiAgICAgICAgICAgIDEuIFRyeSByZW1vdmUgdGhlIGNhc3QgYWx0b2dldGhlciB0byBsZXQgdGhlIGNvbXBpbGVyIHVzZSBhbiBhcHByb3ByaWF0ZSBpbXBsaWNpdCBjYXN0LgogICAgICAgICAgICAyLiBDaGFuZ2UgdGhlIGNhc3QsIGZvciBleGFtcGxlLCBmcm9tIHN0YXRpY19jYXN0PFggJj4gdG8gc3RhdGljX2Nhc3Q8WCAmJj4sIHVzaW5nIHRoZQogICAgICAgICAgICAgICBfX2NwbHVzcGx1cyBtYWNybyBpZiBhbGwgdmVyc2lvbnMgb2YgQysrIG5lZWQgdG8gYmUgc3VwcG9ydGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTA2LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjAzOSBBZGQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIFN3aWdWYWx1ZVdyYXBwZXIgdXNlZCBieSB0aGUKICAgICAgICAgICAgdmFsdWV3cmFwcGVyIGZlYXR1cmUuCgoyMDIyLTA2LTA0OiBzZXRocmoKICAgICAgICAgICAgRW5oYW5jZSAkdHlwZW1hcCB0byBzdXBwb3J0IHR5cGVtYXAgYXR0cmlidXRlcy4KCiAgICAgICAgICAgICAgJHR5cGVtYXAobWV0aG9kOmF0dHJpYnV0ZSwgdHlwZXBhdHRlcm4pCgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9Im9iamVjdCIpIFhDbGFzcyAiWENsYXNzIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzY29kZSkgQmFyQ2xhc3MgJXsKICAgICAgICAgICAgICAgICR0eXBlbWFwKGNzdHlwZTpvdXQsIFhDbGFzcykgYmFyKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgd2hpY2ggZXhwYW5kcyB0bwoKICAgICAgICAgICAgICAgIG9iamVjdCBiYXIoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKMjAyMi0wNS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBEXSBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uOiAkaW1mdW5jbmFtZS4KICAgICAgICAgICAgRXhwYW5kcyB0byB0aGUgZnVuY3Rpb24gbmFtZSBjYWxsZWQgaW4gdGhlIGludGVybWVkaWFyeSBjbGFzcy4KCjIwMjItMDUtMzA6IExpbmRsZXlGCiAgICAgICAgICAgIFtKYXZhXSAjMjA0MiBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uOiAkaW1mdW5jbmFtZS4KICAgICAgICAgICAgRXhwYW5kcyB0byB0aGUgZnVuY3Rpb24gbmFtZSBjYWxsZWQgaW4gdGhlIGludGVybWVkaWFyeSBjbGFzcy4KCjIwMjItMDUtMjg6IGprdWViYXJ0CiAgICAgICAgICAgIFtKYXZhXSBPbiBzb21lIHZlcnNpb25zIG9mIEFuZHJvaWQsIHNwZWNpZmljYWxseSBBbmRyb2lkIDYsCiAgICAgICAgICAgIGRldGFjaGluZyB0aGUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgSlZNIGFmdGVyIGV2ZXJ5IGludm9jYXRpb24KICAgICAgICAgICAgY2F1c2VzIGEgbWVtb3J5IGxlYWsuCgogICAgICAgICAgICBPZmZlciBTV0lHX0pBVkFfREVUQUNIX09OX1RIUkVBRF9FTkQgdG8gY29uZmlndXJlIGEgYmVoYXZpb3VyCiAgICAgICAgICAgIHdoZXJlIHRoZSBKVk0gaXMgb25seSBkZXRhY2hlZCBpbiB0aGUgdGhyZWFkIGRlc3RydWN0b3IuCgogICAgICAgICAgICBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvYXJ0aWNsZXMvcGVyZi1qbmkjdGhyZWFkcy4KCjIwMjItMDUtMjc6IHh5cHJvbgogICAgICAgICAgICBbUHl0aG9uXSAjMjI3NyBEZWZpbmUgUFlfU1NJWkVfVF9DTEVBTiBtYWNybyBiZWZvcmUgI2luY2x1ZGUgIlB5dGhvbi5oIiBhcwogICAgICAgICAgICByZWNvbW1lbmRlZCBpbiBQeXRob24gMy43IGFuZCBsYXRlci4KCiAgICAgICAgICAgIFRvIGF2b2lkIHRoaXMgbWFjcm8gZGVmaW5pdGlvbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBpbnRlcmZhY2UgZmlsZSBzbwogICAgICAgICAgICB0aGF0IFNXSUdfTk9fUFlfU1NJWkVfVF9DTEVBTiBpcyBkZWZpbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIEMrKyB3cmFwcGVyczoKCiAgICAgICAgICAgICAgJWJlZ2luICV7CiAgICAgICAgICAgICAgI2RlZmluZSBTV0lHX05PX1BZX1NTSVpFX1RfQ0xFQU4KICAgICAgICAgICAgICAlfQoKMjAyMi0wNS0yNjogcm9rdXBzCiAgICAgICAgICAgIFtDI10gIzEzMjMgTW9kaWZ5IFN3aWdEZXJpdmVkQ2xhc3NIYXNNZXRob2QgZm9yIGEgbW9yZSBlZmZpY2llbnQgZGlyZWN0b3IKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hlbiBjYWxsaW5nIHZpcnR1YWwgbWV0aG9kcyB0aGF0IGFyZSBub3Qgb3ZlcnJpZGRlbi4KCjIwMjItMDUtMTU6IGVyZXpnZXZhLCBlaXNlbGVrZAogICAgICAgICAgICBbTHVhLCBQZXJsLCBPY3RhdmUsIFBIUCwgVGNsXSAjMjI3NSAjMjI3NiAjMjI4MyBBZGQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGNvbnRhaW5pbmcKICAgICAgICAgICAgKGludCBBUkdDLCBjaGFyICoqQVJHVikgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgogICAgICAgICAgICBEb2N1bWVudCB0aGlzIGxpYnJhcnkgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMjItMDUtMDc6IEtyaXNUaGllbGVtYW5zCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIGZvciAnUHlIZWFwVHlwZU9iamVjdCciIGVycm9ycwogICAgICAgICAgICB1c2luZyBQeVB5IDMuOCBhbmQgbGF0ZXIuCgoyMDIyLTA1LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBDIyB3Y2hhcl90ICogZGlyZWN0b3IgdHlwZW1hcHMKCjIwMjItMDQtMjA6IGNtaW55YXJkCgkgICAgRml4IGFuIGlzc3VlIHdoZXJlIG5ld2xpbmVzIHdlcmUgbm90IHByb3Blcmx5IGdlbmVyYXRlZAoJICAgIGZvciBnb2RpcmVjdG9yaW4gdHlwZW1hcHMuICBJZiB5b3UgaGF2ZSBhIHZpcnR1YWwgZnVuY3Rpb24KCSAgICBub3QgYXNzaWduZWQgdG8gemVybywgaW4gc29tZSBjYXNlcyBpdCB3b24ndCBnZW5lcmF0ZSBhCgkgICAgbmV3bGluZSBhbmQgeW91IHdpbGwgc2VlIGVycm9yczoKCSAgICAgIGV4YW1wbGUuZ286MTUwODozOiBleHBlY3RlZCAnOycsIGZvdW5kIHN3aWdfcgoJICAgIHdoZW4gY29tcGlsaW5nIHRoZSBnbyBjb2RlLgoKCSAgICBBbHNvIGFkZCBhbiBleGFtcGxlIG9mIHVzaW5nIGdvaW4gYW5kIGdvZGlyZWN0b3JpbiBhbmQgYWRkCgkgICAgYSB0ZXN0IGZvciB0aGlzIHNpdHVhdGlvbi4KCjIwMjItMDQtMjk6IGphc29uLWRhbHksIEplcnJ5Sm95Y2UsIHdzZnVsdG9uCgkgICAgW0MjXSAjMTIzMyBBZGQgd2NoYXJfdCAqIGFuZCBzdGQ6OndzdHJpbmcgVW5pY29kZSBzdHJpbmcgc3VwcG9ydCBvbiBMaW51eC4KCjIwMjItMDQtMTE6IHJvYmluc3QKCSAgICAjMjI1NyBGaXggbmV3IFJ1YnkgMy4yIHdhcm5pbmcgInVuZGVmaW5pbmcgdGhlIGFsbG9jYXRvciBvZiBUX0RBVEEKCSAgICBjbGFzcyBzd2lnX3J1bnRpbWVfZGF0YSIuCgoyMDIyLTA0LTA3OiBvbGx5CgkgICAgIzE3NTAgU1dJRyBub3cgcmVjb2duaXNlcyBhbmQgaWdub3JlcyBEb3h5Z2VuIGdyb3VwIGNvbW1hbmRzIGBAe2AgYW5kIGBAfWAuCgoyMDIyLTA0LTA2OiB3c2Z1bHRvbgogICAgICAgICAgICAuL2NvbmZpZ3VyZSBub3cgZW5hYmxlcyBDKysxMSBhbmQgbGF0ZXIgQysrIHN0YW5kYXJkcyB0ZXN0aW5nIGJ5IGRlZmF1bHQgKHdoZW4KICAgICAgICAgICAgcnVubmluZzogJ21ha2UgY2hlY2snKS4KCiAgICAgICAgICAgIFRoZSBvcHRpb25zIHRvIGNvbnRyb2wgdGhpcyB0ZXN0aW5nIGFyZSB0aGUgc2FtZToKCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS1lbmFibGUtY3BwMTEtdGVzdGluZwogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1jcHAxMS10ZXN0aW5nCgogICAgICAgICAgICBCdXQgdGhlIGZvcm1lciBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIHRoZSBsYXR0ZXIgY2FuIGJlIHVzZWQgdG8gdHVybiBvZmYgQysrMTEgYW5kCiAgICAgICAgICAgIGxhdGVyIEMrKyBzdGFuZGFyZHMgdGVzdGluZy4KCjIwMjItMDQtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNjM1IFRoZSAiYXV0b2RvYyIgZmVhdHVyZSBubyBsb25nZXIgb3ZlcnJpZGVzIERveHlnZW4gY29tbWVudHMKICAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCBkb2NzdHJpbmcuCgogICAgICAgICAgICBJZiBhICJkb2NzdHJpbmciIGZlYXR1cmUgaXMgcHJlc2VudCBpdCB3aWxsIHN0aWxsIG92ZXJyaWRlIGEgRG94eWdlbiBjb21tZW50LgogICAgICAgICAgICBJZiB0aGUgImF1dG9kb2MiIGZlYXR1cmUgaXMgYWxzbyBwcmVzZW50LCB0aGUgY29tYmluZWQgImF1dG9kb2MiIGFuZCAiZG9jc3RyaW5nIgogICAgICAgICAgICB3aWxsIG92ZXJyaWRlIHRoZSBEb3h5Z2VuIGNvbW1lbnQuIElmIG5vICJkb2NzdHJpbmciIGlzIHByZXNlbnQgdGhlbiB0aGUKICAgICAgICAgICAgImF1dG9kb2MiIGZlYXR1cmUgd2lsbCBub3QgYmUgZ2VuZXJhdGVkIHdoZW4gdGhlcmUgaXMgYSBEb3h5Z2VuIGNvbW1lbnQuCgogICAgICAgICAgICBUaGlzIHdheSB0aGUgImF1dG9kb2MiIGZlYXR1cmUgY2FuIGJlIHNwZWNpZmllZCBhbmQgdXNlZCB0byBwcm92aWRlIGRvY3VtZW50YXRpb24KICAgICAgICAgICAgZm9yICdtaXNzaW5nJyBEb3h5Z2VuIGNvbW1lbnRzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTA0LTAxOiBvbGx5CgkgICAgUmVtb3ZlIHVuZG9jdW1lbnRlZCBhbmQgbm9uLWZ1bmN0aW9uYWwgLWJyb3dzZSBjb21tYW5kIGxpbmUgb3B0aW9uLgoKMjAyMi0wMy0yNjogZWx0b2RlcgogICAgICAgICAgICBbUHl0aG9uXSAjMTY4NCBVc2UgZGlmZmVyZW50IGNhcHN1bGUgbmFtZXMgd2l0aCBhbmQgd2l0aG91dCAtYnVpbHRpbgoKICAgICAgICAgICAgVHlwZXMgZ2VuZXJhdGVkIHdpdGggYW5kIHdpdGhvdXQgLWJ1aWx0aW4gYXJlIG5vdCBjb21wYXRpYmxlLiBNaXhpbmcKICAgICAgICAgICAgdGhlbSBpbiBhIGNvbW1vbiB0eXBlIGxpc3QgbGVhZHMgdG8gY3Jhc2hlcy4gQXZvaWQgdGhpcyBieSB1c2luZwogICAgICAgICAgICBkaWZmZXJlbnQgY2Fwc3VsZSBuYW1lczogInR5cGVfcG9pbnRlcl9jYXBzdWxlIiB3aXRob3V0IC1idWlsdGluIGFuZAogICAgICAgICAgICAidHlwZV9wb2ludGVyX2NhcHN1bGVfYnVpbHRpbiIgd2l0aC4KCjIwMjItMDMtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZWJ1ZyBjb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IGRpc3BsYXkgcGFyc2UgdHJlZSBub2RlcwogICAgICAgICAgICAoLWRlYnVnLW1vZHVsZSwgLWRlYnVnLXRvcCwgLWRlYnVnLXN5bXRhYnMpIG5vdyBkaXNwbGF5IHByZXZpb3VzbHkgaGlkZGVuCiAgICAgICAgICAgIGxpbmtlZCBsaXN0IHBvaW50ZXJzIHdoaWNoIGFyZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwYXJzZSB0cmVlcy4KCiAgICAgICAgICAgIEFkZGVkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1kZWJ1Zy1xdWlldC4gVGhpcyBzdXBwcmVzc2VzIHRoZSBkaXNwbGF5CiAgICAgICAgICAgIG9mIG1vc3QgbGlua2VkIGxpc3QgcG9pbnRlcnMgYW5kIHN5bWJvbCB0YWJsZSBwb2ludGVycyBpbiB0aGUgcGFyc2UgdHJlZSBub2Rlcy4KCiAgICAgICAgICAgIFRoZSBrZXlzIGluIHRoZSBwYXJzZSB0cmVlIG5vZGUgYXJlIG5vdyBzaG93biBpbiBhbHBoYWJldGljYWwgb3JkZXIuCgoyMDIyLTAzLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICAjMjI0NCBGaXggdXNpbmcgZGVjbGFyYXRpb24gaW4gZGVyaXZlZCBjbGFzcyBidWdzIHdoZW4gYWxsIHRoZSBiYXNlCiAgICAgICAgICAgIGNsYXNzJ3Mgb3ZlcmxvYWRlZCBtZXRob2RzIHdlcmUgb3ZlcnJpZGRlbiBpbiB0aGUgZGVyaXZlZCBjbGFzcyAtCiAgICAgICAgICAgIGZpeGVzICJtdWx0aXBseSBkZWZpbmVkIiBlcnJvcnMuCgoyMDIyLTAzLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTc3OSBUaGUgLXB5MyBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgbm93IGhhcyBubyBlZmZlY3Qgb24gdGhlCiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdGVkLiBVc2Ugb2YgdGhpcyBvcHRpb24gcmVzdWx0cyBpbiBhIGRlcHJlY2F0ZWQgd2FybmluZy4KICAgICAgICAgICAgVGhlIHJlbGF0ZWQgU1dJR1BZVEhPTl9QWTMgbWFjcm8gdGhhdCB0aGlzIG9wdGlvbiBkZWZpbmVkIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQuCgogICAgICAgICAgICBOb3RlIHRoYXQgJXB5dGhvbm5vbmR5bmFtaWMgZmVhdHVyZSBnZW5lcmF0ZXMgYSBtZXRhY2xhc3MgdGhhdCB3b3JrcyBvbiBib3RoCiAgICAgICAgICAgIFB5dGhvbiAyIGFuZCBQeXRob24gMy4KCjIwMjItMDMtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNzc5IHB5YWJjLmkgZm9yIGFic3RyYWN0IGJhc2UgY2xhc3NlcyBub3cgc3VwcG9ydHMgdmVyc2lvbnMgb2YKICAgICAgICAgICAgUHl0aG9uIHByaW9yIHRvIDMuMyBieSB1c2luZyB0aGUgY29sbGVjdGlvbiBtb2R1bGUgZm9yIHRoZXNlIG9sZGVyIHZlcnNpb25zLgogICAgICAgICAgICBQeXRob24tMy4zIGFuZCBsYXRlciBjb250aW51ZSB0byB1c2UgdGhlIGNvbGxlY3Rpb25zLmFiYyBtb2R1bGUuCiAgICAgICAgICAgIFRoZSAtcHkzIG9wdGlvbiBubyBsb25nZXIgaGFzIGFueSBlZmZlY3Qgb24gdGhlICVweXRob25hYmMgZmVhdHVyZS4KCjIwMjItMDMtMjE6IGpzY2h1ZWxsZXIsIGppbS1lYXN0ZXJicm9vaywgd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzIxMzcgQysrIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG5vIGxvbmdlciBnZW5lcmF0ZSBhICJmbGF0dGVuZWQiCiAgICAgICAgICAgIG5hbWUgaW4gdGhlIFB5dGhvbiBtb2R1bGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzID0gZXhhbXBsZS5TcGFtKCkKICAgICAgICAgICAgICBzLmZvbygpICAgICAgICAgICAgICAgIyBTcGFtOjpmb28oKSB2aWEgYW4gaW5zdGFuY2UKICAgICAgICAgICAgICBleGFtcGxlLlNwYW0uZm9vKCkgICAgIyBTcGFtOjpmb28oKSB1c2luZyBjbGFzcyBtZXRob2QKICAgICAgICAgICAgICBleGFtcGxlLlNwYW1fZm9vKCkgICAgIyBTcGFtOjpmb28oKSAiZmxhdHRlbmVkIiBuYW1lCgogICAgICAgICAgICBUaGUgImZsYXR0ZW5lZCIgbmFtZSBpcyBubyBsb25nZXIgZ2VuZXJhdGVkLCBidXQgY2FuIGJlIGdlbmVyYXRlZAogICAgICAgICAgICBieSB1c2luZyB0aGUgbmV3IC1mbGF0c3RhdGljbWV0aG9kIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wMy0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dICMzMzcgSW1wbGVtZW50ICVleHRlbmQgYmFzZSBtZXRob2RzIGluIGNoaWxkIGNsYXNzZXMuCgoyMDIyLTAzLTE3OiBvbGx5CgkgICAgW1B5dGhvbl0gIzE3NzkgU1dJRydzIFB5dGhvbiB0ZXN0LXN1aXRlIGFuZCBleGFtcGxlcyBhcmUgbm93CgkgICAgcnVuIHdpdGggUHl0aG9uIDMgYnkgZGVmYXVsdC4gIFRvIHJ1biB0aGVtIHdpdGggUHl0aG9uIDIsIHNldAoJICAgIFBZMiB0byBhIG5vbi1lbXB0eSB2YWx1ZSwgZS5nLjoKCgkgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBQWTI9MQoKMjAyMi0wMy0xNjogb2xseQoJICAgIFtHb10gIzY4MyAtaW50Z29zaXplIGlzIG5vdyBvcHRpb25hbCAtIGlmIG5vdCBzcGVjaWZpZWQgdGhlCgkgICAgZ2VuZXJhdGVkIEMvQysrIHdyYXBwZXIgY29kZSB3aWxsIHVzZSBwdHJkaWZmX3QgZm9yIGludGdvIGFuZAoJICAgIHNpemVfdCBmb3IgdWludGdvLgoKMjAyMi0wMy0xNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCB0eXBlbWFwcyBmb3Igc3RkOjpzdHJpbmcqLgoKMjAyMi0wMy0xNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IGNvbnZlcnQgYXJyYXlzIHRvIHBvaW50ZXJzIGlmIHRoZXJlIGlzIGEgImdvdHlwZSIKCSAgICB0eXBlbWFwIGVudHJ5LgoKMjAyMi0wMy0xNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBkb2N1bWVudGF0aW9uIG5vdGUgYWJvdXQgR28gYW5kIEMrKyBleGNlcHRpb25zLgoKMjAyMi0wMy0xMjogd3NmdWx0b24KICAgICAgICAgICAgIzE1MjQgJWludGVyZmFjZSBmYW1pbHkgb2YgbWFjcm9zIG5vIGxvbmdlciBjb250YWluIHRoZSBnZXR0ZXIvc2V0dGVyCiAgICAgICAgICAgIG1ldGhvZHMgZm9yIHdyYXBwaW5nIHZhcmlhYmxlcy4gVGhlIGludGVyZmFjZSBvbmx5IGNvbnRhaW5zCiAgICAgICAgICAgIHZpcnR1YWwgYW5kIG5vbi12aXJ0dWFsIGluc3RhbmNlIG1ldGhvZHMsIHRoYXQgaXMsIG5vIHN0YXRpYyBtZXRob2RzLgogICAgICAgICAgICBFbnVtcyBhcmUgYWxzbyBubyBsb25nZXIgYWRkZWQgdG8gdGhlIGludGVyZmFjZSAoYWZmZWN0cyBKYXZhIG9ubHkgd2hlcmUKICAgICAgICAgICAgdGhleSB3ZXJlIG1pc3NpbmcgZnJvbSB0aGUgcHJveHkgY2xhc3MsIEMjIG5ldmVyIGhhZCB0aGVtIGluIHRoZSBpbnRlcmZhY2UpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTAzLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTI3NyBGaXhlcyBmb3IgdGhlIGZhbWlseSBvZiAlaW50ZXJmYWNlIG1hY3JvcywgJWludGVyZmFjZSwKICAgICAgICAgICAgJWludGVyZmFjZV9pbXBsIGFuZCAlaW50ZXJmYWNlX2N1c3RvbSBmaXhlcyBmb3Igb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLgoKICAgICAgICAgICAgV2hlbiBDKysgbWV0aG9kcyBhcmUgbm90IGFibGUgdG8gYmUgb3ZlcmxvYWRlZCBpbiBhIGRlcml2ZWQgY2xhc3MsCiAgICAgICAgICAgIHN1Y2ggYXMgd2hlbiB0aGV5IGRpZmZlciBieSBqdXN0IGNvbnN0LCBvciB0aGUgdGFyZ2V0IGxhbmd1YWdlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgdHlwZXMgYXJlIGlkZW50aWNhbCBldmVuIHdoZW4gdGhlIEMrKyBwYXJhbWV0ZXIgdHlwZXMKICAgICAgICAgICAgYXJlIGRpZmZlcmVudCwgU1dJRyB3aWxsIGlnbm9yZSBvbmUgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGEgd2FybmluZy4gQSAlaWdub3JlIGlzIHJlcXVpcmVkIHRvIGV4cGxpY2l0bHkgaWdub3JlIG9uZSBvZiB0aGUKICAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzIHRvIGF2b2lkIHRoZSB3YXJuaW5nIG1lc3NhZ2UuIE1ldGhvZHMgYWRkZWQKICAgICAgICAgICAgaW4gdGhlIGRlcml2ZWQgY2xhc3NlcyBkdWUgdG8gb25lIG9mIHRoZSAlaW50ZXJmYWNlIG1hY3JvcyBhcmUgbm93CiAgICAgICAgICAgIHNpbWlsYXJseSBpZ25vcmVkL25vdCBhZGRlZCB0byB0aGUgZGVyaXZlZCBjbGFzcy4KCiAgICAgICAgICAgIFRoZSBtZXRob2RzIGFkZGVkIHRvIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIG5vdyBhbHNvIGJlIG1vZGlmaWVkCiAgICAgICAgICAgIHZpYSAlZmVhdHVyZSBhbmQgJXJlbmFtZS4KCjIwMjItMDMtMDg6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBUcmVhdCBhIG5pbCBhcmd1bWVudCBhcyBhIE5VTEwgcG9pbnRlci4KCjIwMjItMDMtMDg6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgZG9jdW1lbnRhdGlvbiBub3RlcyBhYm91dCB0aHJlYWQgbG9jYWwgc3RvcmFnZS4KCjIwMjItMDMtMDg6IG9sbHkKCSAgICAjMTAwNiBTV0lHIG5vdyBjb3BlcyB3aXRoIGFuIGludGVyZmFjZSBmaWxlbmFtZSBzcGVjaWZpZWQgb24gdGhlCgkgICAgY29tbWFuZCBsaW5lIHdoaWNoIGNvbnRhaW5zIGEgY2xvc2luZyBwYXJlbnRoZXNpcyBgKWAsIGFuZCBtb3JlCgkgICAgZ2VuZXJhbGx5IHdpdGggYXR0cmlidXRlcyB0byBgJWluY2x1ZGVgIGFuZCBgJWltcG9ydGAgd2hpY2gKCSAgICBhcmUgcXVvdGVkIGFuZCBjb250YWluIHBhcmVudGhlc2VzLgoKMjAyMi0wMy0wNzogT21hciBNZWRpbmEKCSAgICBbVGNsXSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMjkwLwoJICAgIEZpeCBTV0lHX0FzV0NoYXJQdHJBbmRTaXplKCkgdG8gYWN0dWFsbHkgYXNzaWduIHRvIHJlc3VsdAoJICAgIHZhcmlhYmxlLiAgSXQgbG9va3MgbGlrZSBTV0lHL1RjbCB3aWRlIGNoYXJhY3RlciBoYW5kbGluZyBpcwoJICAgIGN1cnJlbnRseSBmdW5kYW1lbnRhbGx5IGJyb2tlbiBleGNlcHQgb24gc3lzdGVtcyB3aGljaCB1c2Ugd2lkZQoJICAgIGNoYXJhY3RlcnMgYXMgdGhlIHN5c3RlbSBlbmNvZGluZywgYnV0IHRoaXMgc2hvdWxkIGZpeCB3cmFwcGluZwoJICAgIGZ1bmN0aW9ucyB3aGljaCB0YWtlIGEgd2lkZSBzdHJpbmcgYXMgYSBwYXJhbWV0ZXIgb24gTWljcm9zb2Z0CgkgICAgV2luZG93cy4KCjIwMjItMDMtMDc6IG9sbHkKCSAgICBbSmF2YXNjcmlwdF0gIzY4MiBGaXggaGFuZGxpbmcgb2YgZnVuY3Rpb25zIHdoaWNoIHRha2Ugdm9pZCouCgoyMDIyLTAzLTA2OiBvbGx5CgkgICAgU1dJRyBzaG91bGQgbm93IHJlbGlhYmx5IGV4aXQgd2l0aCBzdGF0dXMgMCBpZiB0aGUgcnVuIHdhcwoJICAgIHN1Y2Nlc3NmdWwgYW5kIHN0YXR1cyAxIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAob3IgYSB3YXJuaW5nIGFuZAoJICAgIC1XZXJyb3Igd2FzIGluIGVmZmVjdCkuCgoJICAgIFByZXZpb3VzbHkgaW4gc29tZSBzaXR1YXRpb25zIFNXSUcgd291bGQgdHJ5IHRvIGV4aXQgd2l0aCB0aGUKCSAgICBzdGF0dXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLCBidXQgdGhhdCdzCgkgICAgcHJvYmxlbWF0aWMgLSBmb3IgZXhhbXBsZSBpZiB0aGVyZSB3ZXJlIDI1NiBlcnJvcnMgdGhpcyB3b3VsZAoJICAgIHJlc3VsdCBpbiBleGl0IHN0YXR1cyAwIG9uIG1vc3QgcGxhdGZvcm1zLiAgQWxzbyBzb21lIGVycm9yCgkgICAgc3RhdHVzZXMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGUuZy4gdGhvc2UgZGVmaW5lZCBieSA8c3lzZXhpdHMuaD4uCgkgICAgQWxzbyBTV0lHL0phdmFzY3JpcHQgdHJpZWQgdG8gZXhpdCB3aXRoIHN0YXR1cyAtMSBpbiBhIGZldyBwbGFjZXMKCSAgICAod2hpY2ggdHlwaWNhbGx5IHJlc3VsdHMgaW4gZXhpdCBzdGF0dXMgMjU1KS4KCjIwMjItMDMtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDQxIEZpeCB1c2luZyBkZWNsYXJhdGlvbiBpbiBkZXJpdmVkIGNsYXNzIGluY29ycmVjdGx5IGludHJvZHVjaW5nIGEgbWV0aG9kCiAgICAgICAgICAgIGZyb20gYSBiYXNlIGNsYXNzIHdoZW4gdGhlIHVzaW5nIGRlY2xhcmF0aW9uIGlzIGRlY2xhcmVkIGJlZm9yZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLiBQcm9ibGVtIG9jY3VycmVkIHdoZW4gd2l0aGluIGEgbmFtZXNwYWNlIGFuZCB0aGUgcGFyYW1ldGVyIHR5cGVzCiAgICAgICAgICAgIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyB3ZXJlIG5vdCBmdWxseSBxdWFsaWZpZWQuCgoyMDIyLTAzLTA1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gVHJlYXQgbm9uLWNvbnN0IHJlZmVyZW5jZXMgYXMgcG9pbnRlcnMuCgoyMDIyLTAzLTA1OiBpYW5sYW5jZXRheWxvcgoJICAgIEluIFNXSUcgR28gdGVzdHN1aXRlLCBmYWlsIHRlc3QgaWYgImdvIGJ1aWxkIiBmYWlscy4KCjIwMjItMDMtMDM6IG9sbHkKCSAgICAjMTkwMSAjMjIyMyBTV0lHIHNob3VsZCBub3cgYWx3YXlzIGV4aXQgY2xlYW5seSBpZiBtZW1vcnkKCSAgICBhbGxvY2F0aW9uIGZhaWxzLCBpbmNsdWRpbmcgcmVtb3ZpbmcgYW55IG91dHB1dCBmaWxlcyBjcmVhdGVkCgkgICAgZHVyaW5nIHRoZSBjdXJyZW50IHJ1bi4KCgkgICAgUHJldmlvdXNseSBtb3N0IHBsYWNlcyBpbiB0aGUgY29kZSBkaWRuJ3QgY2hlY2sgZm9yIGEgTlVMTCByZXR1cm4KCSAgICBmcm9tIG1hbGxvYygpL3JlYWxsb2MoKS9jYWxsb2MoKSBhdCBhbGwsIHR5cGljYWxseSByZXN1bHRpbmcgaW4KCSAgICB1bmRlZmluZWQgYmVoYXZpb3VyOyBzb21lIHBsYWNlcyB1c2VkIGFzc2VydCgpIHRvIGNoZWNrIGZvciBhIE5VTEwKCSAgICByZXR1cm4gKHdoaWNoIGlzIGEgbWlzdXNlIG9mIGFzc2VydCgpIGFuZCBzdWNoIGNoZWNrcyBkaXNhcHBlYXIgaWYKCSAgICBidWlsdCB3aXRoIE5ERUJVRyBkZWZpbmVkIGxlYXZpbmcgdXMgYmFjayB3aXRoIHVuZGVmaW5lZAoJICAgIGJlaGF2aW91cikuCgoyMDIyLTAzLTAzOiBvbGx5CgkgICAgIzg5MSBSZXBvcnQgZXJyb3JzIGZvciB0eXBlbWFwIGF0dHJpYnV0ZXMgd2l0aG91dCBhIHZhbHVlCgkgICAgKHByZXZpb3VzbHkgU1dJRyBzZWdmYXVsdGVkKSBhbmQgZm9yIHR5cGVtYXAgdHlwZXMgd2l0aCBhIHZhbHVlCgkgICAgKHByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBxdWlldGx5IGlnbm9yZWQpLgoKCSAgICBUaGUgb2xkIHdheSBvZiBzcGVjaWZ5aW5nIGEgbGFuZ3VhZ2UgbmFtZSBpbiB0aGUgdHlwZW1hcCBhdHRyaWJ1dGVzCgkgICAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoaXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IgMTYgeWVhcnMpLgoKMjAyMi0wMy0wMjogZ2VvZ3JhcGhpa2EsIHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxOTUxIEFkZCBQeXRob24gdmFyaWFibGUgYW5ub3RhdGlvbnMgc3VwcG9ydC4KCiAgICAgICAgICAgIEJvdGggZnVuY3Rpb24gYW5ub3RhdGlvbnMgYW5kIHZhcmlhYmxlIGFubm90YXRpb25zIGFyZSB0dXJuZWQgb24gdXNpbmcgdGhlCiAgICAgICAgICAgICJweXRob246YW5ub3RhdGlvbnMiIGZlYXR1cmUuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246YW5ub3RhdGlvbnMiLCAiYyIpOwoKICAgICAgICAgICAgICBzdHJ1Y3QgViB7CiAgICAgICAgICAgICAgICBmbG9hdCB2YWw7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgY29kZSBjb250YWlucyBhIHZhcmlhYmxlIGFubm90YXRpb24gY29udGFpbmluZyB0aGUgQyBmbG9hdCB0eXBlOgoKICAgICAgICAgICAgICBjbGFzcyBWKG9iamVjdCk6CiAgICAgICAgICAgICAgICAgIHZhbDogImZsb2F0IiA9IHByb3BlcnR5KF9leGFtcGxlLlZfdmFsX2dldCwgX2V4YW1wbGUuVl92YWxfc2V0KQogICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFB5dGhvbiAzLjUgYW5kIGVhcmxpZXIgZG8gbm90IHN1cHBvcnQgdmFyaWFibGUgYW5ub3RhdGlvbnMsIHNvIHZhcmlhYmxlCiAgICAgICAgICAgIGFubm90YXRpb25zIGNhbiBiZSB0dXJuZWQgb2ZmIHdpdGggYSAicHl0aG9uOmFubm90YXRpb25zOm5vdmFyIiBmZWF0dXJlIGZsYWcuCiAgICAgICAgICAgIEV4YW1wbGUgdHVybmluZyBvbiBmdW5jdGlvbiBhbm5vdGF0aW9ucyBidXQgbm90IHZhcmlhYmxlIGFubm90YXRpb25zIGdsb2JhbGx5OgoKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOmFubm90YXRpb25zIiwgImMiKTsKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOmFubm90YXRpb25zOm5vdmFyIik7CgogICAgICAgICAgICBvciB2aWEgdGhlIGNvbW1hbmQgbGluZToKCiAgICAgICAgICAgICAgLWZlYXR1cmVzIHB5dGhvbjphbm5vdGF0aW9ucz1jLHB5dGhvbjphbm5vdGF0aW9uczpub3ZhcgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIyLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzM1ICMxNTYxIEZ1bmN0aW9uIGFubm90YXRpb25zIGNvbnRhaW5pbmcgQy9DKysgdHlwZXMgYXJlIG5vIGxvbmdlcgogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiB1c2luZyB0aGUgLXB5MyBvcHRpb24uIEZ1bmN0aW9uIGFubm90YXRpb25zIHN1cHBvcnQgaGFzIGJlZW4KICAgICAgICAgICAgbW92ZWQgdG8gYSBmZWF0dXJlIHRvIHByb3ZpZGUgZmluZXIgZ3JhaW5lZCBjb250cm9sLiBJdCBjYW4gYmUgdHVybmVkIG9uCiAgICAgICAgICAgIGdsb2JhbGx5IGJ5IGFkZGluZzoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjphbm5vdGF0aW9ucyIsICJjIik7CgogICAgICAgICAgICBvciBieSB1c2luZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50OgoKICAgICAgICAgICAgICAtZmVhdHVyZXMgcHl0aG9uOmFubm90YXRpb25zPWMKCiAgICAgICAgICAgIEFsc28gc2VlIGVudHJ5IGRhdGVkIDIwMjItMDMtMDIsIHJlZ2FyZGluZyB2YXJpYWJsZSBhbm5vdGF0aW9ucy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wMi0yNjogd3NmdWx0b24KICAgICAgICAgICAgIzY1NSAjMTg0MCBBZGQgbmV3IHdhcm5pbmcgV0FSTl9MQU5HX1VTSU5HX05BTUVfRElGRkVSRU5UIHRvIHdhcm4gd2hlbiBhCiAgICAgICAgICAgIG1ldGhvZCBpbnRyb2R1Y2VkIGJ5IGEgdXNpbmcgZGVjbGFyYXRpb24gaW4gYSBkZXJpdmVkIGNsYXNzIGNhbm5vdAogICAgICAgICAgICBiZSB1c2VkIGR1ZSB0byBhIGNvbmZsaWN0IGluIG5hbWVzLgoKMjAyMi0wMi0yNDogb2xseQoJICAgICMxNDY1IEFuIGludmFsaWQgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24gaXMgcmVwb3J0ZWQgYXMgYSBwYWlyIG9mCgkgICAgd2FybmluZ3Mgd2l0aCB0aGUgc2Vjb25kIGdpdmluZyBhIG1vcmUgZGV0YWlsZWQgbWVzc2FnZSBmcm9tIHRoZQoJICAgIGV4cHJlc3Npb24gZXZhbHVhdG9yLiAgUHJldmlvdXNseSBTV0lHIHByZWZpeGVkIHRoZSBzZWNvbmQgbWVzc2FnZQoJICAgIHdpdGggIkVycm9yOiIgLSB0aGF0IHdhcyBjb25mdXNpbmcgYXMgaXQncyBhY3R1YWxseSBvbmx5IGEgd2FybmluZwoJICAgIGJ5IGRlZmF1bHQgc28gd2UndmUgbm93IGRyb3BwZWQgdGhpcyBwcmVmaXguCgoJICAgIEJlZm9yZToKCgkgICAgeC5pOjE6IFdhcm5pbmcgMjAyOiBDb3VsZCBub3QgZXZhbHVhdGUgZXhwcmVzc2lvbiAnMS4yJwoJICAgIHguaToxOiBXYXJuaW5nIDIwMjogRXJyb3I6ICdGbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbicKCgkgICAgTm93OgoKCSAgICB4Lmk6MTogV2FybmluZyAyMDI6IENvdWxkIG5vdCBldmFsdWF0ZSBleHByZXNzaW9uICcxLjInCgkgICAgeC5pOjE6IFdhcm5pbmcgMjAyOiBGbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbgoKMjAyMi0wMi0yMzogb2xseQoJICAgICMxMzg0IEZpeCBhIHByZXByb2Nlc3NvciBleHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLiAgQQoJICAgIHN1YmV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMgbG9zdCBpdHMgc3RyaW5nL2ludCB0eXBlIGZsYWcgYW5kCgkgICAgaW5zdGVhZCB1c2VkIHdoYXRldmVyIHR5cGUgd2FzIGxlZnQgaW4gdGhlIHN0YWNrIGVudHJ5IGZyb20KCSAgICBwcmV2aW91cyB1c2UuICBJbiBwcmFjdGljZSB3ZSBtb3N0bHkgZ290IGF3YXkgd2l0aCB0aGlzIGJlY2F1c2UKCSAgICBtb3N0IHByZXByb2Nlc3NvciBleHByZXNzaW9ucyBhcmUgaW50ZWdlciwgYnV0IGl0IGNvdWxkIGhhdmUKCSAgICByZXN1bHRlZCBpbiBhIHByZXByb2Nlc3NvciBleHByZXNzaW9uIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYXMKCSAgICB6ZXJvLiAgSWYgLVdleHRyYSB3YXMgaW4gdXNlIHlvdSBnb3QgYSB3YXJuaW5nOgoKCSAgICBXYXJuaW5nIDIwMjogRXJyb3I6ICdDYW4ndCBtaXggc3RyaW5ncyBhbmQgaW50ZWdlcnMgaW4gZXhwcmVzc2lvbicKCjIwMjItMDItMjE6IGRhdmlkY2wKCSAgICBbU2NpbGFiXSBJbXByb3ZlIDUuNS4yLCA2LjAuMCBhbmQgNi4xLjAgc3VwcG9ydC4KCgkgICAgRm9yIFNjaWxhYiA1LCBsb25nIG5hbWVzIGFyZSByZWR1Y2VkIHRvIHNtYWxsIG5hbWVzIHByZXNlcnZpbmcgdGhlIAoJICAgIGNsYXNzIHByZWZpeCBhbmQgYWNjZXNzb3Igc3VmZml4IChnZXQgb3Igc2V0KS4KCgkgICAgRm9yIFNjaWxhYiA2LCBsb25nIG5hbWVzIHdpdGggdGhlIGNsYXNzIHByZWZpeCBhbmQgYWNjZXNzb3Igc3VmZml4CgkgICAgc2hvdWxkIGJlIHVzZWQgb24gdGhlIHVzZXIgY29kZS4KCgkgICAgVGhlIGAtdGFyZ2V0dmVyc2lvbmAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYXMgdGhlIGdlbmVyYXRlZCBjb2RlCgkgICAgbm93IGRldGVjdHMgdGhlIFNjaWxhYiB2ZXJzaW9uIGluIGxvYWRlci5zY2Ugb3IgYnVpbGRlci5zY2UuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMi0wMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICV3YXJuZmlsdGVyIHdhcm5pbmcgc3VwcHJlc3MgZm9yIHdhcm5pbmcgMzE1IFNXSUdXQVJOX1BBUlNFX1VTSU5HX1VOREVGLgoKMjAyMi0wMi0xNzogb2xseQoJICAgIFtQSFBdIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzEyMTEvCgkgICAgRml4IHRvIGNhbGwgY2xlYW51cCBjb2RlIGluIGV4Y2VwdGlvbiBzaXR1YXRpb25zIGFuZCBub3QgdG8gaW52b2tlCgkgICAgdGhlIGZyZWVhcmcgdHlwZW1hcCB0d2ljZSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMuCgoyMDIyLTAyLTE1OiBvbGx5CgkgICAgIzMwMCAjMzY4IEltcHJvdmUgcGFyc2VyIGhhbmRsaW5nIG9mICUgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkKCSAgICBhbiBpZGVudGlmaWVyLiAgSWYgaXQncyBub3QgYSByZWNvZ25pc2VkIGRpcmVjdGl2ZSB0aGUgc2Nhbm5lcgoJICAgIG5vdyBlbWl0cyBNT0RVTE8gYW5kIHRoZW4gcmVzY2FucyB3aGF0IGZvbGxvd3MsIGFuZCBpZiB0aGUgcGFyc2VyCgkgICAgdGhlbiBnaXZlcyBhIHN5bnRheCBlcnJvciB3ZSByZXBvcnQgaXQgYXMgYW4gdW5rbm93biBkaXJlY3RpdmUuCgkgICAgVGhpcyBtZWFucyB0aGF0IGBhJWJgIGlzIG5vdyBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24sIGFuZCB0aGF0CgkgICAgdGhpbmdzIGxpa2UgYCVzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz5gIG5vdyBnaXZlIGFuIGVycm9yIHJhdGhlcgoJICAgIHRoYW4gYmVpbmcgcXVpZXRseSBpZ25vcmVkLgoKMjAyMi0wMi0xMTogYWRyMjYKICAgICAgICAgICAgW1B5dGhvbl0gIzIxNTQgRml4IG1lbW9yeSBsZWFrLgoKICAgICAgICAgICAgU1dJRyBweXRob24gb2JqZWN0cyB3ZXJlIGJlaW5nIGZyZWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIFNXSUcKICAgICAgICAgICAgbW9kdWxlIGluZm9ybWF0aW9uIHdhcyBkZXN0cm95ZWQgaW4gUHl0aG9uIDMsIGNhdXNpbmcgbGVha3Mgd2hlbiBhcwogICAgICAgICAgICBhIHJlc3VsdCB0aGUgb2JqZWN0IGRlc3RydWN0b3IgY291bGQgbm90IGJlIGludm9rZWQuIFRvIHByZXZlbnQgdGhpcwogICAgICAgICAgICBtaXNvcmRlcmluZywgU1dJRyBweXRob24gb2JqZWN0cyBub3cgb2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAgICAgICBQeXRob24gY2Fwc3VsZSB3cmFwcGluZyB0aGUgbW9kdWxlIGluZm9ybWF0aW9uLCBzbyB0aGF0IHRoZSBtb2R1bGUKICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgY29ycmVjdGx5IGRlc3Ryb3llZCBhZnRlciBhbGwgU1dJRyBweXRob24gb2JqZWN0cwogICAgICAgICAgICBoYXZlIGJlZW4gZnJlZWQgKGFuZCBjb3JyZXNwb25kaW5nIGRlc3RydWN0b3JzIGludm9rZWQpLgoKMjAyMi0wMi0xMDogb2xseQoJICAgIFtUY2xdIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzEyMDcvCgkgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTIxMy8KCgkgICAgRml4IFRjbCBnZW5lcmljIGlucHV0IHR5cGVtYXAgZm9yIHN0ZDo6dmVjdG9yLgoKMjAyMi0wMi0wNzogc2V0aHJqCiAgICAgICAgICAgICMyMTk2IEFkZCBhbHRlcm5hdGl2ZSBzeW50YXggZm9yIHNwZWNpZnlpbmcgZnJhZ21lbnRzIGluIHR5cGVtYXBzLgoKICAgICAgICAgICAgTmV3IHN5bnRheDoKICAgICAgICAgICAgICAldHlwZW1hcCgiaW4iLCBmcmFnbWVudD0iZnJhZzEiLCBmcmFnbWVudD0iZnJhZzIiLCBmcmFnbWVudD0iZnJhZzMiKSB7Li4ufQogICAgICAgICAgICB3aGljaCBpcyBlcXVpdmFsZW50IHRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0iZnJhZzEsZnJhZzIsZnJhZzMiKSB7Li4ufQoKCjIwMjItMDItMDc6IG9sbHkKCSAgICAjMTgwNiBSZW1vdmUgc3VwcG9ydCBmb3IgdGhlICJjb21tYW5kIiBlbmNvZGVyLCB3aGljaCB3YXMgbW9zdGx5CgkgICAgaW50ZW5kZWQgZm9yIHVzZSBpbiBgJXJlbmFtZWAgLSBtb3N0IHVzZXMgY2FuIGJlIGFjaGlldmVkIHVzaW5nCgkgICAgdGhlICJyZWdleCIgZW5jb2Rlciwgc28gd2UgcmVjb21tZW5kIHVzaW5nIHRoYXQgaW5zdGVhZC4KCgkgICAgVGhlICJjb21tYW5kIiBlbmNvZGVyIHN1ZmZlcnMgZnJvbSBhIG51bWJlciBvZiBpc3N1ZXMgLSBhcyB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGZvciBpdCBhZG1pdHRlZCwgIltpdF0gaXMgZXh0cmVtZWx5IHNsb3cgY29tcGFyZWQgdG8KCSAgICBhbGwgdGhlIG90aGVyIFtlbmNvZGVyc10gYXMgaXQgaW52b2x2ZXMgc3Bhd25pbmcgYSBzZXBhcmF0ZSBwcm9jZXNzCgkgICAgYW5kIHVzaW5nIGl0IGZvciBtYW55IGRlY2xhcmF0aW9ucyBpcyBub3QgcmVjb21tZW5kZWQiIGFuZCB0aGF0IGl0CgkgICAgInNob3VsZCBnZW5lcmFsbHkgYmUgYXZvaWRlZCBiZWNhdXNlIG9mIHBlcmZvcm1hbmNlCgkgICAgY29uc2lkZXJhdGlvbnMiLgoKCSAgICBCdXQgaXQncyBhbHNvIG5vdCBwb3J0YWJsZS4gIFRoZSBkZXNpZ24gYXNzdW1lcyB0aGF0IGAvYmluL3NoYAoJICAgIHN1cHBvcnRzIGA8PDxgIGJ1dCB0aGF0J3MgYSBiYXNoLXNwZWNpZmljIGZlYXR1cmUgc28gaXQgZG9lc24ndAoJICAgIHdvcmsgb24gcGxhdGZvcm1zIHdoZXJlIGAvYmluL3NoYCBpcyBub3QgYmFzaCAtIGl0IGZhaWxzIG9uCgkgICAgRGViaWFuLCBVYnVudHUgYW5kIHByb2JhYmx5IHNvbWUgb3RoZXIgTGludXggZGlzdHJvcywgcGx1cyBtb3N0CgkgICAgbm9uLUxpbnV4IHBsYXRmb3Jtcy4gIE1pY3Jvc29mdCBXaW5kb3dzIGRvZXNuJ3QgZXZlbiBoYXZlIGEKCSAgICAvYmluL3NoIGFzIHN0YW5kYXJkLgoKCSAgICBGaW5hbGx5LCBubyBlc2NhcGluZyBvZiB0aGUgcGFzc2VkIHN0cmluZyBpcyBkb25lLCBzbyBpdCBoYXMKCSAgICBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzICh0aG91Z2ggYXQgbGVhc3Qgd2l0aCAlcmVuYW1lIHRoZSBpbnB1dAoJICAgIGlzIGxpbWl0ZWQgdG8gdmFsaWQgQy9DKysgc3ltYm9sIG5hbWVzKS4KCjIwMjItMDItMDY6IG9sbHkKCSAgICAjMjE5MyAtREZPTyBvbiB0aGUgU1dJRyBjb21tYW5kIGxpbmUgbm93IHNldHMgRk9PIHRvIDEgZm9yCgkgICAgY29uc2lzdGVuY3kgd2l0aCBDL0MrKyBjb21waWxlciBwcmVwcm9jZXNzb3JzLiAgUHJldmlvdXNseQoJICAgIFNXSUcgc2V0IEZPTyB0byBhbiBlbXB0eSB2YWx1ZS4KCgkgICAgRXhpc3RpbmcgaW52b2NhdGlvbnMgb2YgU1dJRyB3aXRoIGAtREZPT2Agd2hlcmUgdGhlIGVtcHR5IHZhbHVlCgkgICAgbWF0dGVycyBjYW4gYmUgdXBkYXRlZCB0byBgLURGT089YCB3aGljaCBzaG91bGQgd29yayB3aXRoIGJvdGgKCSAgICBvbGQgYW5kIG5ldyByZWxlYXNlcyBvZiBTV0lHLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMjItMDItMDY6IHNldGhyagoJICAgICMyMTk0IENsYXNzZXMgdGhhdCBhcmUgbm9uLWFzc2lnbmFibGUgZHVlIHRvIGNvbnN0IGRhdGEgb3IgY29uc3QKCSAgICByZWZlcmVuY2UgbWVtYmVycyBhcmUgbm93IGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuCgoyMDIyLTAyLTA0OiBmcmllZHJpY2hhdGdjCgkgICAgW09jdGF2ZV0gIzE2NzIgRml4IGZvciBpc29iamVjdCBmb3IgT2N0YXZlIDQuNCAtIDYuMC4KCjIwMjItMDItMDM6IG9sbHkKCSAgICBbQyNdICMyODMgIzk5OCBGaXggbWVtb3J5IGxlYWsgaW4gZGlyZWN0b3JpbiB0eXBlbWFwIGZvcgoJICAgIHN0ZDo6c3RyaW5nLgoKMjAyMi0wMi0wMzogb2xseQoJICAgIFtQeXRob25dICM5NjcgTWFrZSBgc2VsZmAgcGFyYW1ldGVyIGF2YWlsYWJsZSB0byB1c2VyIHR5cGVtYXBzLgoKMjAyMi0wMi0wMzogdGV5dGhvb24KCSAgICBbUHl0aG9uXSAjODAxIEZpeCAtV3VudXNlZC1wYXJhbWV0ZXIgd2FybmluZ3Mgd2l0aCBidWlsdGluLAoKMjAyMi0wMi0wMzogdGV5dGhvb24KCSAgICAjODAxIEZpeCAtV3N0cmljdC1wcm90b3R5cGVzIHdhcm5pbmdzIGluIGdlbmVyYXRlZCBwb2ludGVyCgkgICAgZnVuY3Rpb25zLgoKMjAyMi0wMi0wMzogb2xseQoJICAgICM2NjAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTA4MS8KCSAgICBEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgY29udGFpbmluZyBtZXRob2QgY2FsbHMgYXJlIG5vdyBwYXJzZWQgYW5kCgkgICAgaGFuZGxlZCAtIGUuZy4gYHgtPmZvbygzLDQpYCBhbmQgYHkueigpYC4KCjIwMjItMDItMDI6IG9sbHkKCSAgICBbUnVieV0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTEzNi8gRml4IHJlbW92ZSBvZiBwcmVmaXgKCSAgICBmcm9tIG1ldGhvZCBuYW1lIHRvIG9ubHkgcmVtb3ZlIGl0IGF0IHRoZSBzdGFydC4KCjIwMjItMDItMDE6IG9sbHkKCSAgICAjMjMxIEhhbmRsZSByZXR1cm5pbmcgYW4gb2JqZWN0IGJ5IHJlZmVyZW5jZSBpbiBhIEMrKyB0cmFpbGluZwoJICAgIHJldHVybiB0eXBlLgoKMjAyMi0wMi0wMTogZGF2aWRjbAogICAgICAgICAgICBbU2NpbGFiXSAjNzQ1IHVzZSBTV0lHXzxtb2R1bGU+X0luaXQoKSBhcyBhIEMgbW9kdWxlIGluaXQgZnVuY3Rpb24uCgoyMDIyLTAyLTAxOiBvbGx5CgkgICAgW09DYW1sXSAjMjA4MyBGaXggdG8gd29yayB3aGVuIENBTUxfU0FGRV9TVFJJTkcgaXMgb24sIHdoaWNoIGl0IGlzCgkgICAgYnkgZGVmYXVsdCBpbiByZWNlbnQgT2NhbWwgcmVsZWFzZXMuCgoyMDIyLTAxLTMxOiBtcmVlZXoKCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMTQ3LwoJICAgIEZpeCBjb3B5VG9SKCkgZ2VuZXJhdGVkIGZvciBhIHN0cnVjdCBpbiBhIG5hbWVzcGFjZS4KCjIwMjItMDEtMjk6IGZzY2hsaW1iCgkgICAgIzY1NSBCZXR0ZXIgaGFuZGxpbmcgb2YgdXNpbmcgZGVjbGFyYXRpb25zLgoKMjAyMi0wMS0yOTogZG9udHBhbmljOTIKCSAgICBbR29dICM2NzYgRml4IGNvZGUgZ2VuZXJhdGVkIGZvciBhIEMrKyBjbGFzcyB3aXRoIGEgbm9uLWNhcGl0YWxpc2VkCgkgICAgbmFtZS4KCjIwMjItMDEtMjY6IHRyZXg1OAoJICAgICMxOTE5ICMxOTIxICMxOTIzIFZhcmlvdXMgZml4ZXMgZm9yIEFJWCBwb3J0YWJpbGl0eS4KCjIwMjItMDEtMjY6IG9sbHkKCSAgICAjMTkzNSBEb24ndCBjcmFzaCBvbiBhbiB1bmNsb3NlZCBIVE1MIHRhZyBpbiBhIGRveHlnZW4gY29tbWVudAoJICAgIHdoZW4gLWRveHlnZW4gaXMgc3BlY2lmaWVkLgoKMjAyMi0wMS0yNTogb2xseQoJICAgIENvbnN0YW50IGV4cHJlc3Npb25zIG5vdyBzdXBwb3J0IG1lbWJlciBhY2Nlc3Mgd2l0aCBgLmAgc3VjaCBhcwoJICAgIGBmb28uYmFyYC4gIFByZXZpb3VzIHRoaXMgb25seSB3b3JrZWQgaW4gYSBjYXNlIGxpa2UgYHgtPmZvby5iYXJgLgoKMjAyMi0wMS0yNTogb2xseQoJICAgICMyMDkxIFN1cHBvcnQgbW9zdCBjYXNlcyBvZiBgc2l6ZW9mYCBhcHBsaWVkIHRvIGFuIGV4cHJlc3Npb24KCSAgICBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gIFByZXZpb3VzbHkgdGhlcmUgd2FzIG9ubHkgc3VwcG9ydCBmb3IKCSAgICBgc2l6ZW9mKDx0eXBlPilgIGFuZCBleHByZXNzaW9ucyB3aGljaCBzeW50YWN0aWNhbGx5IGxvb2sgbGlrZSBhCgkgICAgdHlwZSAoc3VjaCBhcyBgc2l6ZW9mKGZvbylgKS4KCjIwMjItMDEtMjU6IG9sbHkKCSAgICAjODAgIzYzNSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMTM5LwoJICAgIEFkZCBzdXBwb3J0IGZvciBwYXJzaW5nIGNvbW1vbiBjYXNlcyBvZiBgPGAgYW5kIGA+YCBjb21wYXJpc29ucwoJICAgIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgQWRkaW5nIGZ1bGwgc3VwcG9ydCBmb3IgdGhlc2Ugc2VlbXMgaGFyZAoJICAgIHRvIGRvIHdpdGhvdXQgaW50cm9kdWNpbmcgY29uZmxpY3RzIGludG8gdGhlIHBhcnNlciBncmFtbWFyLCBidXQgaW4KCSAgICBmYWN0IGFsbCByZXBvcnRlZCBjYXNlcyBoYXZlIGhhZCBwYXJlbnRoZXNlcyBhcm91bmQgdGhlIGNvbXBhcmlzb24KCSAgICBhbmQgd2UgY2FuIHN1cHBvcnQgdGhhdCB3aXRoIGEgZmV3IHJlc3RyaWN0aW9ucyBvbiB0aGUgbGVmdCBzaWRlIG9mCgkgICAgYDxgLgoKMjAyMi0wMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHdhcm5pbmcgMzI3IGZvciBleHRlcm4gdGVtcGxhdGVzLCBlZzoKCiAgICAgICAgICAgICAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHN0ZDo6dmVjdG9yPGludD47CiAgICAgICAgICAgICAgZXh0ZXJuIHRlbXBsYXRlIHZvaWQgRnVuYzxpbnQ+KCk7CgogICAgICAgICAgICByZXN1bHRzIGluIHdhcm5pbmcKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgMzI3OiBFeHRlcm4gdGVtcGxhdGUgaWdub3JlZC4KICAgICAgICAgICAgICBleGFtcGxlLmk6NDogV2FybmluZyAzMjc6IEV4dGVybiB0ZW1wbGF0ZSBpZ25vcmVkLgoKICAgICAgICAgICAgRXh0ZXJuIHRlbXBsYXRlIGNsYXNzZXMgcHJldmlvdXNseSByZXN1bHRlZCBpbiB3YXJuaW5nIDMyMC4KCjIwMjItMDEtMjQ6IHJvbWludG9tYXNldHRpCiAgICAgICAgICAgICMyMTMxICMyMTU3IEMrKzExIGV4dGVybiBmdW5jdGlvbiB0ZW1wbGF0ZSBwYXJzaW5nIGVycm9yIGZpeC4KCjIwMjItMDEtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgICMyMTIwICMyMTM4IFJlcGxhY2UgbGVnYWN5IFBDUkUgZGVwZW5kZW5jeSB3aXRoIFBDUkUyLgogICAgICAgICAgICBUaGlzIHJlcXVpcmVzIGNoYW5nZXMgZm9yIGJ1aWxkaW5nIFNXSUcgZnJvbSBzb3VyY2UuIFNlZSB1cGRhdGVkCiAgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBpbiBQcmVmYWNlLmh0bWwgYW5kIFdpbmRvd3MuaHRtbC4gVXBkYXRlZAogICAgICAgICAgICBpbnN0cnVjdGlvbnMgYXJlIGFsc28gc2hvd24gd2hlbiBydW5uaW5nIC4vY29uZmlndXJlIGlmIFBDUkUyIGlzIG5vdAogICAgICAgICAgICBmb3VuZC4gTm90ZSB0aGF0IGRlYmlhbiBiYXNlZCBzeXN0ZW1zIGNhbiBpbnN0YWxsIFBDUkUyIHVzaW5nOgoKICAgICAgICAgICAgICBhcHQgaW5zdGFsbCBsaWJwY3JlMi1kZXYKCiAgICAgICAgICAgIE5vdGUgdGhhdCBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL3dpa2kvR2V0dGluZy1TdGFydGVkIGFsc28gaGFzCiAgICAgICAgICAgIHVwZGF0ZWQgaW5mb3JtYXRpb24gZm9yIGJ1aWxkaW5nIGZyb20gc291cmNlLgoKMjAyMi0wMS0xOTogb2xseQoJICAgIFtQSFBdICMyMDI3IEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgUEhQIHR5cGUgZGVjbGFyYXRpb25zIGZvciBQSFAgOC4KCSAgICBUaGUgZ2VuZXJhdGUgY29kZSBzdGlsbCBjb21waWxlcyBmb3IgUEhQIDcueCwgYnV0IHdpdGhvdXQgdHlwZQoJICAgIGRlY2xhcmF0aW9ucyBzaW5jZSBQSFAgNy54IGhhcyBtdWNoIG1vcmUgbGltaXRlZCB0eXBlIGRlY2xhcmF0aW9uCgkgICAgc3VwcG9ydC4KCjIwMjItMDEtMTg6IG9sbHkKCSAgICBbUGVybF0gIzE2MjkgUGVybCA1LjguMCBpcyBub3cgdGhlIG9sZGVzdCB2ZXJzaW9uIHdlIGFpbSB0byBzdXBwb3J0LgoKMjAyMi0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICVjYWxsYmFjayBhbmQgc3BlY2lmeWluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYQogICAgICAgICAgICBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIHVzaW5nIFB5dGhvbiBzdGF0aWNtZXRob2Qgc3ludGF4LCBzdWNoIGFzCiAgICAgICAgICAgIEtsYXNzLm1lbWJlcmZ1bmN0aW9uIGluc3RlYWQgb2YgS2xhc3NfbWVtYmVyZnVuY3Rpb24gd2hlbiB1c2luZwogICAgICAgICAgICAtYnVpbHRpbiBhbmQgLWZhc3Rwcm94eS4KCjIwMjItMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFjY2VwdCBrZXl3b3JkIGFyZ3VtZW50cyBhY2Nlc3Npbmcgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbgogICAgICAgICAgICB1c2luZyAtYnVpbHRpbiBhbmQga3dhcmdzIGZlYXR1cmUgYW5kIFB5dGhvbiBjbGFzcyBzdGF0aWNtZXRob2Qgc3ludGF4LgogICAgICAgICAgICBUaGUgbWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50IHN1cHBvcnQgd2FzIG9ubHkgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICAgY2xhc3Mgc3RhdGljbWV0aG9kIHN5bnRheCwgc3VjaCBhcyBLbGFzcy5tZW1iZXJmdW5jdGlvbiwgYW5kIG5vdCB3aGVuCiAgICAgICAgICAgIHVzaW5nIHRoZSBmbGF0IHN0YXRpYyBtZXRob2Qgc3ludGF4LCBzdWNoIGFzIEtsYXNzX21lbWJlcmZ1bmN0aW9uLgoKMjAyMi0wMS0wNDoganVpZXJyb3IKICAgICAgICAgICAgW0dvXSAjMjA0NSBBZGQgc3VwcG9ydCBmb3Igc3RkOjphcnJheSBpbiBzdGRfYXJyYXkuaS4KCjIwMjEtMTItMTg6IG9sbHkKCSAgICBbUEhQXSBBZGQgUEhQIGtleXdvcmQgJ3JlYWRvbmx5JyAoYWRkZWQgaW4gOC4xKSB0byB0aGUgbGlzdCBTV0lHCgkgICAga25vd3MgdG8gYXV0b21hdGljYWxseSByZW5hbWUuICBUaGlzIGtleXdvcmQgaXMgc3BlY2lhbCBpbiB0aGF0IFBIUAoJICAgIGFsbG93cyBpdCB0byBiZSB1c2VkIGFzIGEgZnVuY3Rpb24gKG9yIG1ldGhvZCkgbmFtZS4KCjIwMjEtMTItMDc6IHZzdGlubmVyCiAgICAgICAgICAgIFtQeXRob25dICMyMTE2IFB5dGhvbiAzLjExIHN1cHBvcnQ6IHVzZSBQeV9TRVRfVFlQRSgpCgoyMDIxLTEyLTA1OiByd2YxCiAgICAgICAgICAgIFtPY3RhdmVdICMyMDIwICMxODkzIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgNiB1cCB0byBhbmQgaW5jbHVkaW5nIDYuNC4KICAgICAgICAgICAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgY29tcGlsaW5nIHdpdGggLUJzeW1ib2xpYyB3aGljaCBpcyB1c2VkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgYnkgbWtvY3RmaWxlLgoKMjAyMS0xMi0wMjoganNlbm4KICAgICAgICAgICAgW1B5dGhvbl0gIzIxMDIgRml4ZWQgY3Jhc2hlcyB3aGVuIHVzaW5nIGVtYmVkZGVkIFB5dGhvbiBpbnRlcnByZXRlcnMuIAoKMjAyMS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdIHY4IGFuZCBub2RlIG9ubHkuIEZpeCBtaXNtYXRjaGVkIG5ldyBjaGFyW10gYW5kIGZyZWUoKQogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIEMgY29kZSBjaGFyIGFycmF5cy4gTm93IGNhbGxvYyBpcyBub3cgdXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIG5ldyBjaGFyW10gaW4gU1dJR19Bc0NoYXJQdHJBbmRTaXplLgoKMjAyMS0xMC0wMzogYWpyaDEKICAgICAgICAgICAgW1BlcmxdICMyMDc0OiBBdm9pZCAtV21pc2xlYWRpbmctaW5kZW50YXRpb24gaW4gZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyBnY2MxMS4KCjIwMjEtMTAtMDM6IGpzY2h1ZWxsZXIKICAgICAgICAgICAgW0NNYWtlXSAjMjA2NTogQWRkIG9wdGlvbiB0byBlbmFibGUgb3IgZGlzYWJsZSBQQ1JFIHN1cHBvcnQuCgoyMDIxLTA5LTE2OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIEltcHJvdmVkIF9jZ29fcGFuaWMgaW1wbGVtZW50YXRpb24uCgoyMDIxLTA5LTE2OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIERvbid0IHVzZSBjcm9zc2NhbGwyIGZvciBwYW5pY2tpbmcuIEluc3RlYWQgcmVseSBvbiBkb2N1bWVudGVkCiAgICAgICAgICAgIGFuZCBleHBvcnRlZCBpbnRlcmZhY2VzLgoKMjAyMS0wOS0xNDogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBSZW1vdmUgLW5vLWNnbyBvcHRpb24gKGxvbmcgdW5zdXBwb3J0ZWQgaW4gR28pCgoyMDIxLTA1LTA0OiBvbGx5CgkgICAgW1BIUF0gIzIwMTQgVGhyb3cgUEhQIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiB1c2luZyBQSFAgZXJyb3JzCgoJICAgIFBIUCBleGNlcHRpb25zIGNhbiBiZSBjYXVnaHQgYW5kIGhhbmRsZWQgaWYgZGVzaXJlZCwgYnV0IGlmIHRoZXkKCSAgICBhcmVuJ3QgY2F1Z2h0IHRoZW4gUEhQIGV4aXRzIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIGl0IGRvZXMgZm9yIGEKCSAgICBQSFAgZXJyb3IuCgoJICAgIEluIHBhcnRpY3VsYXIgdGhpcyBtZWFucyBwYXJhbWV0ZXIgdHlwZSBlcnJvcnMgYW5kIHNvbWUgb3RoZXIgY2FzZXMKCSAgICBpbiBTV0lHLWdlbmVyYXRlZCB3cmFwcGVycyBub3cgdGhyb3cgYSBQSFAgZXhjZXB0aW9uLCB3aGljaCBtYXRjaGVzCgkgICAgaG93IFBIUCdzIG5hdGl2ZSBwYXJhbWV0ZXIgaGFuZGxpbmcgZGVhbHMgd2l0aCBzaW1pbGFyIHNpdHVhdGlvbnMuCgoJICAgIGBTV0lHX0Vycm9yQ29kZSgpYCwgYFNXSUdfRXJyb3JNc2coKWAsIGBTV0lHX0ZBSUwoKWAgYW5kIGBnb3RvIHRocm93bjtgCgkgICAgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKHRoZXNlIGFyZSByZWFsbHkgYWxsIGludGVybmFsIGltcGxlbWVudGF0aW9uCgkgICAgZGV0YWlscyBhbmQgbm9uZSBhcmUgZG9jdW1lbnRlZCBhc2lkZSBmcm9tIGJyaWVmIG1lbnRpb25zIGluIENIQU5HRVMKCSAgICBmb3IgdGhlIGZpcnN0IHRocmVlKS4gIEkgd2Fzbid0IGFibGUgdG8gZmluZCBhbnkgdXNlcyBpbiB1c2VyIGludGVyZmFjZQoJICAgIGZpbGVzIGF0IGxlYXN0IGluIEZPU1MgY29kZSB2aWEgY29kZSBzZWFyY2ggdG9vbHMuCgoJICAgIElmIHlvdSBhcmUgdXNpbmcgdGhlc2U6CgoJICAgIFVzZSBgU1dJR19QSFBfRXJyb3IoY29kZSxtc2cpO2AgaW5zdGVhZCBvZiBgU1dJR19FcnJvckNvZGUoY29kZSk7CgkgICAgU1dJR19FcnJvck1zZyhtc2cpO2AgKHdoaWNoIHdpbGwgdGhyb3cgYSBQSFAgZXhjZXB0aW9uIGluIFNXSUcgPj0gNC4xCgkgICAgYW5kIGRvIHRoZSBzYW1lIGFzIHRoZSBpbmRpdmlkdWFsIGNhbGxzIGluIG9sZGVyIFNXSUcpLgoKCSAgICBgU1dJR19GQUlMKCk7YCBhbmQgYGdvdG8gdGhyb3duO2AgY2FuIHR5cGljYWxseSBiZSByZXBsYWNlZCB3aXRoCgkgICAgYFNXSUdfZmFpbDtgLiAgVGhpcyB3aWxsIHByb2JhYmx5IGFsc28gd29yayB3aXRoIG9sZGVyIFNXSUcsIGJ1dAoJICAgIHBsZWFzZSB0ZXN0IHdpdGggeW91ciB3cmFwcGVycyBpZiB0aGlzIGlzIGltcG9ydGFudCB0byB5b3UuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMS0wNS0xNzogYWRyMjYKICAgICAgICAgICAgW1B5dGhvbl0gIzE5ODUgRml4IG1lbW9yeSBsZWFrczoKCiAgICAgICAgICAgIDEuIFB5dGhvbiBvYmplY3QgcmVmZXJlbmNlcyB3ZXJlIGJlaW5nIGluY29ycmVjdGx5IHJldGFpbmVkIGJ5CiAgICAgICAgICAgIFN3aWdQeUNsaWVudERhdGEsIGNhdXNpbmcgc3dpZ192YXJsaW5rX2RlYWxsb2MoKSBuZXZlciB0byBydW4gLyBmcmVlCiAgICAgICAgICAgIG1lbW9yeS4gU3dpZ1B5Q2xpZW50RGF0YV9OZXcoKSAvIFN3aWdQeUNsaWVudERhdGFfRGVsKCkgd2VyZSB1cGRhdGVkCiAgICAgICAgICAgIHRvIGZpeCB0aGUgb2JqZWN0IHJlZmVyZW5jZSBjb3VudGluZywgY2F1c2luZyBzd2lnX3ZhcmxpbmtfZGVhbGxvYygpCiAgICAgICAgICAgIHRvIHJ1biBhbmQgdGhlIG1lbW9yeSBzd2lnX3Zhcmxpbmsgb3ducyB0byBiZSBmcmVlZC4KCiAgICAgICAgICAgIDIuIFN3aWdQeUNsaWVudERhdGEgaXRzZWxmIHdhcyBub3QgZnJlZWQgYnkgU3dpZ1B5Q2xpZW50RGF0YV9EZWwoKSwKICAgICAgICAgICAgY2F1c2luZyBhbm90aGVyIGhlYXAgbGVhay4gVGhlIHJlcXVpcmVkIGZyZWUoKSB3YXMgYWRkZWQgdG8KICAgICAgICAgICAgU3dpZ1B5Q2xpZW50RGF0YV9EZWwoKQoKICAgICAgICAgICAgMy4gRml4IHJlZmVyZW5jZSBjb3VudGluZy9sZWFrIG9mIHB5dGhvbiBjYWNoZWQgdHlwZSBxdWVyeQoKICAgICAgICAgICAgNC4gRml4IHJlZmVyZW5jZSBjb3VudGluZy9sZWFrIG9mIFN3aWdQeU9iamVjdCBkaWN0ICgtYnVpbHRpbikKCiAgICAgICAgICAgIDUuIFB5dGhvbiBvYmplY3QgcmVmZXJlbmNlIGNvdW50aW5nIGZpeGVzIGZvciBvdXQtb2YtbWVtb3J5CiAgICAgICAgICAgIHNjZW5hcmlvcyB3ZXJlIGFkZGVkIHRvOiBTV0lHX1B5dGhvbl9SYWlzZU9yTW9kaWZ5VHlwZUVycm9yKCksCiAgICAgICAgICAgIFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dCgpLCBTd2lnUHlDbGllbnREYXRhX05ldygpLAogICAgICAgICAgICBTd2lnUHlPYmplY3RfZ2V0X19fZGljdF9fKCkgYW5kIFN3aWdQeU9iamVjdF9mb3JtYXQoKQoKICAgICAgICAgICAgNi4gQWRkIGVycm9yIGhhbmRsaW5nIGZvciBQeU1vZHVsZV9BZGRPYmplY3QoKSB0bwogICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRNb2R1bGUoKSAoZmFpbHVyZSBjb3VsZCBiZSBjYXVzZWQgYnkgT09NIG9yIGEgbmFtZQogICAgICAgICAgICBjbGFzaCBjYXVzZWQgYnkgbWFsaWNpb3VzIGNvZGUpCgoyMDIxLTA1LTEzOiBvbGx5CgkgICAgW1VGRkldICMyMDA5IFJlbW92ZSBjb2RlIGZvciBDb21tb24gTGlzcCBVRkZJLiAgV2UgZHJvcHBlZCBzdXBwb3J0CgkgICAgZm9yIGl0IGluIFNXSUcgNC4wLjAgYW5kIG5vYm9keSBoYXMgc3RlcHBlZCBmb3J3YXJkIHRvIHJldml2ZSBpdCBpbgoJICAgIG92ZXIgMiB5ZWFycy4KCjIwMjEtMDUtMTM6IG9sbHkKCSAgICBbUy1FWFBdICMyMDA5IFJlbW92ZSBjb2RlIGZvciBDb21tb24gTGlzcCBTLUV4cC4gIFdlIGRyb3BwZWQKCSAgICBzdXBwb3J0IGZvciBpdCBpbiBTV0lHIDQuMC4wIGFuZCBub2JvZHkgaGFzIHN0ZXBwZWQgZm9yd2FyZCB0bwoJICAgIHJldml2ZSBpdCBpbiBvdmVyIDIgeWVhcnMuCgoyMDIxLTA1LTEzOiBvbGx5CgkgICAgW1Bpa2VdICMyMDA5IFJlbW92ZSBjb2RlIGZvciBQaWtlLiAgV2UgZHJvcHBlZCBzdXBwb3J0IGZvciBpdCBpbgoJICAgIFNXSUcgNC4wLjAgYW5kIG5vYm9keSBoYXMgc3RlcHBlZCBmb3J3YXJkIHRvIHJldml2ZSBpdCBpbiBvdmVyIDIKCSAgICB5ZWFycy4KCjIwMjEtMDUtMTM6IG9sbHkKCSAgICBbTW9kdWxhM10gIzIwMDkgUmVtb3ZlIGNvZGUgZm9yIE1vZHVsYTMuICBXZSBkcm9wcGVkIHN1cHBvcnQgZm9yIGl0CgkgICAgaW4gU1dJRyA0LjAuMCBhbmQgbm9ib2R5IGhhcyBzdGVwcGVkIGZvcndhcmQgdG8gcmV2aXZlIGl0IGluIG92ZXIgMgoJICAgIHllYXJzLgoKMjAyMS0wNS0xMzogb2xseQoJICAgIFtDTElTUF0gIzIwMDkgUmVtb3ZlIGNvZGUgZm9yIEdOVSBDb21tb24gTGlzcC4gIFdlIGRyb3BwZWQgc3VwcG9ydAoJICAgIGZvciBpdCBpbiBTV0lHIDQuMC4wIGFuZCBub2JvZHkgaGFzIHN0ZXBwZWQgZm9yd2FyZCB0byByZXZpdmUgaXQgaW4KCSAgICBvdmVyIDIgeWVhcnMuCgoyMDIxLTA1LTEzOiBvbGx5CgkgICAgW0NoaWNrZW5dICMyMDA5IFJlbW92ZSBjb2RlIGZvciBDaGlja2VuLiAgV2UgZHJvcHBlZCBzdXBwb3J0IGZvciBpdAoJICAgIGluIFNXSUcgNC4wLjAgYW5kIG5vYm9keSBoYXMgc3RlcHBlZCBmb3J3YXJkIHRvIHJldml2ZSBpdCBpbiBvdmVyIDIKCSAgICB5ZWFycy4KCjIwMjEtMDUtMTM6IG9sbHkKCSAgICBbQWxsZWdyb2NsXSAjMjAwOSBSZW1vdmUgY29kZSBmb3IgQWxsZWdybyBDb21tb24gTGlzcC4gIFdlIGRyb3BwZWQKCSAgICBzdXBwb3J0IGZvciBpdCBpbiBTV0lHIDQuMC4wIGFuZCBub2JvZHkgaGFzIHN0ZXBwZWQgZm9yd2FyZCB0bwoJICAgIHJldml2ZSBpdCBpbiBvdmVyIDIgeWVhcnMuCgoyMDIxLTA1LTA0OiBvbGx5CgkgICAgW1BIUF0gIzE5ODIgIzE0NTcgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvMTMzOS8KCSAgICBTV0lHIG5vdyBvbmx5IHVzZSBQSFAncyBDIEFQSSB0byBpbXBsZW1lbnQgaXRzIHdyYXBwZXJzLCBhbmQgbm8KCSAgICBsb25nZXIgZ2VuZXJhdGVzIFBIUCBjb2RlIHRvIGRlZmluZSBjbGFzc2VzLiAgVGhlIHdyYXBwZXJzIHNob3VsZAoJICAgIGJlIGFsbW9zdCBlbnRpcmVseSBjb21wYXRpYmxlIHdpdGggdGhvc2UgZ2VuZXJhdGVkIGJlZm9yZSwgYnV0CgkgICAgZmFzdGVyIGFuZCB3aXRob3V0IHNvbWUgcHJldmlvdXNseSBoYXJkLXRvLWZpeCBidWdzLgoKCSAgICBUaGUgbWFpbiBub3RhYmxlIGRpZmZlcmVuY2UgaXMgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGEgLnBocAoJICAgIHdyYXBwZXIgYXQgYWxsIGJ5IGRlZmF1bHQgKG9ubHkgaWYgJXByYWdtYShwaHApIGNvZGU9Li4uIG9yCgkgICAgJXByYWdtYShwaHApIGluY2x1ZGU9Li4uIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlKS4KCSAgICBUaGlzIGFsc28gbWVhbnMgeW91IG5lZWQgdG8gbG9hZCB0aGUgbW9kdWxlIHZpYSBleHRlbnNpb249Li4uCgkgICAgaW4gcGhwLmluaSwgcmF0aGVyIHRoYW4gbGV0dGluZyB0aGUgZGwoKSBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgLnBocCB3cmFwcGVyIGxvYWQgaXQgKGJ1dCBkbCgpIGhhcyBvbmx5IHdvcmtlZCBmb3IgY29tbWFuZC1saW5lCgkgICAgUEhQIGZvciBzb21lIHllYXJzIG5vdykuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMS0wNC0zMDogb2xseQoJICAgICMxOTg0IFJlbW92ZSBzdXBwb3J0IGZvciAkc291cmNlIGFuZCAkdGFyZ2V0LgoJICAgIFRoZXNlIHdlcmUgb2ZmaWNpYWxseSBkZXByZWNhdGVkIGluIDIwMDEsIGFuZCBhdHRlbXB0cyB0byB1c2UgdGhlbSBoYXZlCgkgICAgcmVzdWx0ZWQgaW4gYSB3YXJuaW5nIChpbmNsdWRpbmcgYSBwb2ludGVyIHRvIHdoYXQgdG8gdXBkYXRlIHRoZW0gdG8pCgkgICAgZm9yIG1vc3QgaWYgbm90IGFsbCBvZiB0aGF0IHRpbWUuCgoyMDIxLTA0LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTk4NyBbSmF2YV0gRml4ICVpbnRlcmZhY2UgZmFtaWx5IG9mIG1hY3JvcyBmb3IgcmV0dXJuaW5nIGJ5IGNvbnN0CiAgICAgICAgICAgIHBvaW50ZXIgcmVmZXJlbmNlLgoKMjAyMS0wNC0xOTogb2xseQoJICAgIEZpeCB1c2Ugb2YgdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgZm9yIGFuCgkgICAgZW1wdHkgdHlwZWNoZWNrIHR5cGVtYXAsIHN1Y2ggYXMgdGhlIGR1bW15IG9uZSB3ZSBpbmNsdWRlIGZvcgoJICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdC4KCjIwMjEtMDQtMTI6IG9sbHkKCSAgICAjMTc3NyBbUHl0aG9uXSBTcGVjaWZ5aW5nIC1weTMgbm93IGdlbmVyYXRlcyBhIGNoZWNrIGZvciBQeXRob24KCSAgICB2ZXJzaW9uID49IDMuMC4KCjIwMjEtMDMtMjY6IG9sbHkKCSAgICBbUEhQXSBBZGQgUEhQIGtleXdvcmRzICdmbicgKGFkZGVkIGluIDcuNCkgYW5kICdtYXRjaCcgKGFkZGVkIGluCgkgICAgOC4wKSB0byB0aGUgbGlzdCBTV0lHIGtub3dzIHRvIGF1dG9tYXRpY2FsbHkgcmVuYW1lLgoKMjAyMS0wMy0yMzogd3NmdWx0b24KICAgICAgICAgICAgIzE5NDIgW1B5dGhvbl0gRml4IGNvbXBpbGF0aW9uIGVycm9yIGluIHdyYXBwZXJzIHdoZW4gdXNpbmcgLWJ1aWx0aW4KICAgICAgICAgICAgYW5kIHdyYXBwaW5nIHZhcmFyZ3MgaW4gY29uc3RydWN0b3JzLgoKMjAyMS0wMy0yMjogZ290bzQwCiAgICAgICAgICAgICMxOTc3IEZpeCBoYW5kbGluZyBvZiB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgoKMjAyMS0wMy0yMTogb2xseQoJICAgICMxOTI5LCAjMTk3OCBbUEhQXSBBZGQgc3VwcG9ydCBmb3IgUEhQIDguCgoyMDIxLTAzLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTYxMCBSZW1vdmUgLWFuc2kgZnJvbSBkZWZhdWx0IGNvbXBpbGF0aW9uIGZsYWdzLgoKMjAyMS0wMy0xOTogZG90LWFzbQogICAgICAgICAgICAjMTkzNCBbSmF2YV0gQ2xlYW4gdXAgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhcnJheXMuCgoyMDIxLTAzLTE5OiBvbGx5CgkgICAgIzE1MjcgW1BIUF0gSW1wcm92ZSBQSFAgb2JqZWN0IGNyZWF0aW9uIGluIGRpcmVjdG9yaW4gY2FzZS4KCSAgICBSZXBvcnRlZGx5IHRoZSBjb2RlIHdlIHdlcmUgdXNpbmcgaW4gdGhpcyBjYXNlIGdhdmUgc2VnZmF1bHRzIGluCgkgICAgUEhQIDcuMiBhbmQgbGF0ZXIgLSB3ZSd2ZSBiZWVuIHVuYWJsZSB0byByZXByb2R1Y2UgdGhlc2UsIGJ1dCB0aGUKCSAgICBuZXcgYXBwcm9hY2ggaXMgYWxzbyBzaW1wbGVyIGFuZCBzaG91bGQgYmUgYml0IGZhc3RlciB0b28uCgoyMDIxLTAzLTE4OiBvbGx5CgkgICAgIzE2NTUgW1BIUF0gRml4IGNoYXIqIHR5cGVjaGVjayB0eXBlbWFwIHRvIGFjY2VwdCBQSFAgTnVsbCBsaWtlIHRoZQoJICAgIGNvcnJlc3BvbmRpbmcgaW4gdHlwZW1hcCBkb2VzLgoKMjAyMS0wMy0xODogb2xseQoJICAgICMxOTAwLCAjMTkwNSBbUEhQXSBGaXggd3JhcHBpbmcgb2Ygb3ZlcmxvYWRlZCBkaXJlY3RlZCBtZXRob2RzIHdpdGgKCSAgICBub24tdm9pZCByZXR1cm4uCgoyMDIxLTAzLTExOiBtdXJpbGxvMTI4CiAgICAgICAgICAgICMxNDk4IFtKYXZhc2NyaXB0XSBTdXBwb3J0IHR5cGUgY29udmVyc2lvbi4KCjIwMjEtMDMtMDY6IG5zaG15cmV2CiAgICAgICAgICAgICM4NzIgW0phdmFzY3JpcHRdIFZhcmlvdXMgdHlwZW1hcCBpc3N1ZXMgaW4gYXJyYXlzX2phdmFzY3JpcHQuaSBmaXhlZC4KCjIwMjEtMDMtMDM6IHZhdWdoYW1ob25nCiAgICAgICAgICAgICM1NzcgW0phdmFzY3JpcHRdIEltcGxlbWVudGVkIFNldE1vZHVsZS9HZXRNb2R1bGUgZm9yIEpTQyB0byBhbGxvdyB0eXBlIHNoYXJpbmcKICAgICAgICAgICAgYWNyb3NzIG1vZHVsZXMuCgoyMDIxLTAzLTAxOiB4YW50YXJlcywgT2xpdmVyIEJ1Y2h0YWxhLCBnZW9ncmFwaGlrYQogICAgICAgICAgICAjMTA0MCBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgU1dJRyB3aXRoIENNYWtlLiBTZWUgZG9jdW1lbnRhdGlvbiBpbiBXaW5kb3dzLmh0bWwuCgoyMDIxLTAzLTAxOiB2YWR6CiAgICAgICAgICAgICMxOTUyIEZpeCBpbmNvcnJlY3Qgd2FybmluZyAiVW5rbm93biBEb3h5Z2VuIGNvbW1hbmQ6IC4iCgoyMDIxLTAyLTI4OiBwMmsKICAgICAgICAgICAgIzk2OSBbSmF2YXNjcmlwdF0gdjgvbm9kZSAtIHByZXZlbnQgY3Jhc2ggY2FsbGluZyBhIGNvbnN0cnVjdG9yIHdpdGhvdXQgbmV3IGtleXdvcmQuCgoyMDIxLTAyLTI4OiBhbGVjbWV2CiAgICAgICAgICAgICM0MDUgIzExMjEgW0phdmFzY3JpcHRdIEZpeCBPVVRQVVQgdHlwZW1hcHMgb24gbWV0aG9kcyB0aGF0IGRvbid0IHJldHVybiB2b2lkLgogICAgICAgICAgICBUaGUgb3V0cHV0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSByZXR1cm4gdmFsdWUuCgoyMDIxLTAyLTI2OiBtdXJpbGxvMTI4LCB3c2Z1bHRvbgogICAgICAgICAgICAjMTI2OSBbSmF2YXNjcmlwdF0gRml4IGhhbmRsaW5nIG9mIGxhcmdlIHBvc2l0aXZlIHVuc2lnbmVkIGxvbmcgYW5kCiAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZXMuCgoyMDIxLTAyLTI0OiB0b21sZWF2eSwgeWVnb3JpY2gsIHR1bmdudHBoYW0KICAgICAgICAgICAgIzE3NDYgW0phdmFzY3JpcHRdIEFkZCBzdXBwb3J0IGZvciBOb2RlIHYxMiwgdjE0IGFuZCB2MTYuCiAgICAgICAgICAgIFNXSUcgc3VwcG9ydCBmb3IgTm9kZSBpcyBub3cgZm9yIHY2IGFuZCBsYXRlciBvbmx5LgoKMjAyMC0wMi0wOTogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxODcyIEZpeCB0eXBvcyBpbiBhdHRyaWJ1dGUycmVmIG1hY3Jvcy4KCjIwMjAtMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBGaXggc28gdGhhdCBjY29tcGxleC5pIGludGVyZmFjZSB0byBmaWxlIGNhbiBiZSB1c2VkLgoKMjAyMC0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgIzI1MiBjb21wbGV4IGNhbiBub3cgYmUgdXNlZCBhcyBhIEMgaWRlbnRpZmllciBhbmQgZG9lc24ndCBnaXZlIGEgc3ludGF4IGVycm9yLgoKMjAyMC0xMC0xMDogbHBzaW5nZXIKICAgICAgICAgICAgIzE3NzAgQ29ycmVjdCBDIGNvbXBsZXggc3VwcG9ydC4KICAgICAgICAgICAgX0NvbXBsZXggaXMgbm93IHBhcnNlZCBhcyBhIGtleXdvcmQgcmF0aGVyIHRoYW4gY29tcGxleCBhcyBwZXIgdGhlIEM5OSBzdGFuZGFyZC4KICAgICAgICAgICAgVGhlIGNvbXBsZXggbWFjcm8gaXMgYXZhaWxhYmxlIGluIHRoZSBjY29tcGxleC5pIGxpYnJhcnkgZmlsZSBhbG9uZyB3aXRoIG90aGVyCiAgICAgICAgICAgIGNvbXBsZXggbnVtYmVyIGhhbmRsaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb21wbGV4LmggaGVhZGVyLgoKMjAyMC0xMC0wNzogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtQeXRob25dICMxODEyIEZpeCB0aGUgZXJyb3IgaGFuZGxpbmcgZm9yIHRoZSBQeU9iamVjdF9HZXRCdWZmZXIoKSBjYWxscyBpbgogICAgICAgICAgICBweWJ1ZmZlci5pLgoKMjAyMC0xMC0wNzogdHJlaXRtYXlyCiAgICAgICAgICAgICMxODI0IEFkZCBtaXNzaW5nIHNwYWNlIGluIGRpcmVjdG9yIG1ldGhvZCBkZWNsYXJhdGlvbiByZXR1cm5pbmcKICAgICAgICAgICAgY29uc3QgcG9pbnRlci4KCjIwMjAtMTAtMDc6IGFkZWx2YTE5ODQKICAgICAgICAgICAgIzE4NTkgUmVtb3ZlIGFsbCAodHdvKSBleGNlcHRpb25zIGZyb20gU1dJRyBleGVjdXRhYmxlLgoKMjAyMC0wOS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSAjMTg3NCBBZGQgYWJpbGl0eSB0byBjaGFuZ2UgdGhlIG1vZGlmaWVycyBmb3IgdGhlIGludGVyZmFjZQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiB1c2luZyB0aGUgJWludGVyZmFjZSBtYWNyb3MuCgogICAgICAgICAgICBGb3IgQyMgdXNlIHRoZSAnY3NpbnRlcmZhY2Vtb2RpZmllcnMnIHR5cGVtYXAuCiAgICAgICAgICAgIEZvciBKYXZhIHVzZSB0aGUgJ2phdmFpbnRlcmZhY2Vtb2RpZmllcnMnIHR5cGVtYXAuCgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbnRlcmZhY2Vtb2RpZmllcnMpIFggImludGVybmFsIGludGVyZmFjZSIKCjIwMjAtMDktMjQ6IGdlZWZyCiAgICAgICAgICAgIFtDI10gIzE4NjggRml4IHdjaGFyX3QqIGNzdmFyb3V0IHR5cGVtYXAgZm9yIG1lbWJlciB2YXJpYWJsZSB3cmFwcGVycy4KCjIwMjAtMDgtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTg2MiBGaXggY3Jhc2hlcyBpbiBzd2lnX2Nvbm5lY3RfZGlyZWN0b3IgZHVyaW5nIGRpcmVjdG9yIGNsYXNzIGNvbnN0cnVjdGlvbgogICAgICAgICAgICB3aGVuIHVzaW5nIHRoZSBkaXJlY3RvciBjbGFzcyBmcm9tIG11bHRpcGxlIHRocmVhZHMgLSBhIHJhY2UgY29uZGl0aW9uIGluaXRpYWxpc2luZwogICAgICAgICAgICBibG9jayBzY29wZSBzdGF0aWMgdmFyaWFibGVzLiBUaGUgZml4IGlzIGd1YXJhbnRlZWQgd2hlbiB1c2luZyBDKysxMSwgYnV0IG1vc3QKICAgICAgICAgICAgY29tcGlsZXJzIGFsc28gZml4IGl0IHdoZW4gdXNpbmcgQysrMDMvQysrOTguCgoyMDIwLTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBpbml0aWFsaXplciBmb3IgbWVtYmVyICdfaGVhcHR5cGVvYmplY3Q6Omh0X21vZHVsZScgd2hlbiB1c2luZwogICAgICAgICAgICAtYnVpbHRpbiB0byBjb21wbGV0ZSBQeXRob24gMy45IHN1cHBvcnQuCgoyMDIwLTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgUHlFdmFsX0luaXRUaHJlYWRzKCkgY2FsbCBmb3IgUHl0aG9uIDMuNyBhbmQgbGF0ZXIgYXMgUHl0aG9uIGNhbGxzCiAgICAgICAgICAgIGl0IGF1dG9tYXRpY2FsbHkgbm93LiBUaGlzIHJlbW92ZXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gdXNpbmcgUHl0aG9uIDMuOS4KCjIwMjAtMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFsbCBQeXRob24gZXhhbXBsZXMgYW5kIHRlc3RzIGFyZSB3cml0dGVuIHRvIGJlIFB5dGhvbiAyIGFuZCBQeXRob24gMwogICAgICAgICAgICBjb21wYXRpYmxlLCByZW1vdmluZyB0aGUgbmVlZCBmb3IgMnRvMyB0byBydW4gdGhlIGV4YW1wbGVzIG9yIHRlc3Qtc3VpdGUuCgoyMDIwLTA4LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciB2b2lkICpWT0lEX0lOVF9QVFIgZm9yIG1lbWJlciB2YXJpYWJsZXMuCgoyMDIwLTA3LTI5OiBjaHJpc2J1cnIKICAgICAgICAgICAgIzE4NDMgW1B5dGhvbl0gQ29tcGlsYXRpb24gZXJyb3IgZml4IGluIFN3aWdQeUJ1aWx0aW5fU2V0TWV0YVR5cGUgd2hlbiB1c2luZyBQeVB5LgoKMjAyMC0wNi0xNDogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNjQyICMxODA5IEZpeCB2aXJ0dWFsIGNvbXBhcmlzb24gb3BlcmF0b3JzIGluIGRpcmVjdG9yIGNsYXNzZXMgYnkgcmVtb3ZpbmcgYW4KICAgICAgICAgICAgaW5jb3JyZWN0IHNwYWNlIGluIHRoZSBmdW5jdGlvbiBuYW1lIChmb3IgZXhhbXBsZSwgb3BlcmF0b3I9ID0gaXMgbm93IG9wZXJhdG9yPT0pLgoKVmVyc2lvbiA0LjAuMiAoOCBKdW4gMjAyMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMjAtMDYtMDcgIHZpZ3N0ZXJrcgogICAgICAgICAgICBbUnVieV0gIzE3MTcgTmlsIGZpeCBtYW5nbGluZyBzdHJpbmdzCgoyMDIwLTA2LTA3ICB2YWR6CiAgICAgICAgICAgICMxNzQ4IEZpeCBkb3h5Z2VuIGNvbW1lbnRzIHF1b3RpbmcgaXNzdWUKCjIwMjAtMDYtMDcgIG11bm9haAogICAgICAgICAgICAjMTgwMCBFc2NhcGUgc3BhY2VzIGluIGZpbGUgcGF0aHMgZm9yIGRlcGVuZGVuY2llcyAoLU0gLU1NIGV0YykKCjIwMjAtMDYtMDYgIGFuZHJlYXMtc2Nod2FiCiAgICAgICAgICAgIFtSdWJ5XSAjMTgwMSBGaXggZW5jb2Rpbmcgb24gYmlnIGVuZGlhbiBzeXN0ZW1zIHdoZW4gd3JhcHBpbmcgc3RkOjp3c3RyaW5nLgoKMjAyMC0wNS0zMSAga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSAjMTc4OSBlcnJvciBoYW5kbGluZyBpbXByb3ZlbWVudHMgYW5kIHJldHVybiBlcnJvciBjb2RlIG9uIGV4aXQgZm9yIFNXSUcgd3JhcHBlZCBtb2R1bGVzLgoKMjAyMC0wNS0zMCAgbXN0ZWluYmVjawogICAgICAgICAgICBbRF0gIzE1OTMgUmVwbGFjZSBicm9rZW4gaW1wb3J0cyB3aGVuIHVzaW5nIG5ld2VyIHZlcnNpb25zIG9mIEQuCgoyMDIwLTA1LTI5OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW1B5dGhvbl0gIzE3MTYgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHdoZW4gY29udmVydGluZyBzdHJpbmdzIHdoZW4gdXNpbmcgUHl0aG9uID49IDMuMy4KCjIwMjAtMDUtMjg6IFphY2tlcnlTcHl0egogICAgICAgICAgICAjMTc3NiBRdWl0ZSBkcmFtYXRpY2FsbHkgZGVjcmVhc2UgcnVuIHRpbWVzIHdoZW4gZ2VuZXJhdGluZyB2ZXJ5IGxhcmdlIGludGVyZmFjZSBmaWxlcyBieSBjaGFuZ2luZwogICAgICAgICAgICBzb21lIGludGVybmFsIG1lbW9yeSBwb29sIHNpemVzLgoKMjAyMC0wNS0yODogbWNmYXJsam0KICAgICAgICAgICAgIzE3ODggRml4IGhhbmRsaW5nIG9mIERveHlnZW4gXGVuZGxpbmsgY29tbWFuZC4KCjIwMjAtMDUtMjQ6IHZhcGllcgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzE3OTYgRml4IHBrZy1jb25maWcgaW52b2NhdGlvbiBpbiBjb25maWd1cmUuCgoyMDIwLTA0LTMwOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBleGNlcHRpb24gcmFpc2luZyBmb3IgbmV3ZXIgT2N0YXZlIHZlcnNpb25zCiAgICAgICAgICAgIFNpbmNlIChhdCBsZWFzdCkgT2N0YXZlIDUuMS4wLCB0aGUgT2N0YXZlIGVycm9yKCkgZnVuY3Rpb24gbm93IHJhaXNlcyBhIEMrKyBleGNlcHRpb24sCiAgICAgICAgICAgIHdoaWNoIGlmIHVuY2F1Z2h0IGltbWVkaWF0ZWx5IGV4aXRzIGEgU1dJRyB3cmFwcGVyIGZ1bmN0aW9uLCBieXBhc3NpbmcgYW55IGNsZWFudXAgY29kZQogICAgICAgICAgICB0aGF0IG1heSBhcHBlYXIgYWZ0ZXIgYSAiZmFpbDoiIGxhYmVsLiBUaGlzIHBhdGNoIGFkZHMgYSAidHJ5IHsgLi4uIH0gY2F0Y2goLi4uKSB7IH0iCiAgICAgICAgICAgIGJsb2NrIGFyb3VuZCB0aGUgY29udGVudHMgb2YgU1dJRyB3cmFwcGVyIGZ1bmN0aW9ucyB0byBmaXJzdCBleGVjdXRlIHRoZSBjbGVhbnVwIGNvZGUKICAgICAgICAgICAgYmVmb3JlIHJldGhyb3dpbmcgYW55IGV4Y2VwdGlvbiByYWlzZWQuIEl0IGlzIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIHZlcnNpb25zCiAgICAgICAgICAgIG9mIE9jdGF2ZSB3aGVyZSBlcnJvcigpIGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBzdGlsbCBicmFuY2ggdG8gdGhlCiAgICAgICAgICAgICJmYWlsOiIgYmxvY2sgdG8gZXhlY3V0ZSBjbGVhbnVwIGNvZGUgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIG5ldyAidHJ5IHsgLi4uIH0gY2F0Y2goLi4uKSB7IH0iIGJsb2NrIHdpbGwgbG9jYWxpc2UgYW55IGxvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICB1c2VkIGluIHR5cGVtYXBzIHRoYXQgd2VyZSBOT1QgZGVjbGFyZWQgdGhyb3VnaCBTV0lHJ3MgJXR5cGVtYXAoLi4uKSBzeW50YXgsIHNvIGl0J3MKICAgICAgICAgICAgcG9zc2libGUgdGhpcyBjb3VsZCBicmVhayBleGlzdGluZyBTV0lHIHdyYXBwZXJzIHdoaWNoIHdlcmUgaW1wbGljaXRseSBzaGFyaW5nIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlcyBiZXR3ZWVuIHR5cGVtYXBzLiBUaGlzIGNhbiBiZSBmaXhlZCwgaG93ZXZlciwgYnkgZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICB3aGljaCBuZWVkIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHR5cGVtYXBzIHRocm91Z2ggU1dJRydzICV0eXBlbWFwKC4uLikgc3ludGF4LgoKMjAyMC0wMi0xODogcnlhbm5ldmVsbAogICAgICAgICAgICBbTHVhXSAjMTcyOCBBZGQgc3VwcG9ydCBmb3IgTFVBIGxpZ2h0dXNlcmRhdGEgdG8gU1dJR19MdWFfQ29udmVydFB0ci4KCjIwMjAtMDItMTg6IGRtYWNoCiAgICAgICAgICAgIFtSdWJ5XSAjMTcyNSBGaXggZ2NjIC1XY2F0Y2gtdmFsdWUgd2FybmluZ3MuCgoyMDIwLTAyLTE0OiB0cmVpdG1heXIKICAgICAgICAgICAgIzE3MjQgRml4IHdyYXBwaW5nIG9mIGFic3RyYWN0IHVzZXItZGVmaW5lZCBjb252ZXJzaW9uIG9wZXJhdG9ycy4KCjIwMjAtMDItMTM6IGRkdXJoYW0yCiAgICAgICAgICAgIFtQeXRob25dICMxNTEyIEZpeCBtZW1sZWFrIHdoZW4gdXNpbmcgU1RMIGNvbnRhaW5lcnMgb2Ygc2hhcmVkX3B0ciBvYmplY3RzLgoKMjAyMC0wMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE2NzMgIzE2NzQgRml4IHNldHRpbmcgJ3RoaXMnIHdoZW4gZXh0ZW5kaW5nIGEgcHJveHkgY2xhc3Mgd2l0aCBfX3Nsb3RzX18uCgoyMDIwLTAxLTMxOiB2YWR6CiAgICAgICAgICAgIFtSdWJ5XSAjMTY1MSBBZGQgc3RkOjphdXRvX3B0cjw+IHR5cGVtYXBzLgoKMjAyMC0wMS0zMTogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtQeXRob25dICMxNzAwIFRoZSBQeXRob24gQyBBUEkgZnVuY3Rpb25zIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKCkgYW5kCiAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSgpIGFyZSBub3cgY2hlY2tlZCBmb3IgZmFpbHVyZS4KCjIwMjAtMDEtMzE6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gIzE3MTAgRml4IGNyYXNoIHBhcnNpbmcgZW1wdHkgZG9jc3RyaW5ncy4KCjIwMjAtMDEtMzA6IEFsemF0aGFyCiAgICAgICAgICAgIFtSXSAjOTEwICM5MTQgRml4IFIgbWVtb3J5IGxlYWsgb24gZXhjZXB0aW9uLgoKMjAyMC0wMS0zMDogcmljaGFyZGJlYXJlCiAgICAgICAgICAgIFtSXSAjMTUxMSBGaXggYnVnIHdyYXBwaW5nIGZ1bmN0aW9ucy4gVGhlc2Ugd2VyZSBwcmV2aW91c2x5IGluY29ycmVjdGx5IHdyYXBwZWQgYXMgaWYKICAgICAgICAgICAgdGhleSB3ZXJlIHZhcmlhYmxlcy4gVGhpcyBoYXBwZW5lZCB3aGVuICdnZXQnIG9yICdzZXQnIHdhcyBpbiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgb3IgbWV0aG9kLCBidXQgc29tZXRpbWVzIGFsc28gaW4gc29tZSBvdGhlciBjaXJjdW1zdGFuY2VzLiBJZiB5b3Ugd2VyZSB1c2luZyBSCiAgICAgICAgICAgIGF0dHJpYnV0ZSBzeW50YXggdG8gYWNjZXNzIHRoZXNlIG1ldGhvZHMsIHlvdSdsbCBuZWVkIHRvIHN3aXRjaCB0byBjYWxsaW5nIHRoZW0gYXMgUgogICAgICAgICAgICBtZXRob2RzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDIwLTAxLTI0OiBldHNlLWRpZ25pdGFzLCB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEphdmFdICMxNTMzIEZpeCB1cGNhc3RpbmcgZm9yIHNoYXJlZF9wdHIncyBvZiB0ZW1wbGF0ZWQgdHlwZXMuCgoyMDIwLTAxLTE2OiBtY2ZhcmxqbQogICAgICAgICAgICAjMTY0MyAjMTY1NCBXaGVuIHVzaW5nIC1kb3h5Z2VuLCBmaXggc2VnZmF1bHQgd2hlbiBuYW1lbGVzcyBwYXJhbWV0ZXJzIG9yIHZhcmFyZyBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFyZSB1c2VkLgoKMjAyMC0wMS0xNjogbWNmYXJsam0KICAgICAgICAgICAgIzE2MzIgIzE2NTkgRml4IG5ld2xpbmUgaGFuZGxpbmcgZm9yIGRveHlnZW4gIi8vLyIgY29tbWVudHMuCgoyMDIwLTAxLTE0OiBtY2ZhcmxqbQogICAgICAgICAgICAjMTY0NyAjMTY1NiBGaXggY3Jhc2ggaGFuZGxpbmcgZW1wdHkgZG94eWdlbiBjb21tZW50cy4KCjIwMjAtMDEtMTQ6IG1jZmFybGptCiAgICAgICAgICAgICMxNjA4IEltcHJvdmUgZG94eWdlbiBzdXBwb3J0LgogICAgICAgICAgICAtIEFkZCBzdXBwb3J0IGZvciBccGFyYW1bXSBjb21tYW5kcyBzdWNoIGFzOiBccGFyYW1baW5dLgogICAgICAgICAgICAtIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgbWFya2VkIGFzICdvcHRpb25hbCcgaW4gcHlkb2MuCiAgICAgICAgICAgIC0gSW1wcm92ZSBzdXBwb3J0IGZvciBcY29kZSBjb21tYW5kcyBzbyB0aGF0IG90aGVyIGxhbmd1YWdlcyBhcmUgc3VwcG9ydGVkIGFzIGNvZGUgYmxvY2tzLgogICAgICAgICAgICAgIFN1cHBvcnQgYWRkZWQgZm9yIGphdmEsIGMgYW5kIHB5LiAgRm9yIGV4YW1wbGUgUHl0aG9uOiBcY29kZXsucHl9IC4uLiBcZW5kY29kZQogICAgICAgICAgICAtIEZpeCBkb3h5Z2VuIGhhbmRsaW5nIG9mIFxlbSBhbmQgXHAgdGFncyBmb3IgUHl0aG9uLgoKMjAyMC0wMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE1OTUgUHl0aG9uIC1idWlsdGluIGNvbnN0cnVjdG9ycyBzaWxlbnRseSBpZ25vcmVkIGtleXdvcmQgYXJndW1lbnRzLgogICAgICAgICAgICBJbnN0ZWFkIG9mIHNpbGVudGx5IGlnbm9yaW5nIHRoZW0sIG5vdyBhICJUeXBlRXJyb3I6IGYoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgdXNlZC4gSGVuY2UgY29uc3RydWN0b3JzIGFuZCBub3JtYWwgbWV0aG9kcy8KICAgICAgICAgICAgZnVuY3Rpb25zIGJlaGF2ZSBpbiB0aGUgc2FtZSB3YXkuIE5vdGUsIC1rZXl3b3JkIHNob3VsZCBiZSB1c2VkIHdpdGggLWJ1aWx0aW4gdG8gb2J0YWluCiAgICAgICAgICAgIGtleXdvcmQgYXJndW1lbnQgc3VwcG9ydC4KCjIwMjAtMDEtMDU6IGpzY2h1ZWxsZXIgc2hhZGNoaW4KICAgICAgICAgICAgW1B5dGhvbl0gIzE2NzAgIzE2OTYgQWRkIG1pc3NpbmcgZmllbGQgaW5pdGlhbGl6ZXJzIGludHJvZHVjZWQgaW4gcHl0aG9uIDMuODoKICAgICAgICAgICAgdHBfdmVjdG9yY2FsbCBhbmQgdHBfcHJpbnQuCgoyMDIwLTAxLTA1OiBmcmllZHJpY2hhdGdjCiAgICAgICAgICAgIFtPY3RhdmVdICMxNjg4IENoYW5nZSBzd2lnX3RoaXMoKSB0byB1c2Ugc2l6ZV90IGluc3RlYWQgb2YgbG9uZyBmb3IgY29tcGF0aWJpbGl0eQogICAgICAgICAgICB3aXRoIFdpbmRvd3MgNjQgYml0LgoKMjAyMC0wMS0wNTogdHJlaXRtYXlyCiAgICAgICAgICAgIFtSdWJ5XSAjMTY5MiAjMTY4OSBBZGQgc3VwcG9ydCBmb3IgUnVieSAyLjcKCjIwMTktMTItMzA6IHRyZWl0bWF5cgogICAgICAgICAgICBbUnVieV0gIzE2NTMgIzE2NjggRml4IGNvZGUgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgLWdsb2JhbG1vZHVsZSBvcHRpb24uCgoyMDE5LTEyLTI5OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTY4NiBGaXggY29tcGlsYXRpb24gZXJyb3JzIHdpdGggT0NhbWwgNC4wOS4wLgoKMjAxOS0xMi0xMDogd3NmdWx0b24KICAgICAgICAgICAgIzE2NzkgRml4IHBhcnNpbmcgb2YgQysrMTEgaWRlbnRpZmllcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmcgKGZpbmFsIGFuZCBvdmVycmlkZSkgd2hlbgogICAgICAgICAgICB0aGV5IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNjb3BlIG5hbWUgb2YgYW4gaWRlbnRpZmllciwgc3VjaCBhcyBhIG5hbWVzcGFjZSBuYW1lLgoKMjAxOS0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjMTYyOCAnb3V0JyBvciAncmVmJyB1c2VkIGluIGEgY3N0eXBlIHR5cGVtYXAgd2FzIG5vdCBhbHdheXMgc3RyaXBwZWQgb3V0IGluIHBhcnRzCiAgICAgICAgICAgIG9mIGRpcmVjdG9yIGNvZGUgZ2VuZXJhdGlvbi4KCjIwMTktMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNTk1IEZpeCBidWcgaW4gc3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgKGt3YXJncyBmZWF0dXJlIG9yIC1rZXl3b3JkKQogICAgICAgICAgICB3aGVuIHVzaW5nIC1idWlsdGluLiBUaGUgZml4IGlzIGluIHRoZSBhcmd1bWVudCBlcnJvciBjaGVja2luZyB3aGVuIHdyYXBwaW5nIHplcm8KICAgICAgICAgICAgYXJndW1lbnQgY29uc3RydWN0b3JzIG9ubHkuCgpWZXJzaW9uIDQuMC4xICgyMSBBdWcgMjAxOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE5LTA4LTIwOiBUZWt1Q29uY2VwdAogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzE1MzUgQWRkICVuYXRpdmUgc3VwcG9ydCB0byBKYXZhc2NyaXB0LgoKMjAxOS0wOC0yMDogYmtvdHp6CiAgICAgICAgICAgIFtKYXZhXSAjMTYxNiBBZGQgU1dJR19KYXZhSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRvIHN1cHBvcnQgdGhyb3dpbmcKICAgICAgICAgICAgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmcm9tIEpOSSBjb2RlLgoKMjAxOS0wOC0xOTogc2ptbAogICAgICAgICAgICBbTHVhXSAjMTU5NiB0b3N0cmluZyBvdXRwdXQgY2hhbmdlcyB0byBzaG93IHRoZSB1bmRlcmx5aW5nIEMvQysrIHBvaW50ZXIuCgoyMDE5LTA4LTA4OiByb2t1cHMKICAgICAgICAgICAgW0MjLCBKYXZhXSAjMTYwMSBGaXggaW52YWxpZCBjb2RlIGdlbmVyYXRlZCBmb3IgIiVjb25zdGFudCBlbnVtIEVudW1UeXBlLgoKMjAxOS0wOC0wNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IG1ldGhvZCBvdmVybG9hZGluZyBvZiBtZXRob2RzIHRoYXQgdGFrZSBTVEwgY29udGFpbmVycyBvZiBkaWZmZXJlbnQKICAgICAgICAgICAgdHlwZXMuIFRoZSBmb2xsb3dpbmcgdXNhZ2UgKHVzaW5nIHN0ZDo6dmVjdG9yKSB3b3VsZCBmYWlsIHdoZW4gdXNpbmcgLWJ1aWx0aW46CgogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF92ZWN0b3IuaT4KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JYKSBzdGQ6OnZlY3RvcjxYPjsKICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdG9ySW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICBzdHJpbmcgVmVjdG9yT3ZlcmxvYWQodmVjdG9yPFg+IHYpOwogICAgICAgICAgICAgIHN0cmluZyBWZWN0b3JPdmVybG9hZCh2ZWN0b3I8aW50PiB2KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB3b3VsZCBpbmNvcnJlY3RseSBmYWlsOgoKICAgICAgICAgICAgICBzID0gVmVjdG9yT3ZlcmxvYWQoWzEsIDIsIDNdKQoKICAgICAgICAgICAgV2l0aDoKCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgICAgICAgRmlsZSAicnVubWUzLnB5IiwgbGluZSAyMCwgaW4gPG1vZHVsZT4KICAgICAgICAgICAgICAgICAgcmV0ID0gVmVjdG9yT3ZlcmxvYWQoWzEsIDIsIDNdKQogICAgICAgICAgICAgIFR5cGVFcnJvcjogV3JvbmcgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9uICdWZWN0b3JPdmVybG9hZCcuCiAgICAgICAgICAgICAgICBQb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGFyZToKICAgICAgICAgICAgICAgICAgVmVjdG9yT3ZlcmxvYWQoc3RkOjp2ZWN0b3I8IE51bWJlcixzdGQ6OmFsbG9jYXRvcjwgTnVtYmVyID4gPikKICAgICAgICAgICAgICAgICAgVmVjdG9yT3ZlcmxvYWQoc3RkOjp2ZWN0b3I8IGludCxzdGQ6OmFsbG9jYXRvcjwgaW50ID4gPikKCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIHdhcyBkdWUgdG8gc29tZSBlcnJvciBoYW5kbGluZyB0aGF0IHdhcyBub3QgY2xlYXJlZCBkdXJpbmcgdHlwZWNoZWNraW5nLgogICAgICAgICAgICBJbiB0aGlzIGNhc2UgYW4gZXJyb3Igd2FzIG5vdCBjbGVhcmVkIHdoZW4gdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0IGZhaWxlZCB0aGUKICAgICAgICAgICAgdHlwZWNoZWNrIGZvciBjb252ZXJ0aW5nIHRvIFguIE9ubHkgb2NjdXJzIGluIFB5dGhvbiAzKy4KCiAgICAgICAgICAgIEluIHNvbWUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkZWQgbWV0aG9kcywgdGhlIGZvbGxvd2luZyB0eXBlIG9mIGVycm9yIG1lc3NhZ2Ugd291bGQKICAgICAgICAgICAgb2NjdXI6CgogICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcjogaW4gc2VxdWVuY2UgZWxlbWVudCAwCgogICAgICAgICAgICAgIFRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246CgogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgICAgICAgIEZpbGUgInJ1bm1lMy5weSIsIGxpbmUgMjMsIGluIDxtb2R1bGU+CiAgICAgICAgICAgICAgICAgIGNoZWNrKFZlY3Rvck92ZXJsb2FkKHYpLCAidmVjdG9yPFg+IikKICAgICAgICAgICAgICBTeXN0ZW1FcnJvcjogPGJ1aWx0LWluIGZ1bmN0aW9uIFZlY3Rvck92ZXJsb2FkPiByZXR1cm5lZCBhIHJlc3VsdCB3aXRoIGFuIGVycm9yIHNldAoKMjAxOS0wOC0wMTogd3NmdWx0b24KICAgICAgICAgICAgIzE2MDIgRml4IHJlZ3Jlc3Npb24gaW4gNC4wLjAgd2hlcmUgYSB0ZW1wbGF0ZSBmdW5jdGlvbiBjb250YWluaW5nIGEgcGFyYW1ldGVyCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZnVuY3Rpb24gbmFtZSBsZWQgdG8gdGhlIHBhcmFtZXRlciBuYW1lIHVzZWQgaW4gdGhlCiAgICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBiZWluZyBpbmNvcnJlY3RseSBtb2RpZmllZC4KCjIwMTktMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIG9uIGVycm9yLiBQcmV2aW91c2x5IGdlbmVyYXRlZCBmaWxlcyB3ZXJlIG5vdCByZW1vdmVkLAogICAgICAgICAgICBwb3RlbnRpYWxseSBicmVha2luZyBNYWtlZmlsZXMgdXNpbmcgZmlsZSBkZXBlbmRlbmNpZXMsIGVzcGVjaWFsbHkgd2hlbiAtV2Vycm9yCiAgICAgICAgICAgICh3YXJuaW5ncyBhcyBlcnJvcnMpIHdhcyB1c2VkLgoKMjAxOS0wNy0yMzogc21pdGh4CiAgICAgICAgICAgIFtDI10gIzE1MzAgIzE1MzIgRml4IG1hcnNoYWxsaW5nIG9mIHN0ZDo6d3N0cmluZyB0byBDIy4KCjIwMTktMDctMTg6IGdpY21vCiAgICAgICAgICAgIFtQeXRob25dICMxNTg3IFB5dGhvbiAzLjggc3VwcG9ydCAtIHJlbW92ZSB1c2Ugb2YgZGVwcmVjYXRlZCBQeU9iamVjdF9HQ19VblRyYWNrLgoKMjAxOS0wNy0xODogY2hlci1ub3YKICAgICAgICAgICAgW1B5dGhvbl0gIzE1NzMgR2VuZXJhdGVkIFB5dGhvbiBjb2RlIHVzZXMgY29uc2lzdGVudCBzdHJpbmcgcXVvdGluZyBzdHlsZSAtIGRvdWJsZQogICAgICAgICAgICBxdW90ZXMuCgoyMDE5LTA3LTE2OiBnZWVmcgogICAgICAgICAgICBbQyNdICM2MTYgIzE1NzYgRml4IEMjIGJvb2wgSU5QVVRbXSwgYm9vbCBPVVRQVVRbXSwgYm9vbCBJTk9VVFtdIHR5cGVtYXBzIHRvIG1hcnNoYWxsCiAgICAgICAgICAgIGFzIDEtYnl0ZS4KCjIwMTktMDctMTI6IHZhZHoKICAgICAgICAgICAgW0MjLCBKYXZhXSAjMTU2OCAjMTU4MyBGaXggc3RkOjpzZXQ8PiB0eXBlbWFwcyBmb3IgcHJpbWl0aXZlIHR5cGVzLgoKMjAxOS0wNy0xMjogdmFkegogICAgICAgICAgICAjMTU2NiAjMTU4NCBSZWdyZXNzaW9uIGluIDQuMC4wIC0gZml4IG1pc3NpbmcgdmFsdWUgZm9yIGZpcnN0IGl0ZW0gb2YgZW51bXMgd2l0aAogICAgICAgICAgICB0cmFpbGluZyBjb21tYS4KCjIwMTktMDctMTE6IG1jZmFybGptCiAgICAgICAgICAgICMxNTQ4ICMxNTc4IEZpeCBzZWdmYXVsdCBpbiBEb3h5Z2VuIHBhcnNlciBwYXJzaW5nIGVtcHR5IGxpbmVzIGluIHNvbWUgY29tbWFuZHMgbGlrZQogICAgICAgICAgICBcY29kZS4KCjIwMTktMDctMDk6IElzYWFjUGFzY3VhbAogICAgICAgICAgICBbQyMsIEphdmFdICMxNTcwIEZpeCBuYW1lIG9mIGdlbmVyYXRlZCBDIy9KYXZhIGNsYXNzZXMgZm9yICVpbnRlcmZhY2UgbWFjcm9zCiAgICAgICAgICAgIGluIHN3aWdpbnRlcmZhY2UuaSB3aGVuIHdyYXBwaW5nIG5lc3RlZCBDKysgY2xhc3Nlcy4KCjIwMTktMDctMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNTQ3IFdoaXRlc3BhY2UgZml4ZXMgaW4gRG94eWdlbiB0cmFuc2xhdGVkIGNvbW1lbnRzIGludG8gcHlkb2MgY29tbWVudHMKICAgICAgICAgICAgZm9yIFNwaGlueCBjb21wYXRpYmlsaXR5LgoKMjAxOS0wNi0yODogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lLCBPQ2FtbF0gIzE1NTkgJGFyZyBhbmQgJGlucHV0IHdlcmUgaW5jb3JyZWN0bHkgc3Vic3RpdHV0ZWQgaW4gdGhlCiAgICAgICAgICAgIGFyZ291dCB0eXBlbWFwIHdoZW4gdHdvIG9yIG1vcmUgYXJndW1lbnRzIHdlcmUgcHJlc2VudC4KCjIwMTktMDYtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnldICMxNTM4IFJlbW92ZSB0aGUgVW5rbm93bkV4Y2VwdGlvbkhhbmRsZXIgY2xhc3MgaW4gb3JkZXIgdG8gYmUKICAgICAgICAgICAgQysrMTcgY29tcGxpYW50IGFzIGl0IHVzZXMgc3RkOjp1bmV4cGVjdGVkX2hhbmRsZXIgd2hpY2ggd2FzIHJlbW92ZWQgaW4gQysrMTcuCiAgICAgICAgICAgIFRoaXMgY2xhc3Mgd2FzIGludGVuZGVkIGZvciBkaXJlY3RvciBleGNlcHRpb24gaGFuZGxpbmcgYnV0IHdhcyBuZXZlciB1c2VkIGJ5CiAgICAgICAgICAgIFNXSUcgYW5kIHdhcyBuZXZlciBkb2N1bWVudGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTA2LTA2OiBia290enoKICAgICAgICAgICAgW0phdmFdICMxNTUyIEltcHJvdmUgcGVyZm9ybWFuY2UgaW4gSmF2YSBzdGQ6OnZlY3RvciBjb25zdHJ1Y3RvciB3cmFwcGVyIHRoYXQgdGFrZXMKICAgICAgICAgICAgYSBuYXRpdmUgSmF2YSBhcnJheSBhcyBpbnB1dC4KCjIwMTktMDYtMDM6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcmVncmVzc2lvbiBpbiBpbXBsaWNpdF9jb252IGhhbmRsaW5nIG9mIHR1cGxlcywKCSAgICBpbnRyb2R1Y2VkIGluIFNXSUcgNC4wLjAuICBGaXhlcyAjMTU1MywgcmVwb3J0ZWQgYnkgQWxleGFuZHJlCgkgICAgRHVyZXQtTHV0ei4KCjIwMTktMDUtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBkZXRlY3Rpb24gb2YgT2N0YXZlIG9uIE1hY09TLgoKMjAxOS0wNS0yNDogb3BvcGxhd3NraQogICAgICAgICAgICBbT2N0YXZlXSAjMTUyMiBBZGFwdCBPQ1RBVkVfTERGTEFHUyBmb3IgT2N0YXZlIDUuMS4KCjIwMTktMDUtMjI6IGZlcmR5bmF0b3IKCSAgICBbUEhQXSAjMTUyOCBEb24ndCBhZGQgYSBjbG9zaW5nICc/PicgUEhQIHRhZyB0byBnZW5lcmF0ZWQgZmlsZXMuCgkgICAgUFNSLTIgc2F5cyBpdCBNVVNUIGJlIG9taXR0ZWQgZm9yIGZpbGVzIGNvbnRhaW5pbmcgb25seSBQSFAuCgpWZXJzaW9uIDQuMC4wICgyNyBBcHIgMjAxOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE5LTA0LTI0OiB2YWR6CiAgICAgICAgICAgICMxNTE3IEZpeCBjcmFzaCBpZiAiQHJldHVybiIgRG94eWdlbiB0YWcgd2FzIHVzZWQgb24gYSBub2RlIHdpdGhvdXQgYW55IHJldHVybiB0eXBlLgoKMjAxOS0wNC0yNDogdmFkegogICAgICAgICAgICAjMTUxNSBGaXggcGFyc2luZyBvZiBlbnVtcyB3aXRoIHRyYWlsaW5nIGNvbW1hIHdoZW4gdXNpbmcgLWRveHlnZW4uCgoyMDE5LTA0LTE5OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dICMxMDU1IFdoZW4gZ2VuZXJhdGluZyBHbyBjb2RlLCBtYWtlIC1jZ28gdGhlIGRlZmF1bHQuIEFkZCBuZXcgLW5vLWNnbyBvcHRpb24KICAgICAgICAgICAgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdC4KCjIwMTktMDQtMTk6IHBiZWNoZXJlcgogICAgICAgICAgICBbVGNsXSAjMTUwOCBGaXggVmlzdWFsIFN0dWRpbyAyMDE1IGFuZCBsYXRlciBjb21waWxhdGlvbiBlcnJvcnMgZHVlIHRvIHNucHJpbnRmIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24uCgoyMDE5LTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBGeENvcCB3YXJuaW5nIENBMjAwMiBpbiBTV0lHUGVuZGluZ0V4Y2VwdGlvbiAtIGEgbG9jayBvbiBhIHJlZmVyZW5jZSBvZgogICAgICAgICAgICB0eXBlICdUeXBlJy4KCjIwMTktMDMtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBEXSBBZGQgdGhlIHBhcmFtZXRlcnMgdHlwZW1hcCBhdHRyaWJ1dGUgdG8gdGhlIGphdmFkZXN0cnVjdCwKICAgICAgICAgICAgamF2YWRlc3RydWN0X2Rlcml2ZWQsIGRkaXNwb3NlLCBkZGlzcG9zZV9kZXJpdmVkIHR5cGVtYXBzIHRvIG1pcnJvciBlbmhhbmNlZAogICAgICAgICAgICBmbGV4aWJpbGl0eSBpbiB0aGUgY3NkaXNwb3NpbmcgYW5kIGNzZGlzcG9zaW5nX2Rlcml2ZWQgKEMjKSB0eXBlbWFwcy4gSWYgcHJvdmlkZWQKICAgICAgICAgICAgdGhlIGNvbnRlbnRzIGFyZSBnZW5lcmF0ZWQgYXMgdGhlIGRlbGV0ZS9kaXNwb3NlIG1ldGhvZCdzIHBhcmFtZXRlcnMgZGVjbGFyYXRpb24uCgoyMDE5LTAzLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdICM0MjEgRml4IEZ4Q29wIHdhcm5pbmcgQ0ExMDYzIGJ5IGltcGxlbWVudGluZyB0aGUgcmVjb21tZW5kZWQgRGlzcG9zZSBtZXRob2RzIGZvcgogICAgICAgICAgICB0aGUgSURpc3Bvc2FibGUgaW50ZXJmYWNlLiBQcmV2aW91c2x5IGp1c3QgdGhlIERpc3Bvc2UoKSBtZXRob2Qgd2FzIGdlbmVyYXRlZC4KICAgICAgICAgICAgTm93IHRoZSBEaXNwb3NlKCkgYW5kIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIG1ldGhvZHMgYXJlIGdlbmVyYXRlZC4KICAgICAgICAgICAgQ2hhbmdlcyBhcmUgcmVxdWlyZWQgaWYgY3VzdG9tICJjc2ZpbmFsaXplIiwgImNzZGVzdHJ1Y3QiIG9yICJjc2Rlc3RydWN0X2Rlcml2ZWQiCiAgICAgICAgICAgIHR5cGVtYXBzIGFyZSBiZWluZyB1c2VkLiBEZXRhaWxzIGluICM0MjEgb24gR2l0aHViLiBTV0lHIHdpbGwgZXJyb3Igb3V0IGlmIG9uZSBvZgogICAgICAgICAgICB0aGUgImNzZmluYWxpemUsICJjc2Rlc3RydWN0IiBvciAiY3NkZXN0cnVjdF9kZXJpdmVkIiB0eXBlbWFwcyBhcmUgZm91bmQuIEV4YW1wbGUKICAgICAgICAgICAgZXJyb3IgbWVzc2FnZToKCiAgICAgICAgICAgICAgZm9vLmg6NjA6IEVycm9yOiBBIGRlcHJlY2F0ZWQgY3NmaW5hbGl6ZSB0eXBlbWFwIHdhcyBmb3VuZCBmb3IgRm9vLCBwbGVhc2UgcmVtb3ZlCiAgICAgICAgICAgICAgaXQgYW5kIHJlcGxhY2UgYWxsIGNzZGVzdHJ1Y3QsIGNzZGVzdHJ1Y3RfZGVyaXZlZCBhbmQgY3NmaW5hbGl6ZSB0eXBlbWFwcyBieSB0aGUKICAgICAgICAgICAgICBjc2Rpc3Bvc2UsIGNzZGlzcG9zZV9kZXJpdmVkLCBjc2Rpc3Bvc2luZyBhbmQgY3NkaXNwb3NpbmdfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMy0yNTogTGlyeW5hCiAgICAgICAgICAgIFtDI10gIzExNDMgQWRkIHN0ZF9saXN0LmkgZm9yIHN0ZDo6bGlzdCBzdXBwb3J0LgogICAgICAgICAgICBUaGUgQyMgc3RkOjpsaXN0PFQ+IHdyYXBwZXJzIGFyZSBtYWRlIHRvIGxvb2sgYW5kIGZlZWwgbGlrZSBhIEMjCiAgICAgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3Q8PiBjb2xsZWN0aW9uLgogICAgICAgICAgICBUaGUgSUVudW1lcmFibGU8PiBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIHByb3h5IGNsYXNzLgogICAgICAgICAgICBUaGUgSUNvbGxlY3Rpb248PiBpbnRlcmZhY2UgY2FuIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcHJvdmlkZSBlbmhhbmNlZCBmdW5jdGlvbmFsaXR5CiAgICAgICAgICAgIHdoZW5ldmVyIGEgQysrIG9wZXJhdG9yPT0gaXMgYXZhaWxhYmxlLiBUaGlzIGlzIHRoZSBjYXNlIGZvciB3aGVuIFQgaXMgYQogICAgICAgICAgICBwcmltaXRpdmUgdHlwZSBvciBhIHBvaW50ZXIuIElmIFQgZG9lcyBkZWZpbmUgYW4gb3BlcmF0b3I9PSwgdGhlbiB1c2UgdGhlCiAgICAgICAgICAgIFNXSUdfU1REX0xJU1RfRU5IQU5DRUQgbWFjcm8gdG8gb2J0YWluIHRoaXMgZW5oYW5jZWQgZnVuY3Rpb25hbGl0eSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfU1REX0xJU1RfRU5IQU5DRUQoU29tZU5hbWVzcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgJXRlbXBsYXRlKExpc3RLbGFzcykgc3RkOjpsaXN0PFNvbWVOYW1lc3BhY2U6OktsYXNzPjsKCjIwMTktMDMtMTg6IHJpY2hhcmRiZWFyZQogICAgICAgICAgICBbUl0gIzEzMjggTm9uLXRyaXZpYWwgZW51bXMgYXJlIHdvcmtpbmcgbm93LiBUaGUgZW51bSB2YWx1ZXMgYXJlIG5vdyBvYnRhaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBDL0MrKyBsYXllci4gY29uc3QgcmVmZXJlbmNlIGVudW1zIGFuZCBDKysxMSBlbnVtIGNsYXNzZXMgYXJlIGFsc28gbm93IHdvcmtpbmcuCgoyMDE5LTAzLTE0OiBtb2NoaXprCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTUwMCBGaXggY29tcGlsYXRpb24gZXJyb3JzIGR1ZSB0byBkZXByZWNhdGluZyBWOCBBUEkgaW4gTm9kZS5qcy4KICAgICAgICAgICAgTmV3IFY4IEFQSSBpcyB1c2VkIGlmIG5vZGUuanMgPj0gdjEwLjEyLCBvciBpZiBWOCA+PSB2Ny4wLgoKMjAxOS0wMy0xMjogdmFkegogICAgICAgICAgICBbQyNdICMxNDk1IEFkZCBzdGRfc2V0LmkgZm9yIHN0ZDo6c2V0IHN1cHBvcnQuCgoyMDE5LTAzLTExOiBkaXJ0ZWF0LG9wb3BsYXdza2kKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBPY3RhdmUgNS4xLgoKICAgICAgICAgICAgICBlcnJvcjogZm9ybWF0IG5vdCBhIHN0cmluZyBsaXRlcmFsIGFuZCBubyBmb3JtYXQgYXJndW1lbnRzIFstV2Vycm9yPWZvcm1hdC1zZWN1cml0eV0KCjIwMTktMDItMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OnZlY3RvciBpbXByb3ZlbWVudHMgZm9yIHR5cGVzIHRoYXQgZG8gbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgVGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIHdvcmsgYnkgZGVmYXVsdCBmb3IgZWxlbWVudHMgdGhhdCBhcmUKICAgICAgICAgICAgbm90IGRlZmF1bHQgaW5zZXJ0YWJsZSwgaS5lLiBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuIFRoaXMgaGFzIGJlZW4gYWNoaWV2ZWQgYnkKICAgICAgICAgICAgbm90IHdyYXBwaW5nOgoKICAgICAgICAgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIG4pOwoKICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgYWJvdmUgaGFkIHRvIGJlIGlnbm9yZWQgdmlhICVpZ25vcmUuCgogICAgICAgICAgICBJZiB0aGUgYWJvdmUgY29uc3RydWN0b3IgaXMgc3RpbGwgcmVxdWlyZWQgaXQgY2FuIGJlIGFkZGVkIGJhY2sgaW4gYWdhaW4gdmlhICVleHRlbmQ6CgogICAgICAgICAgICAgICVleHRlbmQgc3RkOjp2ZWN0b3IgewogICAgICAgICAgICAgICAgdmVjdG9yKHNpemVfdHlwZSBjb3VudCkgeyByZXR1cm4gbmV3IHN0ZDo6dmVjdG9yPCBUID4oY291bnQpOyB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGZvbGxvd2luZyB3cmFwcGVkIGNvbnN0cnVjdG9yIGNvdWxkIGJlIHVzZWQgYXMgaXQgcHJvdmlkZXMgbmVhci1lbm91Z2gKICAgICAgICAgICAgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5OgoKICAgICAgICAgICAgICB2ZWN0b3IoamludCBjb3VudCwgY29uc3QgdmFsdWVfdHlwZSYgdmFsdWUpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAyLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsZSBlcnJvcnMgd3JhcHBpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMvY29uc3RydWN0b3JzIHdoZXJlIGEgdmFyYXJnCiAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFmdGVyIGEgbm9uLXZhcmFyZyBmdW5jdGlvbi4KCjIwMTktMDItMjM6IHpwaGVuc2xleTQyCiAgICAgICAgICAgIFVzZSBmdWxseSBxdWFsaWZpZWQgbmFtZSAnamF2YS5sYW5nLk9iamVjdCcgaW5zdGVhZCBvZiAnT2JqZWN0JyBpbiBnZW5lcmF0ZWQgY29kZSB0bwogICAgICAgICAgICBhdm9pZCBjbGFzaGVzIHdpdGggd3JhcHBlZCBDKysgY2xhc3NlcyBjYWxsZWQgJ09iamVjdCcuCgoyMDE5LTAyLTIzOiBndGJYCiAgICAgICAgICAgIFtKYXZhXSAjMTAzNSBBZGQgKGNvbnN0IGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMgaW4gYWRkaXRpb24gdG8gdGhlIG5vbi1jb25zdAogICAgICAgICAgICB0eXBlbWFwcyAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB3aGljaCBkb2VzIG5vdCBhdHRlbXB0IHRvIHdyaXRlIGJhY2sgdG8gdGhlIGNvbnN0CiAgICAgICAgICAgIHN0cmluZy4KCjIwMTktMDItMjI6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzk4NCBBZGQgc3VwcG9ydCBmb3IgUlR5cGVkRGF0YSBpbnRyb2R1Y2VkIGluIFJ1YnkgMS45LjMuCgoyMDE5LTAyLTIyOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE0ODMgRml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gYSBkaXJlY3RvciBjbGFzcyBoYXMgZmluYWwgbWV0aG9kcy4KCjIwMTktMDItMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTI0MCBTdXBwcmVzcyBKYXZhIDkgZGVwcmVjYXRpb24gd2FybmluZ3Mgb24gZmluYWxpemUgbWV0aG9kLgoKMjAxOS0wMi0yMTogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNDgwIEZpeCBzb21lIHJlamVjdGlvbnMgb2YgdmFsaWQgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMuCgoyMDE5LTAyLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTQ3NSBGaXggcmVncmVzc2lvbiBwYXJzaW5nIGdjYyBwcmVwcm9jZXNzb3IgbGluZW1hcmtlcnMgaW4gdGhlIGZvcm06CgogICAgICAgICAgICAjIGxpbmVudW0gZmlsZW5hbWUgZmxhZ3MKCjIwMTktMDItMTg6IGpha2Vjb2JiCiAgICAgICAgICAgIFtQeXRob25dICM5NDUgIzEyMzQgRWxlbWVudHMgaW4gc3RkOjp2ZWN0b3IgbWVtb3J5IGFjY2VzcyBmaXguCgogICAgICAgICAgICBBY2Nlc3NpbmcgYW4gZWxlbWVudCBpbiBhIHN0ZDo6dmVjdG9yIG9idGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdmlhIGFuCiAgICAgICAgICAgIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGluIHRoZSBjb250YWluZXIuIElmIHRoZSB2ZWN0b3IgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQsCiAgICAgICAgICAgIHRoZSBTV0lHIHdyYXBwZXIgY29udGFpbmluZyB0aGUgcG9pbnRlciB0byB0aGUgZWxlbWVudCBiZWNvbWVzIGludmFsaWQuIFRoZSBmaXggaXMKICAgICAgICAgICAgdG8gb2J0YWluIGEgYmFjay1yZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lciBieSB0aGUgd3JhcHBlciB0byB0aGUgZWxlbWVudCBpbiB0aGUgUHl0aG9uCiAgICAgICAgICAgIGxheWVyIHRvIHByZXZlbnQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGZyb20gZGVzdHJveWluZyB0aGUgdW5kZXJseWluZyBjb250YWluZXIuCgoyMDE5LTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZW1hcCBtYXRjaGluZyB0byBleHBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcmFtZXRlcnMuIEluIHRoZSAldHlwZW1hcCBiZWxvdyB0aGUgdHlwZSBpcyBUIGFuZCB0aGUgbmFtZSBpcyBYPFQ+OjptYWtlCiAgICAgICAgICAgIGFuZCB0aGUgbmFtZSBub3cgZXhwYW5kcyBjb3JyZWN0bHkgdG8gWDwgaW50ID46Om1ha2UKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggewogICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBUIFg8VD46Om1ha2UgIi4uLiIKICAgICAgICAgICAgICAgIFQgbWFrZSgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShYaW50KSBYPGludD47CgoyMDE5LTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2VyIGVycm9yIGNvbnRhaW5pbmcgbXVsdGlwbGUgI2RlZmluZSBzdGF0ZW1lbnRzIGluc2lkZSBhbiBlbnVtLgoKICAgICAgICAgICAgVGhlIHNlY29uZCAjZGVmaW5lIGZhaWxzIHRvIHBhcnNlOgoKICAgICAgICAgICAgICBlbnVtIEZvb0VudW0gewogICAgICAgICAgICAgICAgRU5VTTEgPSAwLAogICAgICAgICAgICAgICAgRU5VTTIgPSAxLAoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPX0RFRjEgIkhlbGxvIgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk9fREVGMiAiV29ybGQhIgoKICAgICAgICAgICAgICAgIEVOVU0zID0gMiwKICAgICAgICAgICAgICAgIEVOVU00ID0gMywKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQnVnIG1lbnRpb25lZCBhdCBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvcGF0Y2hlcy8zMzMvCgoyMDE5LTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc29tZSBtaXNzaW5nIGNvcHkgY29uc3RydWN0b3JzIGludG8gU1RMIGNvbnRhaW5lcnMuCgoyMDE5LTAyLTE0OiBia290enoKICAgICAgICAgICAgW0phdmFdICMxMzU2IEFkZCBTVEwgY29udGFpbmVyczoKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnNldAoKMjAxOS0wMi0xNDogYmtvdHp6CiAgICAgICAgICAgIFtKYXZhXSAjMTM1NiBzdGQ6Om1hcCB3cmFwcGVycyBoYXZlIGJlZW4gbW9kaWZpZWQuIE5vdyB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdE1hcC4gVGhlIHN0ZDo6bWFwIGNvbnRhaW5lciBsb29rcyBhbmQgZmVlbHMgbXVjaCBsaWtlCiAgICAgICAgICAgIGEgamF2YS51dGlsLkhhc2hNYXAgZnJvbSBKYXZhLgoKICAgICAgICAgICAgQSBmZXcgbWVtYmVycyBoYXZlIGNoYW5nZWQgdGhlaXIgbmFtZXMuIElmIHRoZSBvbGQgbWV0aG9kIHNpZ25hdHVyZXMgYXJlIG5lZWRlZCwKICAgICAgICAgICAgdGhlbiBjb3B5IHN0ZF9tYXAuaSBmcm9tIHN3aWctMy4wLjEyIGFuZCB1c2UgdGhhdCBpbnN0ZWFkLiBBbHRlcm5hdGl2ZWx5LAogICAgICAgICAgICBhZGQgdGhlIG9sZCBtaXNzaW5nIG1ldGhvZHMgdG8gdGhlIG5ldyBtZXRob2RzIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgJXByb3h5Y29kZToKCiAgICAgICAgICAgICAgJWV4dGVuZCBzdGQ6Om1hcCB7CiAgICAgICAgICAgICAgJXByb3h5Y29kZSAlewogICAgICAgICAgICAgICAgLy8gT2xkIEFQSQogICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBpc0VtcHR5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoJHR5cGVtYXAoamJveHR5cGUsIEspIGtleSwgJHR5cGVtYXAoamJveHR5cGUsIFQpIHgpIHsKICAgICAgICAgICAgICAgICAgcHV0KGtleSwgeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZWwoJHR5cGVtYXAoamJveHR5cGUsIEspIGtleSkgewogICAgICAgICAgICAgICAgICByZW1vdmUoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc19rZXkoJHR5cGVtYXAoamJveHR5cGUsIEspIGtleSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNLZXkoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMi0xMzogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNDY5IEFkZCBzdXBwb3J0IGZvciBDKysxNyBoZXhhZGVjaW1hbCBmbG9hdGluZyBsaXRlcmFscy4KCjIwMTktMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MzcgT0NhbWwgaGFzIGJlZW4gZ2l2ZSB0aGUgJ0V4cGVyaW1lbnRhbCcgbGFuZ3VhZ2Ugc3RhdHVzLiBUaGUgZXhhbXBsZXMgd29yawogICAgICAgICAgICBhbmQgbW9zdCBvZiB0aGUgdGVzdC1zdWl0ZSBpcyBhbHNvIHdvcmtpbmcsIHNvIGl0IGlzIHF1aXRlIGNsb3NlIHRvIGJlaW5nIGEgJ1N1cHBvcnRlZCcgbGFuZ3VhZ2UuCgoyMDE5LTAyLTEwOiBaYWNrZXJ5U3B5dHoKCSAgICAjMTQ2NCBBZGQgc3VwcG9ydCBmb3IgQysrMTQgYmluYXJ5IGludGVnZXIgbGl0ZXJhbHMuCgoyMDE5LTAyLTEwOiBaYWNrZXJ5U3B5dHoKCSAgICAjMTQ1MCBBZGQgc3VwcG9ydCBmb3IgQysrMTEgVUNTLTIgYW5kIFVDUy00IGNoYXJhY3RlciBsaXRlcmFscy4gQWxzbywgYWRkIHN1cHBvcnQgZm9yCiAgICAgICAgICAgIEMrKzE3IFVURi04IGNoYXJhY3RlciBsaXRlcmFscy4KCjIwMTktMDItMTA6IHdzZnVsdG9uCgkgICAgW016U2NoZW1lXSAjMTQzNyBNelNjaGVtZS9SYWNrZXQgaXMgbm93IGFuICdFeHBlcmltZW50YWwnIGxhbmd1YWdlLiBUaGUgZXhhbXBsZXMgd29yawogICAgICAgICAgICBhbmQgYSBsYXJnZSBwb3J0aW9uIG9mIHRoZSB0ZXN0LXN1aXRlIGlzIGFsc28gd29ya2luZy4KCjIwMTktMDItMTA6IHdzZnVsdG9uCgkgICAgW016U2NoZW1lXSBEZXN0cnVjdG9yIHdyYXBwZXJzIHdlcmUgbm90IGJlaW5nIGdlbmVyYXRlZC4KCjIwMTktMDItMTA6IHdzZnVsdG9uCgkgICAgW016U2NoZW1lXSBTdGF0aWMgdmFyaWFibGUgd3JhcHBlcnMgZml4ZWQgLSAkYXJnbnVtIHdhcyBub3QgZXhwYW5kZWQuCgoyMDE5LTAyLTEwOiBzZXRocmoKCSAgICAjMTQ1MiBGaXggJWFwcGx5IGZvciBhbm9ueW1vdXMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMKCjIwMTktMDItMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggYWNjZXNzIHRvIGFscmVhZHkgcmVsZWFzZWQgbWVtb3J5IGR1cmluZyBQSFAgbW9kdWxlCgkgICAgc2h1dGRvd24sIHdoaWNoIG9mdGVuIGRpZG4ndCBjYXVzZSB2aXNpYmxlIHByb2JsZW1zLCBidXQgY291bGQKCSAgICByZXN1bHQgaW4gc2VnbWVudGF0aW9uIGZhdWx0cywgYnVzIGVycm9ycywgZXRjLiAgRml4ZXMgIzExNzAsCgkgICAgcmVwb3J0ZWQgYnkgSml0a2EgUGxlc27ta2924S4KCjIwMTktMDItMDk6IG9sbHkKCSAgICBbUEhQXSBBIHJlbmFtZWQgY29uc3RydWN0b3IgaXMgbm93IHdyYXBwZWQgYXMgYSBzdGF0aWMgbWV0aG9kIGluCgkgICAgUEhQLgoKMjAxOS0wMi0wODogb2xseQoJICAgIFtQSFBdIERvbid0IGdlbmVyYXRlIGNvZGUgd2hpY2ggcmVmZXJlbmNlcyAkciB3aGVuICRyIGhhc24ndCBiZWVuCgkgICAgZGVmaW5lZC4gIFRoaXMgY291bGQgaGFwcGVuIGluIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGljaCByZXR1cm5lZAoJICAgIHZvaWQgYW5kIHRvb2sgYXQgbGVhc3Qgb25lIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIuCgoyMDE5LTAyLTA4OiBvbGx5CgkgICAgW1BIUF0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBjb21wYXRpYmxlIHdpdGggUEhQIDcuMywgYW5kIHRoZQoJICAgIHRlc3RzdWl0ZSBub3cgcnVucyBjbGVhbmx5IHdpdGggdGhpcyB2ZXJzaW9uIHRvby4KCjIwMTktMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDM3IFNXSUcgbm93IGNsYXNzaWZpZXMgdGhlIHN0YXR1cyBvZiB0YXJnZXQgbGFuZ3VhZ2VzIGludG8gZWl0aGVyICdFeHBlcmltZW50YWwnIG9yCiAgICAgICAgICAgICdTdXBwb3J0ZWQnLiBUaGlzIHN0YXR1cyBpcyBwcm92aWRlZCB0byBpbmRpY2F0ZSB0aGUgbGV2ZWwgb2YgbWF0dXJpdHkgdG8gZXhwZWN0IHdoZW4gdXNpbmcKICAgICAgICAgICAgYSBwYXJ0aWN1bGFyIHRhcmdldCBsYW5ndWFnZSBhcyBub3QgYWxsIHRhcmdldCBsYW5ndWFnZXMgYXJlIGZ1bGx5IGRldmVsb3BlZC4gRGV0YWlscyBhcmUKICAgICAgICAgICAgaW4gdGhlIEludHJvZHVjdGlvbi5odG1sIGNoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24uCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtDRkZJXSAjMTQ0NyBDb21tb24gTGlzcCBDRkZJIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0FsbGVncm9jbF0gIzE0NDcgQWxsZWdybyBDb21tb24gTGlzcCBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtDaGlja2VuXSAjMTQ0NyBDSElDS0VOIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0NMSVNQXSAjMTQ0NyBHTlUgQ29tbW9uIExpc3AgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbUy1FWFBdICMxNDQ3IENvbW1vbiBMaXNwIFMtRXhwIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW1VGRkldICMxNDQ3IENvbW1vbiBMaXNwIFVGRkkgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbUGlrZV0gIzE0NDcgUGlrZSBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtNb2R1bGEzXSAjMTQ0NyBNb2R1bGEzIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDI6IGFobm9sZHMKCSAgICBbUHl0aG9uXSBEb2N1bWVudGF0aW9uIGVuaGFuY2VtZW50cyBmb3IgUHl0aG9uOgoKICAgICAgICAgICAgIzcyOCBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgYXV0b2RvYyB3aGVuIHVzaW5nIC1mYXN0cHJveHkuCgogICAgICAgICAgICAjMTM2NyBBZGRlZCBkb2N1bWVudGF0aW9uIHRvIHdyYXBwZWQgbWVtYmVyIHZhcmlhYmxlcyB1c2luZyB0aGUKICAgICAgICAgICAgcHJvcGVydHkoLi4uIGRvYz0iLi4uIikgY29uc3RydWN0LgoKICAgICAgICAgICAgT25seSBzaG93IGEgc2luZ2xlIGRvY3VtZW50YXRpb24gZW50cnkgZm9yIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHdoZW4KICAgICAgICAgICAgdXNpbmcgYXV0b2RvYy4KCiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdoZXJlIGEgY2FjaGVkIGRveHlnZW4gZG9jc3RyaW5nIGNvdWxkIGJlIGRlbGV0ZWQgd2hpbGUgc3RpbGwgaW4gdXNlLAogICAgICAgICAgICBjYXVzaW5nIHN3aWcgdG8gc2VnZmF1bHQuCgoyMDE5LTAxLTMxOiBvbGx5CgkgICAgU1dJRyBub3cgcmVxdWlyZXMgYSB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgc3BlY2lmaWVkIGluc3RlYWQgb2YKCSAgICBkZWZhdWx0aW5nIHRvIHdyYXBwaW5nIGZvciBUY2wuICBTcGVjaWZ5aW5nIHN3aWcgLS1oZWxwIHdpdGhvdXQKCSAgICBhIHRhcmdldCBsYW5ndWFnZSBub3cganVzdCBzaG93cyB0aGUgZ2VuZXJpYyBoZWxwLiAgVGhlIC1ub2xhbmcKCSAgICBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4KCjIwMTktMDEtMjg6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxNDI5IFJlbW92ZSBzdXBwb3J0IGZvciBPQ2FtbCB2ZXJzaW9ucyA8IDMuMTIuMC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMS0yMjogdmFkegogICAgICAgICAgICBbUnVieSwgT2N0YXZlXSAjMTQyNCBJbXByb3ZlIGF1dG9kb2MgcGFyYW1ldGVyIG5hbWluZy4KCjIwMTktMDEtMjI6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gIzEyNzEgIzE0MjMgQWx3YXlzIGluY2x1ZGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGluIGF1dG9kb2Mgc3RyaW5ncy4KCjIwMTktMDEtMTk6IHZhZHoKICAgICAgICAgICAgIzEyNzIsICMxNDIxIFdoZW4gYSBmdW5jdGlvbidzIHBhcmFtZXRlciBpcyBhIGtleXdvcmQsIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWF0ZXIgaXMKICAgICAgICAgICAgbm8gbG9uZ2VyIHNpbXBseSBjaGFuZ2VkIHRvIGFyZ04sIHdoZXJlIE4gaXMgdGhlIGFyZ3VtZW50IG51bWJlci4gSW5zdGVhZCB0aGUKICAgICAgICAgICAgcGFyYW1ldGVyIG5hbWUgaXMgY2hhbmdlZCB0byB0aGUgcmVuYW1pbmcgcnVsZXMgZm9yIGtleXdvcmRzIHRoYXQgbm9ybWFsbHkgYXBwbHkgdG8KICAgICAgICAgICAgc3ltYm9scyBzdWNoIGFzIGNsYXNzZXMvZnVuY3Rpb25zIGV0Yy4gTm90ZSB0aGF0IHVubGlrZSBvdGhlciBzeW1ib2wgcmVuYW1pbmcsCiAgICAgICAgICAgIHBhcmFtZXRlciByZW5hbWluZyBkb2VzIG5vdCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiB0aGUgcGFyYW1ldGVyIGlzIHJlbmFtZWQuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIG9ubHkgYWZmZWN0cyBsYW5ndWFnZXMgd2hlcmUgdGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgYWN0dWFsbHkgdXNlZCwgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIEphdmEgZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3RzIGluIHRoZSBwcm94eSBjbGFzcyBvciBQeXRob24gZG9jdW1lbnRhdGlvbiBjb21tZW50cy4KCjIwMTktMDEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDIwIEZpeCBnZGIgZGVidWdnZXIgZnVuY3Rpb25zICdzd2lncHJpbnQnIGFuZCAnbG9jc3dpZ3ByaW50JyBmcm9tIHN3aWcuZ2RiIHRvCiAgICAgICAgICAgIHdvcmsgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBnZGItOC4gRml4ZXMgZXJyb3JzIHdoZW4gZGVidWdnaW5nIFNXSUcgc291cmNlIHdpdGggZ2RiOgoKICAgICAgICAgICAgICAoZ2RiKSBzd2lncHJpbnQgbgogICAgICAgICAgICAgIFVuZGVmaW5lZCBjb21tYW5kOiAiUHJpbnRmIi4gIFRyeSAiaGVscCIuCgoyMDE5LTAxLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBQeXRob24gc3RhdGljIG1ldGhvZCB3cmFwcGVyIGNoYW5nZXMKCiAgICAgICAgICAgIC0gU3RhdGljIG1ldGhvZCB3cmFwcGVycyB3ZXJlIHVzaW5nIHRoZSAnZmFzdHByb3h5JyBhcHByb2FjaCBieSBkZWZhdWx0LgogICAgICAgICAgICAgIFRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggaW5zdGFuY2UgbWV0aG9kIHdyYXBwZXJzLiBUaGUgZmFzdHByb3h5IGFwcHJvYWNoCiAgICAgICAgICAgICAgaXMgbm93IHR1cm5lZCBvZmYgYnkgZGVmYXVsdCB0byBiZSBjb25zaXN0ZW50IHdpdGggaW5zdGFuY2UgbWV0aG9kcy4KICAgICAgICAgICAgICBTdGF0aWMgbWV0aG9kIHdyYXBwZXJzIGNhbiBub3cgYWxzbyBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSAtZmFzdHByb3h5IGFuZAogICAgICAgICAgICAgIC1vbGRkZWZzIG9wdGlvbnMuCgogICAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBzdGF0bWV0aG9kKGludCBhID0gMik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBnZW5lcmF0ZXMgYnkgZGVmYXVsdDoKCiAgICAgICAgICAgICAgY2xhc3MgS2xhc3Mob2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKICAgICAgICAgICAgICAgICAgZGVmIHN0YXRtZXRob2QoYT0yKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXhhbXBsZS5LbGFzc19zdGF0bWV0aG9kKGEpCgogICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyAod2hpY2ggY2FuIGJlIHJlc3RvcmVkIGJ5IHVzaW5nIC1mYXN0cHJveHkpOgoKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzKG9iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBzdGF0bWV0aG9kID0gc3RhdGljbWV0aG9kKF9leGFtcGxlLktsYXNzX3N0YXRtZXRob2QpCgogICAgICAgICAgICAgIC0gTW9kZXJuaXNlIHdyYXBwZXJzIGZvciBzdGF0aWMgbWV0aG9kcyB0byB1c2UgZGVjb3JhdG9yIHN5bnRheCAtIEBzdGF0aWNtZXRob2QuCgogICAgICAgICAgICAgIC0gQWRkIG1pc3NpbmcgcnVudGltZSB0ZXN0IGZvciBzdGF0aWMgY2xhc3MgbWV0aG9kcyBhbmQgdXNpbmcgdGhlIGFjdHVhbCBjbGFzcyBtZXRob2QuCgoyMDE5LTAxLTEyOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTQwMyAjMTE5NCBGaXggY29tcGlsYXRpb24gcHJvYmxlbXMgZm9yIE9DYW1sID49IDQuMDMuMCBkdWUgdG8gT0NhbWwgdXNpbmcKICAgICAgICAgICAgaW50NjRfdCBpbnN0ZWFkIG9mIGludDY0LgoKMjAxOS0wMS0xMTogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MDAgRml4IHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIG9mIG5vbi1zdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KCjIwMTktMDEtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgICMzNTggQWRkIFZPSUQgdG8gd2luZG93cy5pCgoyMDE5LTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICAjOTQ4ICMxMDE5ICMxMjczIEZpeCBmb3IgQysrMTEgcmF3IHN0cmluZ3Mgd2hlcmUgdGhlIGRlbGltaXRlcnMgd2VyZSBtaXN0YWtlbmx5IGxlZnQKICAgICAgICAgICAgaW4gdGhlIHN0cmluZyBjb250ZW50cyBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBzdHJpbmcgd2FzIGNvcGllZCBpbnRvIGdlbmVyYXRlZCBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgJWNvbnN0YW50LCB0aGUgImRvY3N0cmluZyIgZmVhdHVyZSBhbmQgZm9yIEMjL0phdmEvRCBjb25zdGFudHMgdHVybmVkIG9uCiAgICAgICAgICAgIHdpdGggJWphdmFjb25zdC8lY3Njb25zdC8lZG1hbmlmZXN0Y29uc3QuCgoyMDE5LTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gIzUzOC4gRml4IFJ1Ynkgc3VwcG9ydCBmb3IgJWZlYXR1cmUoImRvY3N0cmluZyIpLgoKMjAxOS0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgIzEyMDIgRml4IG92ZXJsb2FkaW5nIG9mIG5vbi1wb2ludGVyIGNsYXNzIHR5cGVzIGluIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hlbiBvdmVybG9hZGVkCiAgICAgICAgICAgIHdpdGggYSBwb2ludGVyIGFuZCBhIE5VTEwgc2NyaXB0aW5nIGxhbmd1YWdlIGVxdWl2YWxlbnQgaXMgdXNlZCwgZWcgTm9uZSBpbiBQeXRob24uCgogICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2hhbmdlcyB0aGUgU1dJR1RZUEUsIFNXSUdUWVBFJiBhbmQgU1dJR1RZUEUmJiB0eXBlY2hlY2sgdHlwZW1hcHMgdG8KICAgICAgICAgICAgcHJldmVudCBhY2NlcHRpbmcgYSBjb252ZXJzaW9uIHRvIGEgTlVMTCBwb2ludGVyLgoKMjAxOS0wMS0wMzogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzEzODYgRml4IHRoZSBPQ2FtbCBleGFtcGxlcyBhbmQgdGVzdCBzdWl0ZSBmb3Igb3V0LW9mLXNvdXJjZSBidWlsZHMuCgoyMDE5LTAxLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNjM5IHJlbW92ZSBkdXBsaWNhdGUgcHJveHkgbWV0aG9kIGRlZmluaXRpb25zIGZvciBnbG9iYWwgZnVuY3Rpb24gd3JhcHBlcnMuCgogICAgICAgICAgICBHbG9iYWwgZnVuY3Rpb25zIHByZXZpb3VzbHkgZ2VuZXJhdGVkIHR3byBkZWZpbml0aW9ucywgZWc6CgogICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leGFtcGxlLmZvbygpCiAgICAgICAgICAgICAgZm9vID0gX2V4YW1wbGUuZm9vCgogICAgICAgICAgICBUaGUgZmlyc3QgZGVmaW5pdGlvbiBpcyByZXBsYWNlZCBieSB0aGUgc2Vjb25kIGRlZmluaXRpb24gYW5kIHNvIHRoZSBzZWNvbmQgZGVmaW5pdGlvbgogICAgICAgICAgICBpcyB0aGUgb25lIHVzZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IGNhbGxlZC4gTm93IGp1c3QgdGhlIGZpcnN0IGRlZmluaXRpb24gaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYW5kIGlmIHRoZSAtZmFzdHByb3h5IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZCwganVzdCB0aGUgc2Vjb25kCiAgICAgICAgICAgIGRlZmluaXRpb24gaXMgZ2VuZXJhdGVkLiBUaGUgc2Vjb25kIGRlZmluaXRpb24gaXMgZmFzdGVyIGFzIGl0IGF2b2lkcyB0aGUgcHJveHkgUHl0aG9uCiAgICAgICAgICAgIG1ldGhvZCBhcyBpdCBjYWxscyB0aGUgbG93LWxldmVsIEMgd3JhcHBlciBkaXJlY3RseS4gVXNpbmcgYm90aCAtZmFzdHByb3h5IGFuZCAtb2xkZGVmcwogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9ucyB3aWxsIHJlc3RvcmUgdGhlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGNvZGUgYXMgaXQgd2lsbCBnZW5lcmF0ZSBib3RoCiAgICAgICAgICAgIG1ldGhvZCBkZWZpbml0aW9ucy4KCiAgICAgICAgICAgIFdpdGggdGhpcyBjaGFuZ2UsIHRoZSB3cmFwcGVycyBmb3IgZ2xvYmFsIEMvQysrIGZ1bmN0aW9ucyBhbmQgQysrIGNsYXNzIG1ldGhvZHMgbm93IHdvcmsKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHdydCB0byBnZW5lcmF0aW5nIGp1c3QgYSBwcm94eSBtZXRob2QgYnkgZGVmYXVsdCBhbmQgY29udHJvbCB2aWEKICAgICAgICAgICAgLWZhc3Rwcm94eS8tb2xkZGVmcyBvcHRpb25zLgoKMjAxOC0xMi0yMDogaGFzaW5vZmYsd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMzM0IFNldCBKYXZhIHRocmVhZCBuYW1lIHRvIG5hdGl2ZSB0aHJlYWQgbmFtZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCiAgICAgICAgICAgIERlZmF1bHQgaXMgdG8gdXNlIG5hbWUgIlRocmVhZC1YWFgiIGFuZCBpcyBzdGlsbCB3b3JrcyBsaWtlIHRoaXMgYnkgZGVmYXVsdC4gSG93ZXZlciwKICAgICAgICAgICAgYWRkaW5nIHRoZSBmb2xsb3dpbmcgd2lsbCB0dXJuIG9uIHRoZSB0aHJlYWQgbmFtZSBzZXR0aW5nICh3b3JrcyBmb3IgbW9yZSByZWNlbnQKICAgICAgICAgICAgdmVyc2lvbnMgb2YgTGludXggYW5kIE1hY09TKToKCiAgICAgICAgICAgICViZWdpbiAlewogICAgICAgICAgICAjZGVmaW5lIFNXSUdfSkFWQV9VU0VfVEhSRUFEX05BTUUKICAgICAgICAgICAgJX0KCjIwMTgtMTItMjA6IGNobGFuZHNpCiAgICAgICAgICAgIFtQeXRob25dICMxMzU3LiBGaXggb3ZlcnJpZGluZyBfX25ld19fIGluIFB5dGhvbiAzLjYuCgogICAgICAgICAgICBGaXhlcyBTeXN0ZW1FcnJvcjogT2JqZWN0cy90dXBsZW9iamVjdC5jOjgxOiBiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iCgoyMDE4LTEyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjODQ4ICMxMzQzIFRoZSBtb2R1bGUgaW1wb3J0IGxvZ2ljIGhhcyBjaGFuZ2VkIHRvIHN0b3Agb2JmdXNjYXRpbmcgcmVhbCBJbXBvcnRFcnJvcgogICAgICAgICAgICBwcm9ibGVtcy4gT25seSBvbmUgaW1wb3J0IG9mIHRoZSBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIGZyb20gdGhlIHB1cmUgUHl0aG9uIG1vZHVsZSBpcwogICAgICAgICAgICBhdHRlbXB0ZWQgbm93LiBQcmV2aW91c2x5IGEgc2Vjb25kIGltcG9ydCBvZiB0aGUgbG93LWxldmVsIEMvQysrIG1vZHVsZSB3YXMgYXR0ZW1wdGVkCiAgICAgICAgICAgIGFmdGVyIGFuIEltcG9ydEVycm9yIG9jY3VycmVkIGFuZCB3YXMgZG9uZSB0byBzdXBwb3J0ICdzcGxpdCBtb2R1bGVzJy4gQSAnc3BsaXQgbW9kdWxlJyBpcwogICAgICAgICAgICBhIGNvbmZpZ3VyYXRpb24gd2hlcmUgdGhlIHB1cmUgUHl0aG9uIG1vZHVsZSBpcyBhIG1vZHVsZSB3aXRoaW4gYSBQeXRob24gcGFja2FnZSBhbmQgdGhlCiAgICAgICAgICAgIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgaXMgYSBnbG9iYWwgUHl0aG9uIG1vZHVsZS4gTm93IGEgJ3NwbGl0IG1vZHVsZScgY29uZmlndXJhdGlvbiBpcwogICAgICAgICAgICBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgc3VwcG9ydGVkIHdpdGggYSBzaW1wbGUKICAgICAgICAgICAgY3VzdG9taXphdGlvbiwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJW1vZHVsZShwYWNrYWdlPSJteXBhY2thZ2UiLCBtb2R1bGVpbXBvcnQ9ImltcG9ydCAkbW9kdWxlIikgZm9vCgogICAgICAgICAgICBvciBpZiB1c2luZyAtYnVpbHRpbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShwYWNrYWdlPSJteXBhY2thZ2UiLCBtb2R1bGVpbXBvcnQ9ImZyb20gJG1vZHVsZSBpbXBvcnQgKiIpIGZvbwoKICAgICAgICAgICAgaW5zdGVhZCBvZgoKICAgICAgICAgICAgICAlbW9kdWxlKHBhY2thZ2U9Im15cGFja2FnZSIpIGZvbwoKICAgICAgICAgICAgU2VlIHRoZSB1cGRhdGVkIFB5dGhvbiBjaGFwdGVyIHRpdGxlZCAiTG9jYXRpb24gb2YgbW9kdWxlcyIgaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDE4LTEyLTExOiB0bGJ5CiAgICAgICAgICAgIFtQZXJsXSAjMTM3NCByZXBhaXIgRVhURU5EKCkgaGFuZGxpbmcgaW4gdHlwZW1hcHMKCjIwMTgtMTItMDY6IHZhZHoKICAgICAgICAgICAgIzEzNTkgIzEzNjQgQWRkIG1pc3NpbmcgbmVzdGVkIGNsYXNzIGRlc3RydWN0b3Igd3JhcHBlciB3aGVuIHRoZSBuZXN0ZWQgY2xhc3MgaXMKICAgICAgICAgICAgaW5zaWRlIGEgdGVtcGxhdGUuIFJlbW92ZXMgYXNzb2NpYXRlZCBib2d1cyAnSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUnIHdhcm5pbmcuIE9ubHkKICAgICAgICAgICAgb2NjdXJyZWQgd2hlbiB0aGUgbmVzdGVkIGNsYXNzJyBkZXN0cnVjdG9yIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgoKMjAxOC0xMi0wNDogYWRyMjYKICAgICAgICAgICAgW1B5dGhvbl0gIzEzNjggIzEzNjkgQWNjZXNzIFZpb2xhdGlvbiBpbiB0cF9wcmludCBjYXVzZWQgYnkgbWlzbWF0Y2hlZCBQeXRob24vZXh0ZW5zaW9uCiAgICAgICAgICAgIENSVCB1c2FnZQoKICAgICAgICAgICAgUmVtb3ZlIGFsbCB1c2Ugb2YgdHBfcHJpbnQsIGFzIHRoaXMgQVBJIHVzZXMgYSBGSUxFKiwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIG1pc21hdGNoZWQgd2hlbiBtb2R1bGVzIGFyZSBidWlsdCB3aXRoIGRpZmZlcmVudCBDIGxpYnJhcmllcyBmcm9tCiAgICAgICAgICAgIHRoZSBtYWluIHB5dGhvbiBleGVjdXRhYmxlLgoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBicmluZ3MgY29uc2lzdGVudCBvdXRwdXQgYmV0d2VlbiBQeXRob24gMiBhbmQgMyBmb3IgdGhlICdjdmFyJyBTV0lHCiAgICAgICAgICAgIG9iamVjdCAodGhhdCBjb250YWlucyB0aGUgZ2xvYmFsIHZhcmlhYmxlcykgYW5kIFNXSUcgcGFja2VkIG9iamVjdHMgKHN1Y2ggYXMgY2FsbGJhY2sKICAgICAgICAgICAgY29uc3RhbnRzKS4KCjIwMTgtMTItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjgyIEZpeCBydW5uaW5nICdweXRob24gLW0nICB3aGVuIHVzaW5nICdzd2lnIC1idWlsdGluJwoKICAgICAgICAgICAgU2ltaWxhciB0byB0aGUgZWFybGllciBQRVAgMzY2IGNvbmZvcm1pbmcgZml4IGZvciBub24tYnVpbHRpbi4KCjIwMTgtMTEtMjk6IGFkcjI2CiAgICAgICAgICAgIFtQeXRob25dICMxMzYwIExlYWsgb2YgU1dJRyB2YXIgbGluayBvYmplY3QKCiAgICAgICAgICAgIEZpeCByZWZlcmVuY2UgY291bnRpbmcgb24gX1NXSUdfZ2xvYmFscyB0byBhbGxvdyB2YXIgbGluayB0byBiZSBmcmVlZCBvbiBtb2R1bGUgdW5sb2FkLgoKMjAxOC0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiB1c2luZyAtYnVpbHRpbiwgdGhlIHR3byBzdGVwIEMtZXh0ZW5zaW9uIG1vZHVsZSBpbXBvcnQgaXMgbm93CiAgICAgICAgICAgIG9uZSBzdGVwIGFuZCB0aGUgd3JhcHBlZCBBUEkgaXMgb25seSBhdmFpbGFibGUgb25jZSBhbmQgbm90IGluIGFuIHVuZGVybHlpbmcKICAgICAgICAgICAgbW9kdWxlIGF0dHJpYnV0ZSBsaWtlIGl0IGlzIHdpdGhvdXQgLWJ1aWx0aW4uIFRvIHVuZGVyc3RhbmQgdGhpcywgY29uc2lkZXIgYQogICAgICAgICAgICBtb2R1bGUgbmFtZWQgJ2V4YW1wbGUnICh1c2luZzogJW1vZHVsZSBleGFtcGxlKS4gVGhlIEMtZXh0ZW5zaW9uIGlzIGNvbXBpbGVkIGludG8KICAgICAgICAgICAgYSBQeXRob24gbW9kdWxlIGNhbGxlZCAnX2V4YW1wbGUnIGFuZCBhIHB1cmUgUHl0aG9uIG1vZHVsZSBwcm92aWRlcyB0aGUgYWN0dWFsCiAgICAgICAgICAgIEFQSSBmcm9tIHRoZSBtb2R1bGUgY2FsbGVkICdleGFtcGxlJy4gSXQgd2FzIHByZXZpb3VzbHkgcG9zc2libGUgdG8gYWRkaXRpb25hbGx5CiAgICAgICAgICAgIGFjY2VzcyB0aGUgQVBJIGZyb20gdGhlIG1vZHVsZSBhdHRyaWJ1dGUgJ2V4YW1wbGUuX2V4YW1wbGUnLiBUaGUgbGF0dGVyIHdhcyBhbgogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIEl0IHNob3VsZG4ndCBoYXZlIGJlZW4gdXNlZCwgYnV0CiAgICAgICAgICAgIGlmIG5lY2Vzc2FyeSBpdCBjYW4gYmUgcmVzdXJyZWN0ZWQgdXNpbmcgdGhlIG1vZHVsZWltcG9ydCBhdHRyaWJ1dGUgZGVzY3JpYmVkIGluIHRoZQogICAgICAgICAgICBQeXRob24gY2hhcHRlciBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgYm90aCBtb2R1bGVzIGFyZSBwcm92aWRlZCBpbiBhIFB5dGhvbgogICAgICAgICAgICBwYWNrYWdlLCB0cnk6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJmcm9tIC4gaW1wb3J0IF9leGFtcGxlXG5mcm9tIC5fZXhhbXBsZSBpbXBvcnQgKiIpIGV4YW1wbGUKICAgICAgICAgICAgb3IgbW9yZSBnZW5lcmljYWxseToKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iZnJvbSAuIGltcG9ydCAkbW9kdWxlXG5mcm9tIC4kbW9kdWxlIGltcG9ydCAqIikgZXhhbXBsZQoKICAgICAgICAgICAgYW5kIGlmIGJvdGggYXJlIHByb3ZpZGVkIGFzIGdsb2JhbCBtb2R1bGVzLCB0cnk6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgX2V4YW1wbGVcbmZyb20gX2V4YW1wbGUgaW1wb3J0ICoiKSBleGFtcGxlCiAgICAgICAgICAgIG9yIG1vcmUgZ2VuZXJpY2FsbHk6CiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCAkbW9kdWxlXG5mcm9tICRtb2R1bGUgaW1wb3J0ICoiKSBleGFtcGxlCgogICAgICAgICAgICBUaGUgbW9kdWxlIGltcG9ydCBjb2RlIHNob3duIHdpbGwgYXBwZWFyIGluIHRoZSBleGFtcGxlLnB5IGZpbGUuCgoyMDE4LTExLTI0OiB2YWR6CiAgICAgICAgICAgICMxMzU4IEZpeCBoYW5kbGluZyBvZiBhYnN0cmFjdCBiYXNlIGNsYXNzZXMgbmVzdGVkIGluc2lkZSB0ZW1wbGF0ZXMKCiAgICAgICAgICAgIENvcnJlY3QgZGV0ZWN0aW5nIG9mIHdoZXRoZXIgYSBkZXJpdmVkIGNsYXNzIG1ldGhvZCBvdmVycmlkZXMgYSBwdXJlIHZpcnR1YWwKICAgICAgICAgICAgYmFzZSBjbGFzcyBtZXRob2Qgd2hlbiBib3RoIGNsYXNzZXMgYXJlIG5lc3RlZCBpbnNpZGUgYSB0ZW1wbGF0ZSBjbGFzczogdGhpcwogICAgICAgICAgICBub3RhYmx5IGRpZG4ndCB3b3JrIGNvcnJlY3RseSBmb3IgbWV0aG9kcyB0YWtpbmcgcGFyYW1ldGVycyBvZiB0aGUgYmFzZSBjbGFzcwogICAgICAgICAgICB0eXBlLgoKMjAxOC0xMS0yMjogcnVwZXJ0bmFzaAogICAgICAgICAgICBbUHl0aG9uXSAjMTI4MiBNYWtlIGdlbmVyYXRlZCBtb2R1bGUgcnVubmFibGUgdmlhIHB5dGhvbiAtbSAoUEVQIDM2NiBjb25mb3JtaW5nKQoKICAgICAgICAgICAgUHJldmlvdXNseSBhbnkgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyBpbiBhIHBhY2thZ2Ugd291bGQgZmFpbCB3aXRoIGFuIEltcG9ydEVycm9yCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJ3B5dGhvbiAtbScgZm9yIGV4YW1wbGUgJ3B5dGhvbiAtbSBteXBrZy5teW1vZHVsZScuCgogICAgICAgICAgICBUaGlzIGZpeCBhbHNvIGFsbG93cyB0aGUgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlIHRvIGJlIHBsYWNlZCBpbnRvIGEgZGlyZWN0b3J5IGFuZAogICAgICAgICAgICB0aGVuIHJlbmFtZWQgX19pbml0X18ucHkgdG8gY29udmVydCB0aGUgbW9kdWxlIGludG8gYSBwYWNrYWdlIGFnYWluLiBUaGlzIGFiaWxpdHkKICAgICAgICAgICAgc3RvcHBlZCB3b3JraW5nIGluIHN3aWctMy4wLjkuIEhvd2V2ZXIsIG9ubHkgUHl0aG9uIDIuNyBvciAzLjMgYW5kIGxhdGVyIHdvcmsuIElmCiAgICAgICAgICAgIFB5dGhvbiAzLjIgc3VwcG9ydCBpcyBuZWVkZWQsIHVzZSBtb2R1bGVpbXBvcnQgaW4gJW1vZHVsZSB0byBjdXN0b21pc2UgdGhlIGltcG9ydAogICAgICAgICAgICBjb2RlLgoKMjAxOC0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgIzEzNDAgUmVtb3ZlIC1jcHBjYXN0IGFuZCAtbm9jcHBjYXN0IGNvbW1hbmQgbGluZSBvcHRpb25zICh0aGlzIHdhcyBhbiBvcHRpb24KICAgICAgICAgICAgYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdGFyZ2V0cykuCgogICAgICAgICAgICBUaGUgLWNwcGNhc3Qgb3B0aW9uIGlzIHN0aWxsIHR1cm5lZCBvbiBieSBkZWZhdWx0LiBUaGUgLW5vY3BwY2FzdCBvcHRpb24KICAgICAgICAgICAgdG8gdHVybiBvZmYgdGhlIHVzZSBvZiBjKysgY2FzdHMgKGNvbnN0X2Nhc3QsIHN0YXRpY19jYXN0IGV0YykgaGFzIGJlZW4KICAgICAgICAgICAgcmVtb3ZlZC4gSG93ZXZlciwgZGVmaW5pbmcgU1dJR19OT19DUExVU1BMVVNfQ0FTVCB3aWxsIHN0aWxsIGdlbmVyYXRlIEMgY2FzdHMKICAgICAgICAgICAgaW5zdGVhZCBvZiBDKysgY2FzdHMgZm9yIEMrKyB3cmFwcGVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzNDAgUmVtb3ZlIC1vdXRwdXR0dXBsZSBhbmQgLW5vb3V0cHV0dHVwbGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCgogICAgICAgICAgICBCb3RoIHRoZSBjb21tYW5kIGxpbmUgYW5kICVtb2R1bGUgb3B0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGhhdmUgYmVlbgogICAgICAgICAgICByZW1vdmVkLiBUaGVzZSB3ZXJlIHVuZG9jdW1lbnRlZC4gVGhlIC1vdXRwdXR0dXBsZSBvcHRpb24gcmV0dXJuZWQgYQogICAgICAgICAgICBQeXRob24gdHVwbGUgaW5zdGVhZCBvZiBhIGxpc3QsIG1vc3RseSB0eXBpY2FsbHkgaW4gdGhlIE9VVFBVVAogICAgICAgICAgICB0eXBlbWFwIGltcGxlbWVudGF0aW9ucy4KCiAgICAgICAgICAgIEl0IHVuY2xlYXIgd2h5IGEgdHVwbGUgaW5zdGVhZCBvZiBhIGxpc3QgcmV0dXJuIHR5cGUgaXMgbmVlZGVkIGFuZAogICAgICAgICAgICBoZW5jZSB0aGlzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFzIHBhcnQgb2YgdGhlIHNpbXBsaWZpY2F0aW9uIG9mCiAgICAgICAgICAgIHRoZSBTV0lHIFB5dGhvbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgU1dJRyA0LgoKMjAxOC0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzNDAgUmVtb3ZlIC1ub3Byb3h5aW1wb3J0IGNvbW1hbmQgbGluZSBvcHRpb24uCgogICAgICAgICAgICBUaGlzIG9wdGlvbiB0dXJuZWQgb2ZmIHRoZSBpbnNlcnRpb24gb2YgUHl0aG9uIGltcG9ydCBzdGF0ZW1lbnRzCiAgICAgICAgICAgIGRlcml2ZWQgZnJvbSBhICVpbXBvcnQgZGlyZWN0aXZlLiBGb3IgZXhhbXBsZSBnaXZlbjoKCiAgICAgICAgICAgICAgJW1vZHVsZSBtb2R1bGVfYgogICAgICAgICAgICAgICVpbXBvcnQgIm1vZHVsZV9hLmkiCgogICAgICAgICAgICB0aGVuIG1vZHVsZV9iLnB5IHdpbGwgY29udGFpbjoKCiAgICAgICAgICAgICAgaW1wb3J0IG1vZHVsZV9hCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMTAtMjk6IEFsZXhhbmRlckdhYnJpZWwKCSAgICBbUEhQXSBUaGUgZm9sbG93aW5nIFBIUDcgcmVzZXJ2ZWQga2V5d29yZHMgYXJlIG5vdyBvbmx5IHJlbmFtZWQgYnkKCSAgICBTV0lHIHdoZW4gdXNlZCBhcyBmdW5jdGlvbiBuYW1lcyBpbiB0aGUgQVBJIGJlaW5nIHdyYXBwZXI6CgkgICAgX19oYWx0X2NvbXBpbGVyIGFycmF5IGRpZSBlY2hvIGVtcHR5IGV2YWwgZXhpdCBpbmNsdWRlIGluY2x1ZGVfb25jZQoJICAgIGlzc2V0IGxpc3QgcHJpbnQgcmVxdWlyZSByZXF1aXJlX29uY2UgcmV0dXJuIHVuc2V0CgoyMDE4LTEwLTIyOiBvbGx5LHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjYxICMxMzQwIFR1cm4gb24gbWFueSBvcHRpbWlzYXRpb24gb3B0aW9ucyBieSBkZWZhdWx0IGFuZCByYXRpb25hbGlzZSB0aGUKICAgICAgICAgICAgbnVtYmVyIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zLgoKICAgICAgICAgICAgVGhlcmUgd2VyZSBhbiB1bm5lY2Vzc2FyeSBudW1iZXIgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIG1hbnkgb2YgdGhlc2UgaGF2ZSBub3cKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGluIGEgZHJpdmUgZm9yIHNpbXBsaWZpY2F0aW9uLiBTb21lIHdlcmUgbmVlZGVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uICgyLjYgYW5kIGVhcmxpZXIpLgoKICAgICAgICAgICAgTWFueSBvZiB0aGUgb3B0aW9ucyBjb3VsZCBiZSB0dXJuZWQgb24gaW5kaXZpZHVhbGx5IGFuZCB3aGVuIHVzaW5nIC1PLiBQcmV2aW91c2x5IC1PCiAgICAgICAgICAgIHJlc3VsdGVkIGluIHR1cm5pbmcgb24gYSBzZXQgb2Ygb3B0aW9uczoKCiAgICAgICAgICAgICAgLW1vZGVybiAtZmFzdGRpc3BhdGNoIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwgLW5vcHJveHlkZWwKICAgICAgICAgICAgICAtZmFzdHByb3h5IC1mYXN0aW5pdCAtZmFzdHVucGFjayAtZmFzdHF1ZXJ5IC1tb2Rlcm5hcmdzIC1ub2J1aWxkbm9uZQoKICAgICAgICAgICAgTm93IC1PIHJlc3VsdHMgaW4gdHVybmluZyBvbiB0aGlzIHJlZHVjZWQgc2V0OgoKICAgICAgICAgICAgICAtZmFzdGRpc3BhdGNoIC1mYXN0cHJveHkgLWZ2aXJ0dWFsCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIG5vdyBvbiBieSBkZWZhdWx0LCBhIGRlcHJlY2F0ZWQgd2FybmluZyBpcyBkaXNwbGF5ZWQgaWYgdGhleQogICAgICAgICAgICBhcmUgdXNlZDoKICAgICAgICAgICAgICAtZmFzdGluaXQgICAgIENsYXNzIGluaXRpYWxpc2F0aW9uIGNvZGUgZG9uZSBpbiBDL0MrKyByYXRoZXIgdGhhbiBpbiBQeXRob24gY29kZS4KICAgICAgICAgICAgICAtZmFzdHF1ZXJ5ICAgIFB5dGhvbiBkaWN0aW9uYXJ5IHVzZWQgZm9yIGxvb2t1cCBvZiB0eXBlcy4KICAgICAgICAgICAgICAtZmFzdHVucGFjayAgIEZhc3RlciB1bnBhY2tpbmcgb2YgZnVuY3Rpb24gYXJndW1lbnRzIGluIEMvQysrIHdyYXBwZXJzLgogICAgICAgICAgICAgIC1tb2Rlcm4gICAgICAgVXNlIFB5dGhvbiAyLjMgZmVhdHVyZXMgc3VjaCBhcyBvYmplY3QgYW5kIHByb3BlcnR5LgogICAgICAgICAgICAgIC1tb2Rlcm5hcmdzICAgVXNlIFB5dGhvbiAyLjMgQyBBUElzIGZvciB1bnBhY2tpbmcgYXJndW1lbnRzIGluIHR1cGxlcy4KICAgICAgICAgICAgICAtbm9wcm94eWRlbCAgIFN0b3AgZ2VuZXJhdGluZyBhIHByb3h5IF9fZGVsX18gbWV0aG9kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAgICAtc2FmZWNzdHJpbmdzIE5vIGRpc2Nlcm5hYmxlIGRpZmZlcmVuY2UKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCBhbHRvZ2V0aGVyOgogICAgICAgICAgICAgIC1hbGlhc29iajAKICAgICAgICAgICAgICAtYnVpbGRub25lCiAgICAgICAgICAgICAgLWNsYXNzcHRyCiAgICAgICAgICAgICAgLW5ld19yZXByCiAgICAgICAgICAgICAgLW5ld3JlcHIKICAgICAgICAgICAgICAtbm9hbGlhc29iajAKICAgICAgICAgICAgICAtbm9idWlsZG5vbmUKICAgICAgICAgICAgICAtbm9jYXN0bW9kZQogICAgICAgICAgICAgIC1ub2RpcnZ0YWJsZQogICAgICAgICAgICAgIC1ub2V4dHJhbmF0aXZlCiAgICAgICAgICAgICAgLW5vZmFzdGluaXQKICAgICAgICAgICAgICAtbm9mYXN0cHJveHkKICAgICAgICAgICAgICAtbm9mYXN0cXVlcnkKICAgICAgICAgICAgICAtbm9tb2Rlcm4KICAgICAgICAgICAgICAtbm9tb2Rlcm5hcmdzCiAgICAgICAgICAgICAgLW5vb3V0cHV0dHVwbGUKICAgICAgICAgICAgICAtbm9zYWZlY3N0cmluZ3MKICAgICAgICAgICAgICAtb2xkX3JlcHIKICAgICAgICAgICAgICAtb2xkcmVwcgogICAgICAgICAgICAgIC1wcm94eWRlbAoKICAgICAgICAgICAgLW5ld192d20gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIHRoZSAtbmV3dndtIGFsaWFzIGluc3RlYWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMTAtMjI6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gIzEyNjEgUmVtb3ZlIGNvbW1hbmQgbGluZSBvcHRpb24gbm8gbG9uZ2VyIG5lZWRlZCBhcyBQeXRob24gMi4zIGFuZCBlYXJsaWVyCiAgICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkOgoKICAgICAgICAgICAgICAtY2xhc3NpYwoKMjAxOC0xMC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0QsIEdvLCBHdWlsZSwgTHVhLCBNenNjaGVtZSwgT2NhbWwsIFBlcmw1LCBQaHAsIFNjaWxhYiwgVGNsXQogICAgICAgICAgICBBbGxvdyB3cmFwcGluZyBvZiBzdGQ6Om1hcCB1c2luZyBub24tZGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uLgoKMjAxOC0xMC0wOTogdmFkegogICAgICAgICAgICBbSmF2YV0gIzEyNzQgQWxsb3cgd3JhcHBpbmcgb2Ygc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTgtMTAtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMTI2IEZpeCBDIGRlZmF1bHQgYXJndW1lbnRzIHdpdGggLWJ1aWx0aW4gYW5kIC1mYXN0dW5wYWNrIGFuZCAtbW9kZXJuYXJncy4KICAgICAgICAgICAgUHJvYmxlbSBvY2N1cnJlZCB3aGVuIHRoZXJlIGlzIGp1c3Qgb25lIChkZWZhdWx0ZWQpIHBhcmFtZXRlciBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCgoyMDE4LTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTMxOSBDKysxMSBoYXNoIHRhYmxlcyBpbXBsZW1lbnRhdGlvbiBpcyBmaW5pc2hlZCBub3cgKGluY2x1ZGluZyBmb3IgLWJ1aWx0aW4pOgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQKCjIwMTgtMDktMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCB3aGVuIHVzaW5nIC1idWlsdGluIGFuZCB3cmFwcGluZyBzdGQ6Om1hcCwgc3RkOjpzZXQsIHN0ZDo6dW5vcmRlcmVkX21hcCBvcgogICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQgdG8gZW5zdXJlIF9fY29udGFpbnNfXyBpcyBjYWxsZWQuIFRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgU1RMCiAgICAgICAgICAgIGNvbnRhaW5lcidzIGZpbmQgbWV0aG9kLiBXaXRob3V0IGl0LCBQeXRob24gd2lsbCBkbyBpdHMgb3duIHNsb3dlciBzZXF1ZW5jZSBzZWFyY2guCgoyMDE4LTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZnVuY3RvcnMgKHdyYXBwZWQgYXMgX19jYWxsX18pIHdoZW4gdXNpbmcgLWJ1aWx0aW4gLW1vZGVybiAtZmFzdHVucGFjay4KCjIwMTgtMDktMDI6IGFuZHJlYXMuZ2FlZXIsdGtyYXNudWtoYQogICAgICAgICAgICBbUHl0aG9uXSAjMTMyMSBGaXggYXNzZXJ0IGluIFB5VHVwbGVfR0VUX1NJWkUgaW4gZGVidWcgaW50ZXJwcmV0ZXIgYnVpbGRzIG9mIHB5dGhvbi0zLjcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRwX25ldy4KCjIwMTgtMDktMDE6IENocmlzdG9waGVySG9nYW4KICAgICAgICAgICAgW0d1aWxlXSAjMTI4OCBGaXggZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBndWlsZSA+PSAyLjAuMTIuCgoyMDE4LTA4LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTMxOSBDKysxMSBoYXNoIHRhYmxlcyBzdXBwb3J0OgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQKICAgICAgICAgICAgaXMgbm93IGNvbXBpbGluZyBhbmQgd29ya2luZyAoc29ydGluZyB1c2luZyAtYnVpbHRpbiBub3QgZnVsbHkgZnVuY3Rpb25hbCB5ZXQgdGhvdWdoKS4KCjIwMTgtMDgtMjA6IHdrYWxpbmluCiAgICAgICAgICAgICMxMzA1IEZpeCBuZXN0ZWQgc3RydWN0dXJlIHN5bWJvbCB0YWJsZXMgaW4gQyBtb2RlIHRvIGZpeCBtZW1iZXIgbmFtZSBjb25mbGljdHMKICAgICAgICAgICAgaW4gZGlmZmVyZW50IHN0cnVjdHMgd2l0aCB0aGUgc2FtZSBuZXN0ZWQgc3RydWN0IG1lbWJlciBuYW1lLgoKMjAxOC0wOC0xODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzY4OCBGaXggbWFrZWZpbGUgcmVjdXJzaW9uIHdoZW4gcnVubmluZyBweXRob24gdGVzdC1zdWl0ZS4KCjIwMTgtMDgtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMzEwIFJlLWltcGxlbWVudCBQeXRob24gLWZhc3Rwcm94eSBvcHRpb24uCgogICAgICAgICAgICBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gZmFpbGVkIHdpdGggUHl0aG9uIDMgYW5kIGFic3RyYWN0IGJhc2UgY2xhc2VzLgogICAgICAgICAgICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHJlcGxhY2VzIHRoZSBQeXRob24gMiBpbXBsZW1lbnRhdGlvbiB1c2luZwogICAgICAgICAgICBuZXcuaW5zdGFuY2VtZXRob2Qgd2l0aCB0aGUgQyBBUEkgUHlNZXRob2RfTmV3IHRvIG1hdGNoIHRoZSBlcXVpdmFsZW50IFB5dGhvbiAzCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgUHlJbnN0YW5jZU1ldGhvZF9OZXcuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHJ1bnMgc2xpZ2h0bHkgZmFzdGVyLiBTZWUgIzEzMTAuCgoyMDE4LTA4LTEyOiBnbWF6emFtdXRvCiAgICAgICAgICAgIFtQeXRob25dICMxMjgzIFVwZGF0ZSBweWJ1ZmZlci5pIGxpYnJhcnkgdG8gdXNlIG5ldy1zdHlsZSBQeXRob24gYnVmZmVyIEMgQVBJLgoKMjAxOC0wOC0xMjogYnJpYW5oYXR3b29kLHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTMwMyAjMTMwNCBGaXggY3Jhc2ggaW4gZGlyZWN0b3JzIHdoZW4gdXNpbmcgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGFuZAogICAgICAgICAgICBwYXNzaW5nIE5VTEwgcG9pbnRlcnMgaW4gQysrIHRvIGRpcmVjdG9yIG1ldGhvZCBvdmVybG9hZGVkIGFuZCBpbXBsZW1lbnRlZCBpbiBKYXZhLgoKMjAxOC0wOC0xMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyOTMgSW1wcm92ZSBUeXBlRXJyb3IgbWVzc2FnZSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBkZWZhdWx0IGFuZCBmYXN0ZGlzcGF0Y2gKICAgICAgICAgICAgbW9kZSB3aGVuIGhhbmRsaW5nIG92ZXJsb2FkZWQgQysrIGZ1bmN0aW9ucy4gUHJldmlvdXNseSB0aGUgZXJyb3IgbWVzc2FnZSBkaWQgbm90IGFsd2F5cwogICAgICAgICAgICBkaXNwbGF5IHRoZSBwb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGluIGZhc3RkaXNwYXRjaCBtb2RlLgoKMjAxOC0wOC0wMjogZnVyeWx5bngsamFjb2J3Z2lsbGVzcGllLHAyawogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzEyOTAsICM5NjguIEFkZCBzdXBwb3J0IGZvciBOb2RlSlMgdmVyc2lvbnMgMi0xMC4KCjIwMTgtMDctMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjkzIE92ZXJsb2FkZWQgQysrIGZ1bmN0aW9uIHdyYXBwZXJzIG5vdyByYWlzZSBhIFR5cGVFcnJvciBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE5vdEltcGxlbWVudGVkRXJyb3Igd2hlbiB0aGUgdHlwZXMgcGFzc2VkIGFyZSBpbmNvcnJlY3QuIFRoaXMgY2hhbmdlIG1lYW5zCiAgICAgICAgICAgIHRoZXJlIGlzIG5vdyBjb25zaXN0ZW5jeSB3aXRoIG5vbi1vdmVybG9hZGVkIGZ1bmN0aW9uIHdyYXBwZXJzIHdoaWNoIGhhdmUgYWx3YXlzCiAgICAgICAgICAgIHJhaXNlZCBUeXBlRXJyb3Igd2hlbiB0aGUgaW5jb3JyZWN0IHR5cGVzIGFyZSBwYXNzZWQuIFRoZSBlcnJvciBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgdGhlIHNhbWUgYW5kIGlzIGZvciBleGFtcGxlIG5vdzoKCiAgICAgICAgICAgICAgVHlwZUVycm9yOiBXcm9uZyBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ2YnLgogICAgICAgICAgICAgICAgUG9zc2libGUgQy9DKysgcHJvdG90eXBlcyBhcmU6CiAgICAgICAgICAgICAgICAgIGYoaW50KQogICAgICAgICAgICAgICAgICBmKGNoYXIgY29uc3QgKikKCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CgogICAgICAgICAgICAgIE5vdEltcGxlbWVudGVkRXJyb3I6IFdyb25nIG51bWJlciBvciB0eXBlIG9mIGFyZ3VtZW50cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbiAnZicuCiAgICAgICAgICAgICAgICBQb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGFyZToKICAgICAgICAgICAgICAgICAgZihpbnQpCiAgICAgICAgICAgICAgICAgIGYoY2hhciBjb25zdCAqKQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzE4IEZpeCBweXRob25ub25keW5hbWljIGZlYXR1cmUgZm9yIG1vZGVybiBjbGFzc2VzCgogICAgICAgICAgICBGaXhlcyBub25keW5hbWljIG1vZGUgd2hlbiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzZXQgd2l0aCB0aGUgc2FtZQogICAgICAgICAgICBuYW1lIGFzIGEgY2xhc3MgdmFyaWFibGUgaW4gYSBjbGFzcyBkZXJpdmVkIGZyb20gYSBTV0lHIHByb3h5IGNsYXNzLgogICAgICAgICAgICBUaGlzIGNvcm5lciBjYXNlIHNldCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gQXR0cmlidXRlRXJyb3IuCgogICAgICAgICAgICBBbHNvIGZpeCAlcHl0aG9ubm9uZHluYW1pYyBpbiBQeXRob24gMyB3aXRoIC1tb2Rlcm4uIFRoZSBtZXRhY2xhc3MKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgaW1wbGVtZW50YXRpb24gd2FzIHByZXZpb3VzbHkgbm90IGJlaW5nIGFwcGxpZWQgaW4gUHl0aG9uIDMuCgoyMDE4LTA3LTE3OiBwZXRybWl0cmljaGV2LHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjc1ICMxMjc5IEluaXRpYWxpemUgZnVuY3Rpb24tbG9jYWwgc3RhdGljcyAoc2luZ2xldG9ucykgdGhhdCBjYWxsIFB5dGhvbgogICAgICAgICAgICBjb2RlIGR1cmluZyBQeXRob24gbW9kdWxlIGluaXRpYWxpemF0aW9uIGluIG9yZGVyIHRvIGF2b2lkIGRlYWRsb2NrcyB3aXRoIHN1YnNlcXVlbnQKICAgICAgICAgICAgbXVsdGktdGhyZWFkZWQgdXNhZ2UuCgoyMDE4LTA2LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2VnIGZhdWx0IHVzaW5nIFB5dGhvbiAyIHdoZW4gcGFzc2luZyBhIFB5dGhvbiBzdHJpbmcsIGNvbnRhaW5pbmcKICAgICAgICAgICAgaW52YWxpZCB1dGYtOCBjb250ZW50LCB0byBhIHdzdHJpbmcgb3Igd2NoYXIgKiBwYXJhbWV0ZXIuIEEgVHlwZUVycm9yIGlzIHRocm93biBpbnN0ZWFkLCBlZzoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF93c3RyaW5nLmk+CiAgICAgICAgICAgICAgdm9pZCBpbnN0cmluZyhjb25zdCBzdGQ6OndzdHJpbmcmIHMpOwoKICAgICAgICAgICAgICBpbnN0cmluZyhiImhceGU5bGxvb28iKSAjIFB5dGhvbgoKMjAxOC0wNi0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuNyBzdXBwb3J0OiBSZXBsYWNlIHVzZSBvZiBkZXByZWNhdGVkIFB5VW5pY29kZV9HZXRTaXplIHdpdGgKICAgICAgICAgICAgUHlVbmljb2RlX0dldExlbmd0aCB0byByZW1vdmUgZGVwcmVjYXRlZCB3YXJuaW5ncyBjb21waWxpbmcgdGhlIEMvQysrIHdyYXBwZXJzLgoKMjAxOC0wNi0xMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuNyBzdXBwb3J0OiBUaGUgJXB5dGhvbmFiYyBmZWF0dXJlIGluIHB5YWJjLmkgbm93IHVzZXMgYmFzZSBjbGFzc2VzCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZQogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZwogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0CiAgICAgICAgICAgIGluc3RlYWQgb2YKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlU2VxdWVuY2UKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZwogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLk11dGFibGVTZXQKICAgICAgICAgICAgYXMgdGhlIGxhdHRlciBhcmUgZGVwcmVjYXRlZCBpbiBQeXRob24gMy43IGFuZCBhcmUgZHVlIHRvIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4KICAgICAgICAgICAgVGhlIGNsYXNzZXMgaW4gY29sbGVjdGlvbnMuYWJjLiogYXJlIGF2YWlsYWJsZSBmcm9tIFB5dGhvbiAzLjMgb253YXJkcy4gSWYgeW91CiAgICAgICAgICAgIHJlcXVpcmUgc3VwcG9ydCBmb3IgUHl0aG9uIDMuMiwgdGhlbiBjb3B5IHRoZSBweWFiYy5pIGZpbGUgYW5kIG1vZGlmeSBieSByZW1vdmluZwogICAgICAgICAgICB0aGUgZmV3IGluc3RhbmNlcyBvZiB0aGUgLmFiYyBzdWItbW9kdWxlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTEyOiBvbGx5LHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM3MDEgUmVtb3ZlIHN1cHBvcnQgZm9yIFB5dGhvbiB2ZXJzaW9ucyA8IDIuNyBhbmQgMy4wIGFuZCAzLjEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMTE6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IG5ldyBHQ0M4IHdhcm5pbmdzIGluIGdlbmVyYXRlZCBjb2RlIGJ5IGF2b2lkaW5nIGNhc3RzCiAgICAgICAgICAgIGJldHdlZW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9uIHR5cGVzIHdoZXJlIHBvc3NpYmxlLCBhbmQgYnkKICAgICAgICAgICAgc3VwcHJlc3NpbmcgdGhlIHdhcm5pbmcgd2hlbiBpdCdzIGR1ZSB0byB0aGUgZGVzaWduIG9mIFB5dGhvbidzIEMKICAgICAgICAgICAgQVBJLiAgRml4ZXMgIzEyNTkuCgoyMDE4LTA2LTA4OiBwaGlsaXBwa3JhZnQKCSAgICBbUHl0aG9uXSBTdG9wIGV4cG9zaW5nIDxDTEFTUz5fc3dpZ3JlZ2lzdGVyIHRvIFB5dGhvbi4gIEl0J3Mgbm90CgkgICAgdXNlZnVsIGZvciB1c2VyIFB5dGhvbiBjb2RlIHRvIGNhbGwgdGhpcywgYW5kIGl0IGp1c3QgY2x1dHRlcnMgdGhlCgkgICAgQVBJIHVubmVjZXNzYXJpbHkuICBGaXhlcyAjMTIyNS4KCjIwMTgtMDYtMDc6IGNtZm9pbCwga2FiYmksIEphbWllIEtpcmtwYXRyaWNrLCBtYXJrb2szMTQsIHZhZHosIHdzZnVsdG9uLCBZYW5uIERpb3JjZXQKICAgICAgICAgICAgIzE3MCBEb3h5Z2VuIGRvY3VtZW50YXRpb24gc3VwcG9ydCBhZGRlZC4gVGhpcyBhbGxvd3MgdHJhbnNsYXRpb24gb2YgRG94eWdlbiBjb21tZW50cwogICAgICAgICAgICBpbnRvIEphdmFEb2MgYW5kIFB5RG9jIGRvY3VtZW50YXRpb24uIEl0IGlzIGVuYWJsZWQgdmlhIHRoZSAtZG94eWdlbiBjb21tYW5kIGxpbmUKICAgICAgICAgICAgb3B0aW9uLiBTZWUgdGhlIERveHlnZW4uaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgoKMjAxOC0wNi0wNzogb2xseQoJICAgIFtQSFBdIFdlJ3ZlIGZpbmFsbHkgcmVtb3ZlZCBzdXBwb3J0IGZvciAlcHJhZ21hKHBocDQpIHdoaWNoIHdhcwoJICAgIGRlcHJlY2F0ZWQgYmFjayBpbiAyMDA4LiAgVXNlICVwcmFnbWEocGhwKSBpbnN0ZWFkLCB3aGljaCBoYXMgYmVlbgoJICAgIHN1cHBvcnRlZCBzaW5jZSBhdCBsZWFzdCAyMDA1LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTA3OiBvbGx5CgkgICAgW1BIUDVdIFN1cHBvcnQgZm9yIFBIUDUgaGFzIGJlZW4gcmVtb3ZlZC4gIFBIUDUgaXMgbm8gbG9uZ2VyCgkgICAgYWN0aXZlbHkgc3VwcG9ydGVkIGJ5IHRoZSBQSFAgZGV2ZWxvcGVycyBhbmQgc2VjdXJpdHkgc3VwcG9ydCBmb3IKCSAgICBpdCBlbmRzIGNvbXBsZXRlbHkgYXQgdGhlIGVuZCBvZiAyMDE4LCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UKCSAgICB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGl0IGluIHRoZSB1cGNvbWluZyBTV0lHIDQuMC4wIHJlbGVhc2UuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMDY6IG9sbHkKCSAgICBbTHVhXSBJbXByb3ZlIGNvbmZpZ3VyZSBwcm9iZXMgZm9yIEx1YSBoZWFkZXJzIGFuZCBsaWJzIHVzZWQgaW4gdGVzdHN1aXRlLgoKMjAxOC0wNS0xNToga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBhZGQgc3VwcG9ydCBmb3IgdmVyc2lvbiA0LjQKICAgICAgICAgICAgLSBTaG91bGQgbm90IGludHJvZHVjZSBhbnkgdXNlci12aXNpYmxlIGluY29tcGF0aWJpbGl0aWVzCgoyMDE4LTA1LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEphdmFdIEZpeCBsb29rdXAgb2YgY3Njb25zdHJ1Y3QsIGRjb25zdHJ1Y3QgYW5kIGphdmFjb25zdHJ1Y3QgdHlwZW1hcHMuCiAgICAgICAgICAgIFRoZSBDKysgbmFtZXNwYWNlIHdhcyBwcmV2aW91c2x5IGlnbm9yZWQgd2hlbiBsb29raW5nIHVwIHRoZSB0eXBlbWFwLgoKMjAxOC0wNS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdIEZpeCBnZW5lcmF0ZWQgQysrIGNvZGUgd2hlbiB1c2luZyAlbnNwYWNlIG9uIG5hbWVzcGFjZXMgdGhhdCBhcmUgbW9yZQogICAgICAgICAgICB0aGFuIHR3byBsZXZlbHMgZGVlcC4KCjIwMTgtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMjUxIEFkZCBzdXBwb3J0IGZvciBDKysxNyBuZXN0ZWQgbmFtZXNwYWNlIGRlZmluaXRpb25zLAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBuYW1lc3BhY2UgQTo6QiB7IC4uLiB9CgoyMDE4LTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEphdmFdIEFkZCBzdXBwb3J0IHNvIHRoYXQgdGhlICVjc21ldGhvZG1vZGlmaWVycywgJWRtZXRob2Rtb2RpZmllcnMsCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGNhbiBtb2RpZnkgdGhlIG1ldGhvZCBtb2RpZmllcnMgZm9yIHRoZSBkZXN0cnVjdG9yIHdyYXBwZXJzCiAgICAgICAgICAgIGluIHRoZSBwcm94eSBjbGFzczogZGlzcG9zZSwgRGlzcG9zZSwgZGVsZXRlLiBXaXRoIHRoaXMgZmVhdHVyZSwgaXQgaXMgbm93IHBvc3NpYmxlCiAgICAgICAgICAgIHRvIG1ha2UgYSBDIyBwcm94eSBjbGFzcyBzZWFsZWQsIGVnIHdoZW4gd3JhcHBpbmcgYSBjbGFzcyBYLCB0aGUgdmlydHVhbCBtZXRob2QgbW9kaWZpZXJzCiAgICAgICAgICAgIGNhbiBiZSByZW1vdmVkIHVzaW5nOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSBYICJwdWJsaWMgc2VhbGVkIGNsYXNzIgogICAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBYOjp+WCAicHVibGljIC8qdmlydHVhbCovIjsKCjIwMTgtMDQtMTg6IG9sbHkKCSAgICBbUHl0aG9uXSBTdXBwcmVzcyBuZXcgcHljb2Rlc3R5bGUgd2FybmluZzoKCSAgICBFMjUyIG1pc3Npbmcgd2hpdGVzcGFjZSBhcm91bmQgcGFyYW1ldGVyIGVxdWFscwoKMjAxOC0wNC0wNzogZ29hdHNocmllawogICAgICAgICAgICBbUnVieV0gIzEyMTMgRml4IHJ1YnkgJWFsaWFzIGRpcmVjdGl2ZSBmb3IgZ2xvYmFsIEMvQysrIGZ1bmN0aW9ucy4KCjIwMTgtMDQtMDM6IG9sbHkKCSAgICBbUnVieV0gRml4IHRvIHBhc3MgUW5pbCBpbnN0ZWFkIG9mIE5VTEwgdG8gcmJfZnVuY2FsbCgpLCB3aGljaCBzaWxlbmNlcyBHQ0MKCSAgICAtV2NvbnZlcnNpb24tbnVsbCB3YXJuaW5nIChvbiBieSBkZWZhdWx0IHdpdGggcmVjZW50IEdDQykuCgoyMDE4LTAzLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzExODQgRml4IHN3aWdSZWxlYXNlT3duZXJzaGlwKCkgYW5kIHN3aWdUYWtlT3duZXJzaGlwKCkgcmVncmVzc2lvbgogICAgICAgICAgICBmb3Igbm9uLWRpcmVjdG9yIGNsYXNzZXMuIFJlc3RvcmVzIGEgZHluYW1pY19jYXN0IHdoaWNoIHdhcyBwcmV2aW91c2x5IHJlbW92ZWQuCgoyMDE4LTAzLTA3OiBsbG9uZ2kKCSAgICBHaXRodWIgUFIgIzExNjYgLSBGaXggcHJlcHJvY2Vzc29yIGhhbmRsaW5nIG9mIG1hY3JvcyB3aXRoIGNvbW1hcwoJICAgIGluIGEgLy8gY29tbWVudC4KCjIwMTgtMDItMTg6IEpQRVdkZXYKICAgICAgICAgICAgUGF0Y2ggIzExNjQgLSBBZGQgc3VwcG9ydCBmb3IgYSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmaWxlLCBhbHNvIHNvbWV0aW1lcwogICAgICAgICAgICBjYWxsZWQgYSByZXNwb25zZSBmaWxlLiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgZXhjZWVkCiAgICAgICAgICAgIHRoZSBzeXN0ZW0gY29tbWFuZC1saW5lIGxlbmd0aCBsaW1pdC4gVG8gdXNlLCBwdXQgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zCiAgICAgICAgICAgIGludG8gYSBmaWxlLCB0aGVuIHByb3ZpZGUgdGhlIGZpbGUgbmFtZSBwcmVmaXhlZCB3aXRoIEAsIGZvciBleGFtcGxlIHVzaW5nCiAgICAgICAgICAgIGEgZmlsZSBjYWxsZWQgYXJncy50eHQ6CgogICAgICAgICAgICAgIHN3aWcgQGFyZ3MudHh0CgoyMDE4LTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzExODcgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdyYXBwaW5nIHN0ZDo6Y29tcGxleCB2aWEKICAgICAgICAgICAgc3RkX2NvbXBsZXguaS4KCjIwMTgtMDEtMzA6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gYWRkIHR5cGUgbmFtZSBhcmd1bWVudCBpbiBTV0lHX3B0cigpIGZ1bmN0aW9uIHRvIGNhc3QgZnJvbSBwb2ludGVyIGFkZHJlc3MgdG8gdHlwZWQgcG9pbnRlcnMKCjIwMTgtMDEtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4cHJlc3Npb25zIGZvbGxvd2luZyBhIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgbXVzdCBub3cgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UKICAgICAgICAgICAgb3Igbm9uLW51bWVyaWMgY2hhcmFjdGVycy4gVGhpcyBzeW50YXggY2hhbmdlIG1ha2VzIHRoZSBTV0lHIHByZXByb2Nlc3NvciB3b3JrIGxpa2UKICAgICAgICAgICAgdGhlIEMgcHJlcHJvY2Vzc29yIGluIHRoaXMgYXJlYS4KCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgdXNlZCBiZSBhY2NlcHRlZCBhcyB2YWxpZCBzeW50YXg6CiAgICAgICAgICAgICAgI2lmMQogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDEyMwogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgTm93IHlvdSBnZXQgYW4gZXJyb3I6CiAgICAgICAgICAgICAgZXhhbXBsZS5oOjE6IEVycm9yOiBVbmtub3duIFNXSUcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZTogaWYxIChpZiB0aGlzIGlzIGEgYmxvY2sgb2YKICAgICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgY29kZSwgZGVsaW1pdCBpdCB3aXRoICV7IGFuZCAlfSkKICAgICAgICAgICAgICBleGFtcGxlLmg6MzogRXJyb3I6IEV4dHJhbmVvdXMgI2VuZGlmLgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0aGUgY29ycmVjdCBzeW50YXg6CiAgICAgICAgICAgICAgI2lmIDEKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAxMjMKICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgb2YgY291cnNlIGFsc28gd29ya3M6CiAgICAgICAgICAgICAgI2lmKDEpCiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMTIzCiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpc3N1ZSAjMTE4My4gRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGV2YWx1YXRpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiBkaXZpc2lvbiBieSB6ZXJvLgoKMjAxOC0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMxMTcyLiBTZWcgZmF1bHQgcGFyc2luZyBpbnZhbGlkIGV4cG9uZW50cyBpbiB0aGUgcHJlcHJvY2Vzc29yLgoKMjAxOC0wMS0xMjogTGlyeW5hCiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzExMjguIEFkZCBUb0FycmF5IGZ1bmN0aW9uIHRvIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLgoKMjAxOC0wMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBpc3N1ZSAjMTE1Ni4gQWRkIG1pc3NpbmcgdGhyb3dzIGNsYXVzZSBmb3IgaW50ZXJmYWNlcyB3aGVuIHVzaW5nIHRoZQogICAgICAgICAgICAlaW50ZXJmYWNlIGZhbWlseSBvZiBtYWNyb3MuCgoyMDE4LTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGVmYXVsdCBhcmd1bWVudHMgdXNpbmcgZXhwcmVzc2lvbnMgY29udGFpbmluZyAtPiBzeW50YXggZXJyb3IuIFByb2JsZW0gcmVwb3J0ZWQgb24KICAgICAgICAgICAgc3dpZy11c2VyIG1haWxpbmcgbGlzdC4KCjIwMTctMTItMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlcGxhY2UgcGVwOCB3aXRoIHB5Y29kZXN0eWxlIGZvciBjaGVja2luZyB0aGUgUHl0aG9uIGNvZGUgc3R5bGUgd2hlbgogICAgICAgICAgICBydW5uaW5nIFB5dGhvbiB0ZXN0cy4KCjIwMTctMTItMzA6IGRhdmVkaXNzaWFuCiAgICAgICAgICAgIEZpeGVkIGEgc3ltYm9sIGxvb2t1cCBpc3N1ZSB3aGVuIGVuY291bnRlcmluZyBhIHR5cGVkZWYgb2YgYSBzeW1ib2wgZnJvbSB0aGUgdGFnCiAgICAgICAgICAgIG5hbWVzcGFjZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB3aGVuIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLCBzdWNoIGFzICd0eXBlZGVmCiAgICAgICAgICAgIHN0cnVjdCBGb28gRm9vOycuCgoyMDE3LTEyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gYWRkIG1pc3Npbmcgc3VwcG9ydCBmb3IgZGlyZWN0b3JmcmVlIHR5cGVtYXBzLgoKMjAxNy0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzExNjcgRml4IGRpcmVjdG9yb3V0IHR5cGVtYXBzIHdoaWNoIHdlcmUgY2F1c2luZyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4KICAgICAgICAgICAgcmV0dXJuaW5nIHBvaW50ZXJzIGJ5IHJlZmVyZW5jZS4KCjIwMTctMTItMDg6IG9sbHkKCSAgICBbUEhQXSBVc2UgWkVORF9NT0RVTEVfR0xPQkFMU19BQ0NFU1NPUiB0byBhY2Nlc3MgZ2xvYmFscyBzbyB0aGUKCSAgICBnZW5lcmF0ZWQgY29kZSBidWlsZHMgd2hlbiBQSFAgd2FzIGJ1aWx0IHdpdGggWlRTIGVuYWJsZWQuCgoyMDE3LTEyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBjaGVja3MgZm9yIGZhaWx1cmVzIGluIGNhbGxzIHRvIFB5VW5pY29kZV9Bc1VURjhTdHJpbmcuIFByZXZpb3VzbHkgYQogICAgICAgICAgICBzZWcgZmF1bHQgY291bGQgb2NjdXIgd2hlbiBwYXNzaW5nIGludmFsaWQgVVRGOCBzdHJpbmdzIChsb3cgc3Vycm9nYXRlcyksIGVnIHBhc3NpbmcKICAgICAgICAgICAgdSJcdWRjZmYiIHRvIHRoZSBDIGxheWVyIChQeXRob24gMykuCgoyMDE3LTExLTI0OiBqb2VxdWFudAoJICAgIFtSXSBGaXggIzExMjQgYW5kIHJldHVybiBSX05pbFZhbHVlIGZvciBudWxsIHBvaW50ZXJzCgoyMDE3LTExLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gZGlyZWN0b3IgZXhjZXB0aW9uIGhhbmRsaW5nIGltcHJvdmVtZW50cy4KCiAgICAgICAgICAgIFdoZW4gYSBkaXJlY3RvciBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhbmQgaXQgaXMgY2F1Z2h0IGJ5IERpcmVjdG9yRXhjZXB0aW9uCiAgICAgICAgICAgIGFuZCBwYXNzZWQgYmFjayB0byBKYXZhIHVzaW5nIFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uOjp0aHJvd0V4Y2VwdGlvbiwgdGhlIEphdmEKICAgICAgICAgICAgc3RhY2sgdHJhY2Ugbm93IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgbGluZSB0aGF0IHRocmV3IHRoZSBleGNlcHRpb24uCgogICAgICAgICAgICBEZXByZWNhdGUgU3dpZzo6RGlyZWN0b3JFeGNlcHRpb246OnJhaXNlSmF2YUV4Y2VwdGlvbiwgcGxlYXNlIHJlcGxhY2UgdXNhZ2Ugd2l0aAogICAgICAgICAgICBTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbjo6dGhyb3dFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBDKysxMSByZWYtcXVhbGlmaWVycyB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTctMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgY29kZSB3aGVuIHVzaW5nIGRpcmVjdG9ycyBhbmQgbWV0aG9kcyByZXR1cm5pbmcgY29uc3QgcmVmIHBvaW50ZXJzLgoKMjAxNy0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhLCBPY3RhdmUsIFIsIFNjaWxhYl0gUG9ydCBkaXJlY3RvciB0eXBlbWFwcyB0byB0aGVzZSBhZGRpdGlvbmFsIGxhbmd1YWdlcy4KICAgICAgICAgICAgSXNzdWUgIzcwMC4KCjIwMTctMTAtMjY6IHJhZGFyc2F0MQogICAgICAgICAgICBbUnVieSBQeXRob25dIFBhdGNoICMxMDI5IC0gQ29ycmVjdCBoYW5kbGluZyBvZiBudWxsIHVzaW5nIGRpcmVjdG9ycyBhbmQgc2hhcmVkX3B0ci4KCjIwMTctMTAtMTA6IGpvZXF1YW50CgkgICAgW1JdIHBhc3MgZW51bSBleHByZXNzaW9ucyB0byBSLiAgVGhpcyB3aWxsIGdlbmVyYXRlCgkgICAgaW5jb3JyZWN0IGZpbGVzIHdoZW4gdGhlcmUgaXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uCgkgICAgaW4gdGhlIGVudW0sIGJ1dCB0aGlzIGlzIGJldHRlciB0aGFuIHNpbGVudGx5IGdlbmVyYXRpbmcKCSAgICBpbmNvcnJlY3QgY29kZQoKMjAxNy0xMC0wOTogb2xseQoJICAgIFtQSFBdIEZpeCBpbmNvcnJlY3Qgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCB3aGVuIHRoZXJlJ3MgYQoJICAgIGNvbWJpbmF0aW9uIG9mIG92ZXJsb2FkaW5nLCBwYXJhbWV0ZXJzIHdpdGggYSBkZWZhdWx0IHZhbHVlCgkgICAgYW5kICVuZXdvYmplY3QuICBGaXhlcyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMzUwLwoKMjAxNy0xMC0wOTogb2xseQoJICAgIFJlbW92ZSBHQ0ogc3VwcG9ydC4gIEl0IGlzbid0IGluIGEgZ29vZCBzdGF0ZSBhbmQgZG9lc24ndCBzZWVtIHRvCgkgICAgYmUgdXNlZCwgYW5kIEdDQzcgZHJvcHBlZCBHQ0ouICBDbG9zZXMKCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy84MjMvCgoyMDE3LTEwLTA3OiBvbGx5CgkgICAgRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBlbXB0eSBtYWNybyBhcmd1bWVudHMgdG8gbWF0Y2ggdGhhdCBvZgoJICAgIEMvQysrIGNvbXBpbGVycy4gIEZpeGVzIGlzc3VlICMxMTExIGFuZAoJICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzgyNi8KCjIwMTctMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICMxMTA4LiBGaXggcGxhdGZvcm0gaW5jb25zaXN0ZW5jeSBpbiBQeXRob24gZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICAgMzIgYml0IGFuZCA2NCBiaXQgY29tcGlsZWQgdmVyc2lvbnMgb2YgU1dJRyBnZW5lcmF0ZWQgZGlmZmVyZW50IFB5dGhvbiBmaWxlcwogICAgICAgICAgICB3aGVuIGRlZmF1bHQgYXJndW1lbnRzIHdlcmUgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgMzIgYml0IHNpZ25lZCBpbnRlZ2Vycy4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXJndW1lbnRzIHNwZWNpZmllZCBpbiBQeXRob24gYXJlIG5vdyBvbmx5IHRob3NlIHRoYXQgYXJlIGluIHRoZQogICAgICAgICAgICByYW5nZSBvZiBhIDMyIGJpdCBzaWduZWQgaW50ZWdlciwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGlzIG9idGFpbmVkIGZyb20gQy9DKysgY29kZS4KCjIwMTctMTAtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHN0ZDo6Y29tcGxleCB0eXBlcyBwYXNzZWQgYnkgdmFsdWUuCgoyMDE3LTEwLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YXNjcmlwdCwgUHl0aG9uLCBSdWJ5XSBJc3N1ZSAjNzMyIC0gTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBzdGQ6OmNvbXBsZXgKICAgICAgICAgICAgaW4gc3RkX2NvbXBsZXguaSBtZWFudCB0aGF0IHByZXZpb3VzbHkgc3RkOjpjb21wbGV4IGFsd2F5cyBoYWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIGJlIHdyYXBwZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZW1hcHMuCgoyMDE3LTEwLTAxOiBqb2VxdWFudAogICAgICAgICAgICBhbGxvdyBSIHBhY2thZ2UgbmFtZXMgd2l0aCBkb2NzCgkgICAgYWxsb3dpbmcgbXVsdGlwbGUgZ2V0IGFjY2Vzc29ycyBpbiBSCgkgICAgZml4IHNtYXJ0LXBvaW50ZXIgYW5kIE5BTUVTUEFDRSBzdXBwb3J0CgkgICAgY29uc3RydWN0b3JzIG5vdyByZXR1cm5pbmcgc21hcnQgcG9pbnRlcnMgKGlmIGNsYXNzCgkgICAgZGVjbGFyZWQgYXMgc3VjaCkKCSAgICBzbWFydC1wb2ludGVyIGNsYXNzZXMgZGVyaXZpbmcgZnJvbSBwYXJlbnQgc21hcnQtcG9pbnRlcnMKCjIwMTctMDktMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMTAwIC0gQWxsb3cgYW4gaW5zdGFudGlhdGVkIHRlbXBsYXRlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBpbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGFzIHRoZSBDKysgdGVtcGxhdGUgbmFtZSwgZm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IHBvc3NpYmxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IC4uLiB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShYKSBYPGludD47CgoyMDE3LTA5LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTA5OC4gRml4IG92ZXJsb2FkaW5nIG9mIHNoYXJlZF9wdHIgd2l0aCB1bmRlcmx5aW5nIHBvaW50ZXIgdHlwZXMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIG0oc3RkOjpzaGFyZWRfcHRyPFQ+IHApOwogICAgICAgICAgICAgIHZvaWQgbShUICZwKTsKICAgICAgICAgICAgICB2b2lkIG0oVCAqcCk7CgogICAgICAgICAgICBPbmx5IHRoZSBmaXJzdCBtZXRob2QgaXMgd3JhcHBlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC9zaGFkb3dlZC4KICAgICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUgdmlhIGEgbmV3IGF0dHJpYnV0ZSBpbiB0aGUgJ3R5cGVjaGVjaycgdHlwZW1hcCBjYWxsZWQKICAgICAgICAgICAgJ2VxdWl2YWxlbnQnLiBJZiBzcGVjaWZpZWQsIGl0IG11c3QgY29udGFpbiB0aGUgZXF1aXZhbGVudCBwb2ludGVyIHR5cGUgZm9yIG92ZXJsb2FkaW5nCiAgICAgICAgICAgIGFuZCBjYW4gb25seSBiZSB1c2VkIGZvciB0aGUgc3BlY2lhbCBTV0lHX1RZUEVDSEVDS19QT0lOVEVSIHByZWNlZGVuY2UgbGV2ZWwuCiAgICAgICAgICAgIFRoZSBzaGFyZWRfcHRyICd0eXBlY2hlY2snIHR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCBhY2NvcmRpbmdseS4KICAgICAgICAgICAgSGVyZSBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbjoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLCBwcmVjZWRlbmNlPVNXSUdfVFlQRUNIRUNLX1BPSU5URVIsIGVxdWl2YWxlbnQ9IlQgKiIpCiAgICAgICAgICAgICAgICBULAogICAgICAgICAgICAgICAgVCBDT05TVCAmLAogICAgICAgICAgICAgICAgVCBDT05TVCAqLAogICAgICAgICAgICAgICAgVCAqQ09OU1QmLAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4sCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8IFQgPiAmLAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4gKiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+IComCiAgICAgICAgICAgICAgICB7IC4uLiB9CgogICAgICAgICAgICBPdmVybG9hZGluZyB3aXRoIGFueSBvZiB0aGVzZSB0eXBlcyB3aWxsIHJlc3VsdCBpbiBTV0lHIGlnbm9yaW5nIGFsbCBidXQgdGhlIGZpcnN0CiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kIGJ5IGRlZmF1bHQuIFdpdGhvdXQgdGhlICdlcXVpdmFsZW50JyBhdHRyaWJ1dGUsIHdyYXBwaW5nIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgIG1ldGhvZHMgcmVzdWx0ZWQgaW4gdHlwZXMgYmVpbmcgc2hhZG93ZWQgKHNjcmlwdGluZyBsYW5ndWFnZXMpIG9yIGNvZGUgdGhhdCBkaWQgbm90CiAgICAgICAgICAgIGNvbXBpbGUgKHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzKS4KCjIwMTctMDktMTk6IGZ1dGF0dWtpCiAgICAgICAgICAgIFtQeXRob25dICMxMDAzIEFkZCAtLXdpdGgtMnRvMz0vcGF0aC90by8ydG8zIG9wdGlvbiB0byBjb25maWd1cmUuCgoyMDE3LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZSBwcm9tb3Rpb24gd3JhcHBpbmcgY29uc3RhbnQgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgIyBkZWZpbmUgRVhQUl9NSVhFRDEgICAgKDB4ODAgKyAxMS4xKSAtIDEKICAgICAgICAgICAgVGhpcyB3YXMgcHJldmlvdXNseSBhbiBpbnRlZ3JhbCB0eXBlIGluc3RlYWQgb2YgYSBmbG9hdGluZyBwb2ludCB0eXBlLgoKMjAxNy0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBjb2RlIGZvciBjb25zdGFudCBleHByZXNzaW9ucyBjb250YWluaW5nIHdjaGFyX3QgTCBsaXRlcmFscyBzdWNoIGFzOgogICAgICAgICAgICAgICMgZGVmaW5lIF9fV0NIQVJfTUFYICAgICgweDdmZmZmZmZmICsgTCdcMCcpCiAgICAgICAgICAgICAgIyBkZWZpbmUgX19XQ0hBUl9NSU4gICAgKC1fX1dDSEFSX01BWCAtIDEpCgoyMDE3LTA5LTEwOiBtbGFtYXJyZQogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMTA4My4gRGVmaW5lX0RFQlVHIHRvIDEgdG8gZG8gZXhhY3RseSBsaWtlIFZpc3VhbCBTdHVkaW8KICAgICAgICAgICAgL0xEZCwgL01EZCBvciAvTVRkIGNvbXBpbGVyIG9wdGlvbnMuCgoyMDE3LTA4LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTA1OS4gQWRkIHN1cHBvcnQgZm9yIEMrKzExIHJlZi1xdWFsaWZpZXJzIG9uIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgTWVtYmVycyB3aXRoIGx2YWx1ZSByZWYtcXVhbGlmaWVycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUlEgewogICAgICAgICAgICAgICAgdm9pZCBtMShpbnQgeCkgJjsKICAgICAgICAgICAgICAgIHZvaWQgbTIoaW50IHgpIGNvbnN0ICY7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFyZSB3cmFwcGVkIGxpa2UgYW55IG90aGVyIG1lbWJlciBmdW5jdGlvbi4gTWVtYmVyIGZ1bmN0aW9ucyB3aXRoIHJ2YWx1ZSByZWYtcXVhbGlmaWVycwogICAgICAgICAgICBhcmUgaWdub3JlZCBieSBkZWZhdWx0LCBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUlEgewogICAgICAgICAgICAgICAgdm9pZCBtMyhpbnQgeCkgJiY7CiAgICAgICAgICAgICAgICB2b2lkIG00KGludCB4KSBjb25zdCAmJjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBleGFtcGxlLmk6NzogV2FybmluZyA0MDU6IE1ldGhvZCB3aXRoIHJ2YWx1ZSByZWYtcXVhbGlmaWVyIG0zKGludCkgJiYgaWdub3JlZC4KICAgICAgICAgICAgICBleGFtcGxlLmk6ODogV2FybmluZyA0MDU6IE1ldGhvZCB3aXRoIHJ2YWx1ZSByZWYtcXVhbGlmaWVyIG00KGludCkgY29uc3QgJiYgaWdub3JlZC4KCiAgICAgICAgICAgIFRoZXNlIGNhbiBiZSB1bmlnbm9yZWQgYW5kIGV4cG9zZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSwgc2VlIGZ1cnRoZXIgZG9jdW1lbnRhdGlvbiBpbgogICAgICAgICAgICBDUGx1c1BsdXMxMS5odG1sLgoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDYzLiBBZGQgdXNpbmcgZGVjbGFyYXRpb25zIHRvIHRlbXBsYXRlcyBpbnRvIHR5cGVkZWYgdGFibGUuCgogICAgICAgICAgICBVc2luZyBkZWNsYXJhdGlvbnMgdG8gdGVtcGxhdGVzIHdlcmUgbWlzc2luZyBpbiBTV0lHJ3MgaW50ZXJuYWwgdHlwZWRlZiB0YWJsZXMuCiAgICAgICAgICAgIFRoaXMgbGVkIHRvIGEgZmV3IHByb2JsZW1zLCBzdWNoIGFzLCB0ZW1wbGF0ZXMgdGhhdCBkaWQgbm90IGluc3RhbnRpYXRlIGFuZCBnZW5lcmF0ZWQKICAgICAgICAgICAgQysrIGNvZGUgdGhhdCBkaWQgbm90IGNvbXBpbGUgYXMgU1dJRyBkaWQgbm90IGtub3cgd2hhdCBzY29wZSB0aGUgdGVtcGxhdGUgd2FzCiAgICAgICAgICAgIGluLiBUaGlzIGhhcHBlbmVkIG1vc3RseSB3aGVuIGEgdXNpbmcgZGVjbGFyYXRpb24gd2FzIHVzZWQgb24gYSB0ZW1wbGF0ZSB0eXBlIGluIGEKICAgICAgICAgICAgY29tcGxldGVseSB1bnJlbGF0ZWQgbmFtZXNwYWNlLgoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGUgbG9va3VwIGluIHRoZSBwcmVzZW5jZSBvZiB1c2luZyBkaXJlY3RpdmVzIGFuZCB1c2luZyBkZWNsYXJhdGlvbnMuCgogICAgICAgICAgICBGaXggc29tZSBjYXNlcyBvZiB0eXBlIGxvb2t1cCBmYWlsdXJlIHZpYSBhIGNvbWJpbmF0aW9uIG9mIGJvdGggdXNpbmcgZGlyZWN0aXZlcyBhbmQKICAgICAgICAgICAgdXNpbmcgZGVjbGFyYXRpb25zIHJlc3VsdGluZyBpbiBDKysgY29kZSB0aGF0IGRpZCBub3QgY29tcGlsZSBhcyB0aGUgZ2VuZXJhdGVkIHR5cGUgd2FzCiAgICAgICAgICAgIG5vdCBmdWxseSBxdWFsaWZpZWQgZm9yIHVzZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gRXhhbXBsZSBiZWxvdzoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlNSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3ViU3BhY2U1IHsKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIFN1YlN1YlNwYWNlNSB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEYge307CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBTdWJTcGFjZTU7CiAgICAgICAgICAgICAgICB1c2luZyBTdWJTdWJTcGFjZTU6OkY7CiAgICAgICAgICAgICAgICB2b2lkIGZ1bmMoU3ViU3ViU3BhY2U1OjpGIGYpOwogICAgICAgICAgICAgIH0KCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMDUxLiAldGVtcGxhdGUgc2NvcGUgZW5mb3JjZW1lbnQgYW5kIGNsYXNzIGRlZmluaXRpb24gZml4ZXMuCgogICAgICAgICAgICBUaGUgc2NvcGluZyBydWxlcyBhcm91bmQgJXRlbXBsYXRlIGhhdmUgYmVlbiBzcGVjaWZpZWQgYW5kIGVuZm9yY2VkLgogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBmb3IgYSBjbGFzcyB0ZW1wbGF0ZSBpcyB0aGUgZXF1aXZhbGVudCB0byBhbgogICAgICAgICAgICBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIGEgQysrIGNsYXNzIHRlbXBsYXRlLiBUaGUgc2NvcGUgZm9yIGEgdmFsaWQKICAgICAgICAgICAgJXRlbXBsYXRlIGluc3RhbnRpYXRpb24gaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBzY29wZSByZXF1aXJlZCBmb3IgYQogICAgICAgICAgICB2YWxpZCBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIGEgQysrIHRlbXBsYXRlLiBBIGRlZmluaXRpb24gb2YgdGhlCiAgICAgICAgICAgIHRlbXBsYXRlIGZvciB0aGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBtdXN0IGJlIGluIHNjb3BlIHdoZXJlIHRoZQogICAgICAgICAgICBpbnN0YW50aWF0aW9uIGlzIGRlY2xhcmVkIGFuZCBtdXN0IG5vdCBiZSBlbmNsb3NlZCB3aXRoaW4gYSBkaWZmZXJlbnQKICAgICAgICAgICAgbmFtZXNwYWNlLgoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGEgZmV3ICV0ZW1wbGF0ZSBhbmQgQysrIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIHN0ZDo6dmVjdG9yCiAgICAgICAgICAgIGFyZSBzaG93biBiZWxvdzoKCiAgICAgICAgICAgICAgLy8gdmFsaWQKICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyB2YWxpZAogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CgogICAgICAgICAgICAgIC8vIHZhbGlkCiAgICAgICAgICAgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gaWxsLWZvcm1lZAogICAgICAgICAgICAgIG5hbWVzcGFjZSB1bnJlbGF0ZWQgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHN0ZDo6dmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdoZW4gdGhlIHNjb3BlIGlzIGluY29ycmVjdCwgYW4gZXJyb3Igbm93IG9jY3VycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBjcHBfdGVtcGxhdGVfc2NvcGUuaTozNDogRXJyb3I6ICd2ZWN0b3InIHJlc29sdmVzIHRvICdzdGQ6OnZlY3RvcicgYW5kCiAgICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IGluc3RhbnRpYXRlZCBpbiBzY29wZSAndW5yZWxhdGVkJyBpbnN0ZWFkIG9mIHdpdGhpbiBzY29wZSAnc3RkJy4KCiAgICAgICAgICAgIFByZXZpb3VzbHkgU1dJRyBhY2NlcHRlZCB0aGUgaWxsLWZvcm1lZCBleGFtcGxlcyBhYm92ZSBidXQgdGhpcyBsZWQgdG8KICAgICAgICAgICAgbnVtZXJvdXMgc3VidGxlIHRlbXBsYXRlIHNjb3BlIHByb2JsZW1zIGVzcGVjaWFsbHkgaW4gdGhlIHByZXNlbmNlIG9mCiAgICAgICAgICAgIHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgdXNpbmcgZGlyZWN0aXZlcyBhcyB3ZWxsIGFzIHdpdGggJWZlYXR1cmUgYW5kICV0eXBlbWFwLgoKICAgICAgICAgICAgQWN0dWFsbHksIGEgdmFsaWQgaW5zdGFudGlhdGlvbiBpcyBvbmUgd2hpY2ggY29uZm9ybXMgdG8gdGhlIEMrKzAzCiAgICAgICAgICAgIHN0YW5kYXJkIGFzIEMrKzExIG1hZGUgYSBjaGFuZ2UgdG8gZGlzYWxsb3cgdXNpbmcgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgICB1c2luZyBkaXJlY3RpdmVzIHRvIGZpbmQgYSB0ZW1wbGF0ZS4KCiAgICAgICAgICAgICAgLy8gdmFsaWQgQysrMDMsIGlsbC1mb3JtZWQgQysrMTEKICAgICAgICAgICAgICB1c2luZyBzdGQ6OnZlY3RvcjsKICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNpbWlsYXIgZml4ZXMgZm9yIGRlZmluaW5nIGNsYXNzZXMgdXNpbmcgZm9yd2FyZCBjbGFzcyByZWZlcmVuY2VzIGhhdmUKICAgICAgICAgICAgYWxzbyBiZWVuIHB1dCBpbiBwbGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgc3RydWN0IEE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMTo6QSB7CiAgICAgICAgICAgICAgICAgIHZvaWQgeCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgbm93IGVycm9yIG91dCB3aXRoOgoKICAgICAgICAgICAgICBjcHBfY2xhc3NfZGVmaW5pdGlvbi5pOjU6IEVycm9yOiAnU3BhY2UxOjpBJyByZXNvbHZlcyB0byAnU3BhY2UxOjpBJyBhbmQKICAgICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIGluIHNjb3BlICdTcGFjZTInIGluc3RlYWQgb2Ygd2l0aGluIHNjb3BlICdTcGFjZTEnLgoKICAgICAgICAgICAgUHJldmlvdXNseSBzb21lIHN5bWJvbHMgd291bGQgaGF2ZSBiZWVuIGluc3RhbnRpYXRlZCBpbiB0aGUgd3Jvbmcgc2NvcGUgYW5kIGxlZAogICAgICAgICAgICB0byBsb3RzIG9mIHNjb3BlIHByb2JsZW1zIGludm9sdmluZyBTV0lHIHR5cGVtYXBzLCBmZWF0dXJlcywgcmVuYW1lcyBldGMuCiAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gY29ycmVjdCB0aGUgc2NvcGUgdXNlZCBpbiBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgd2hpY2ggZG8gbm90CiAgICAgICAgICAgIHN1cHBvcnQgJ3VzaW5nIGRlY2xhcmF0aW9ucycgYW5kICd1c2luZyBkaXJlY3RpdmVzJy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBwcmV2aW91c2x5IGhhZDoKCiAgICAgICAgICAgICAgJXJlbmFtZShaYXApIHZlY3RvcjxpbnQ+OjpjbGVhcjsKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JJbnQpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgUHJpb3IgdmVyc2lvbnMgb2YgU1dJRyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQgdmVjdG9yPGludD4gaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKICAgICAgICAgICAgYW5kIHNvIHRoZSAlcmVuYW1lIG1hdGNoZWQuIE5vdyB0aGUgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkIGluIHRoZSBjb3JyZWN0IG5hbWVzcGFjZSwKICAgICAgICAgICAgc28gaXMgZnVsbHkgcXVhbGlmaWVkIGFzIHN0ZDo6dmVjdG9yPGludD4uIFRoZSBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgbmVlZCBjb3JyZWN0aW5nIGFzCiAgICAgICAgICAgIHRoZXkgZG8gbm90IGZvbGxvdyAndXNpbmcgZGVjbGFyYXRpb25zJyBhbmQgJ3VzaW5nIGRpcmVjdGl2ZXMnLiBDaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICVyZW5hbWUoWmFwKSBzdGQ6OnZlY3RvcjxpbnQ+OjpjbGVhcjsKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwoKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNjb3BlIGxvb2t1cCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyBjb250YWluaW5nIHVuYXJ5IHNjb3BlIG9wZXJhdG9ycy4KCiAgICAgICAgICAgIEZpeGVzIGNhc2VzIGxpa2U6CgogICAgICAgICAgICBuYW1lc3BhY2UgQWxsb2MgewogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZWJpbmQgewogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICV0ZW1wbGF0ZShSZWJpbmRCdWNrZXQpIEFsbG9jOjpSZWJpbmQ8IEJ1Y2tldCA+OwogICAgICAgICAgICBPUgogICAgICAgICAgICAldGVtcGxhdGUoUmViaW5kQnVja2V0KSBBbGxvYzo6UmViaW5kPCA6OkJ1Y2tldCA+OwoKICAgICAgICAgICAgQWxsb2M6OlJlYmluZDwgQnVja2V0ID46OkludGVnZXIgQnVja2V0MSgpOwogICAgICAgICAgICBBbGxvYzo6UmViaW5kPCA6OkJ1Y2tldCA+OjpJbnRlZ2VyIEJ1Y2tldDIoKTsKICAgICAgICAgICAgQWxsb2M6OlJlYmluZDw6OnRlbXBsYXRlIFRlbXBsYXRlQnVja2V0PGRvdWJsZT4+OjpJbnRlZ2VyIEJ1Y2tldDMoKTsKCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZvciB0ZW1wbGF0ZXMgb25seSwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGZ1bGx5IHJlc29sdmVkIHdoZW4KICAgICAgICAgICAgaGFuZGxpbmcgdHlwZW1hcHMuIFdpdGhvdXQgdGhpcywgaXQgaXMgdG9vIGhhcmQgdG8gaGF2ZSBkZWNlbnQgcnVsZXMKICAgICAgICAgICAgdG8gYXBwbHkgdHlwZW1hcHMgd2hlbiBwYXJhbWV0ZXIgdHlwZXMgYXJlIHR5cGVkZWYnZCBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycyBoYXZlIGRlZmF1bHQgdmFsdWVzLgoKICAgICAgICAgICAgRml4ZXMgJWNsZWFyIGZvciB0eXBlZGVmcyBpbiB0ZW1wbGF0ZXMsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcCgiaW4iKSBYWFg8aW50Pjo6TG9uZyAiLi4uIgogICAgICAgICAgICAgIHRlbXBsYXRlIHR5cGVuYW1lPFQ+IHN0cnVjdCBYWFggewogICAgICAgICAgICAgICAgdHlwZWRlZiBsb25nIExvbmc7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlY2xlYXIgWFhYPGludD46Okxvbmc7CgogICAgICAgICAgICBhcyB0aGUgdHlwZW1hcCB3YXMgcHJldmlvdXNseSBpbmNvcnJlY3RseSBzdG9yZWQgYXMgYSB0eXBlbWFwIGZvciBsb25nCiAgICAgICAgICAgIGluc3RlYWQgb2YgWFhYPGludD46OkxvbmcuCgoyMDE3LTA4LTA1OiBvbGx5CgkgICAgW0MrKzExXSBBbGxvdyBzdGF0aWNfYXNzZXJ0IGF0IHRoZSB0b3AgbGV2ZWwgKGFuZCBkaXNhbGxvdyBpdCByaWdodAoJICAgIGFmdGVyIHRlbXBsYXRlPFQ+KS4gIEZpeGVzIGlzc3VlIDEwMzEgcmVwb3J0ZWQgYnkgQXJ0ZW0gViBMLgoKMjAxNy0wOC0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdGx5IHNob3duIHdhcm5pbmcgd2hlbiBhbiBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHdhcyB1c2VkIG9uIGEKICAgICAgICAgICAgY2xhc3MgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYW5kIHRoYXQgYmFzZSBjbGFzcyB3YXMgZXhwbGljaXRseSBpZ25vcmVkIHdpdGggJWlnbm9yZS4KICAgICAgICAgICAgRXhhbXBsZSBvZiB0aGUgd2FybmluZyB3aGljaCB3aWxsIG5vIGxvbmdlciBhcHBlYXI6CgogICAgICAgICAgICAgIFdhcm5pbmcgNDAxOiBCYXNlIGNsYXNzICdGdW5jdG9yPCBpbnQsaW50ID4nIGhhcyBubyBuYW1lIGFzIGl0IGlzIGFuIGVtcHR5CiAgICAgICAgICAgICAgdGVtcGxhdGUgaW5zdGFudGlhdGVkIHdpdGggJyV0ZW1wbGF0ZSgpJy4gSWdub3JlZC4KCjIwMTctMDctMTc6IGZmbGV4bwogICAgICAgICAgICBbSmF2YV0gIzY3NCBBZGQgc3RkX2xpc3QuaSB0byBhZGQgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lcnMuIFRoZSBKYXZhIHByb3h5CiAgICAgICAgICAgIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2VxdWVudGlhbExpc3QgYW5kIG1ha2VzIHRoZSBDKysgc3RkOjpsaXN0IGNvbnRhaW5lciBsb29rCiAgICAgICAgICAgIGFuZCBmZWVsIG11Y2ggbGlrZSBhIGphdmEudXRpbC5MaW5rZWRMaXN0IGZyb20gSmF2YS4KCjIwMTctMDctMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBkaXNwbGF5IG9mIGRvY3VtZW50ZWQgdGVtcGxhdGUgdHlwZXMgd2hlbiB1c2luZyB0aGUgYXV0b2RvYwogICAgICAgICAgICBmZWF0dXJlLiBGb3IgZXhhbXBsZSB3aGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYXV0b2RvYyIpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFg+IHN0cnVjdCBUIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShUSW50ZWdlcikgVDxpbnQ+OwoKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGNvbnRhaW5zOgogICAgICAgICAgICAgICIiIlByb3h5IG9mIEMrKyBUPCBpbnQgPiBjbGFzcy4iIiIKICAgICAgICAgICAgaW5zdGVhZCBvZjoKICAgICAgICAgICAgICAiIiJQcm94eSBvZiBDKysgVDwoaW50KT4gY2xhc3MuIiIiCiAgICAgICAgICAgIGFuZAogICAgICAgICAgICAgICIiIl9faW5pdF9fKFRJbnRlZ2VyIHNlbGYpIC0+IFRJbnRlZ2VyIiIiCiAgICAgICAgICAgIGluc3RlYWQgb2YKICAgICAgICAgICAgICAiIiJfX2luaXRfXyhUPChpbnQpPiBzZWxmKSAtPiBUSW50ZWdlciIiIgoKMjAxNy0wNi0yNzogbmloYWxuCgkgICAgW1BIUF0gVXBkYXRlIHRoZSBPVVRQVVQgVHlwZW1hcCB0byBhZGQgcmV0dXJuIHN0YXRlbWVudCB0byB0aGUKCSAgICBQSFAgV3JhcHBlci4KCjIwMTctMDYtMjc6IG5paGFsbgoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgZW51bSBhbmQgdmFsdWUgZXhhbXBsZXMgdG8gdXNlIHRoZSBPTyB3cmFwcGVycwoJICAgIHJhdGhlciB0aGFuIHRoZSBmbGF0IGZ1bmN0aW9ucyBwcm9kdWNlZCB3aXRoIC1ub3Byb3h5LiAgVGhlcmUncwoJICAgIG5vdCBiZWVuIGEgZ29vZCByZWFzb24gdG8gdXNlIC1ub3Byb3h5IGZvciBzaW5jZSBQSFA1IE9PIHdyYXBwaW5nCgkgICAgd2FzIGZpeGVkIGJhY2sgaW4gMjAwNS4KCjIwMTctMDYtMjM6IG03dGhvbgogICAgICAgICAgICBbUHl0aG9uXSBmaXggYW5kIGltcHJvdmUgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZzoKCiAgICAgICAgICAgIDEuIEZpeCBuZWdhdGl2ZSBvY3RhbHMuIEN1cnJlbnRseSBub3QgaGFuZGxlZCBjb3JyZWN0bHkgYnkgYC1weTNgCiAgICAgICAgICAgICAgICh1bnVzdWFsIGNhc2UsIGJ1dCBpbmNvcnJlY3QpLgogICAgICAgICAgICAyLiBGaXggYXJndW1lbnRzIG9mIHR5cGUgIm9jdGFsICsgc29tZXRoaW5nIiAoZS5nLiBgMDY0MCB8IDA0YCkuCiAgICAgICAgICAgICAgIEN1cnJlbnRseSBkcm9wcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBvY3RhbC4gTmFzdHkhCiAgICAgICAgICAgIDMuIEZpeCBib29sIGFyZ3VtZW50cyAiMCArIHNvbWV0aGluZyIgKGUuZy4gYDAgfCAxYCkgYXJlIGFsd2F5cwogICAgICAgICAgICAgICAiRmFsc2UiICh1bnVzdWFsIGNhc2UsIGJ1dCBpbmNvcnJlY3QpLgogICAgICAgICAgICA0LiBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiAiVFJVRSIgYW5kICJGQUxTRSIgZnJvbQogICAgICAgICAgICAgICBgY29udmVydFZhbHVlYCBzaW5jZSB0aGVyZSdzIG5vIHJlYXNvbiB0aGVzZSBoYXZlIHRvIG1hdGNoCiAgICAgICAgICAgICAgICJ0cnVlIiBhbmQgImZhbHNlIi4KICAgICAgICAgICAgNS4gUmVtb3ZlIHRoZSBQeXRob24gMiB2cy4gUHl0aG9uIDMgZGlzdGluY3Rpb24gYmFzZWQgb24gdGhlCiAgICAgICAgICAgICAgIGAtcHkzYCBmbGFnLiBOb3cgdGhlIHNhbWUgcHl0aG9uIGNvZGUgaXMgcHJvZHVjZWQgZm9yIGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnRzIGZvciBQeXRob24gMiBhbmQgUHl0aG9uIDMuIEZvciB0aGlzLCBvY3RhbCBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50cywgZS5nLiAwNjQ0LCBhcmUgbm93IHdyYXBwZWQgYXMgYGludCgnNjQ0JywgOClgLiBUaGlzCiAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkLCBhcyBQeXRob24gMiBhbmQgUHl0aG9uIDMgaGF2ZSBpbmNvbXBhdGlibGUgc3ludGF4CiAgICAgICAgICAgICAgIGZvciBvY3RhbCBsaXRlcmFscy4KCiAgICAgICAgICAgIEZpeGVzICM3MDcKCjIwMTctMDYtMjE6IGZ1dGF0dWtpCiAgICAgICAgICAgICMxMDA0IC0gRml4IGNjYWNoZS1zd2lnIGV4ZWN1dGFibGUgbmFtZSB0byByZXNwZWN0IGNvbmZpZ3VyZSdzIC0tcHJvZ3JhbS1wcmVmaXggYW5kCiAgICAgICAgICAgIC0tcHJvZ3JhbS1zdWZmaXggdmFsdWVzIGlmIHVzZWQuCgoyMDE3LTA2LTIxOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5MTEgLSBBZGQgc3RkOjp3c3RyaW5nIHN1cHBvcnQuCgoyMDE3LTA2LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggaGFuZGxpbmcgb2YgcmljaCBjb21wYXJpc29ucyB3aGVuIHdyYXBwaW5nIG92ZXJsb2FkZWQgb3BlcmF0b3JzOgoKICAgICAgICAgICAgICBvcGVyYXRvcjwgIG9wZXJhdG9yPD0gIG9wZXJhdG9yPiAgb3BlcmF0b3I+PSAgb3BlcmF0b3I9PSAgb3BlcmF0b3IhPQoKICAgICAgICAgICAgUHJldmlvdXNseSBhIFR5cGVFcnJvciB3YXMgYWx3YXlzIHRocm93biBpZiB0aGUgdHlwZSB3YXMgbm90IGNvcnJlY3QuIE5vdEltcGxlbWVudGVkCiAgICAgICAgICAgIGlzIG5vdyByZXR1cm5lZCBmcm9tIHRoZXNlIHdyYXBwZWQgZnVuY3Rpb25zIGlmIHRoZSB0eXBlIGJlaW5nIGNvbXBhcmVkIHdpdGggaXMKICAgICAgICAgICAgbm90IGNvcnJlY3QuIFRoZSBzdWJzZXF1ZW50IGJlaGF2aW91ciB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uCiAgICAgICAgICAgIGFuZCB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBiZWluZyB1c2VkLCBidXQgaXMgbm93IGNvbnNpc3RlbnQgd2l0aCBub3JtYWwgUHl0aG9uCiAgICAgICAgICAgIGJlaGF2aW91ci4gRm9yIGV4YW1wbGUsIGZvciB0aGUgZmlyc3QgNCBvcGVyYXRvciBvdmVybG9hZHMgYWJvdmUsIGEgVHlwZUVycm9yCiAgICAgICAgICAgICd1bm9yZGVyYWJsZSB0eXBlcycgaXMgdGhyb3duIGluIFB5dGhvbiAzLCBidXQgUHl0aG9uIDIgd2lsbCByZXR1cm4gVHJ1ZSBvciBGYWxzZS4KICAgICAgICAgICAgTm90SW1wbGVtZW50ZWQgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIGNvbXBhcmlzb24gY2Fubm90IGJlIGRvbmUsIHNlZSBQRVAgMjA3IGFuZAogICAgICAgICAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvY29uc3RhbnRzLmh0bWwjTm90SW1wbGVtZW50ZWQKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgYnVnIHdhcyBvbmx5IHByZXNlbnQgd2hlbiBvdmVybG9hZGVkIG9wZXJhdG9ycyBkaWQgbm90IGFsc28gaGF2ZSBhCiAgICAgICAgICAgIGZ1bmN0aW9uIG92ZXJsb2FkLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnICMxMjA4ICgzNDQxMjYyKSBhbmQgU0YgcGF0Y2ggIzMwMy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wNi0xNzogZmFicmljZTEwMgogICAgICAgICAgICBbR29dIEZpeCBHbyBjYWxsYmFjayBleGFtcGxlLiAgRml4ZXMgZ2l0aHViICM2MDAsICM5NTUsICMxMDAwLgoKMjAxNy0wNi0xNjogd3NmdWx0b24KICAgICAgICAgICAgTWFrZSBzdXJlIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIGFyZSBub3Qgc3BsaXQgdXAgYnkgb3RoZXIgcHJvY2Vzc2VzIHdyaXRpbmcgdG8KICAgICAgICAgICAgc3Rkb3V0IGF0IHRoZSBzYW1lIHRpbWUuCgoyMDE3LTA2LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbnRhaW5pbmcgcnZhbHVlIGFuZCBsdmFsdWUgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCgoyMDE3LTA2LTEzOiBvbGx5CgkgICAgW1BlcmxdIEZpeCB0ZXN0c3VpdGUgdG8gd29yayB3aXRob3V0IC4gaW4gQElOQyAtIGl0IHdhcyByZW1vdmVkIGluCgkgICAgUGVybCA1LjI2IGZvciBzZWN1cml0eSByZWFzb25zLCBhbmQgaGFzIGFsc28gYmVlbiByZW1vdmVkIGZyb20KCSAgICBvbGRlciB2ZXJzaW9ucyBpbiBzb21lIGRpc3Ryb3MuICBGaXhlcyAjOTk3IHJlcG9ydGVkIGJ5IGxmYW0uCgoyMDE3LTA2LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWltcG9ydCBvbiBhIGZpbGUgY29udGFpbmluZyBhIGZpbGUgc2NvcGUgJWZyYWdtZW50IGZvcmNlZCBpbmNsdXNpb24gdG8gbm90CiAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBmcmFnbWVudCBjb250ZW50cyBhcyAlaW1wb3J0IHNob3VsZCBub3QgcmVzdWx0IGluIGNvZGUgYmVpbmcgZ2VuZXJhdGVkLgogICAgICAgICAgICBUaGUgYmVoYXZpb3VyIGlzIG5vdyB0aGUgc2FtZSBhcyBpbXBvcnRpbmcgY29kZSBpbnNlcnRpb24gYmxvY2tzLgogICAgICAgICAgICBXcmFwcGluZyBGaWxlQy5pIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3aWxsIHJlc3VsdCBpbiBubyBnZW5lcmF0ZWQgY29kZSwgd2hlcmVhcwogICAgICAgICAgICBwcmV2aW91c2x5ICIjaW5jbHVkZSA8bGltaXRzLmg+IiB3YXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAvLyBGaWxlQS5pCiAgICAgICAgICAgICAgJWZyYWdtZW50KCI8bGltaXRzLmg+IiwgImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAjaW5jbHVkZSA8bGltaXRzLmg+CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWZyYWdtZW50KCI8bGltaXRzLmg+Iik7CgogICAgICAgICAgICAgIC8vIEZpbGVDLmkKICAgICAgICAgICAgICAlaW1wb3J0ICJGaWxlQS5pIgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTA1LTI2OiBWb2xrZXIgRGllbHMtR3JhYnNjaCwgdmFkegogICAgICAgICAgICBbSmF2YV0gIzg0MiBFeHRlbmQgZnJvbSBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0PD4gYW5kIGltcGxlbWVudCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzIGZvcgogICAgICAgICAgICBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhpcyBub3RhYmx5IGFsbG93cyB0byBpdGVyYXRlIG92ZXIgd3JhcHBlZCB2ZWN0b3JzIGluIGEgbmF0dXJhbCB3YXkuCiAgICAgICAgICAgIE5vdGUgdGhhdCBib3hlZCB0eXBlcyBhcmUgbm93IHVzZWQgaW4gdGhlIEphdmEgbGF5ZXIgd2hlbiB3cmFwcGluZyB2ZWN0b3Igb2YgQyBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMsIGZvciBleGFtcGxlLiBUaGlzIG1heSBpbnRyb2R1Y2Ugc29tZSBzdWJ0bGUgaW5jb21wYXRpYmlsaXRpZXMgZHVlIHRvIHNvbWUKICAgICAgICAgICAgZGlmZmVyZW5jZXMgaW4gaG93IEphdmEgY29udmVydHMgYm94ZWQgdHlwZXMgYW5kIHVuYm94ZWQgdHlwZXMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICBpbnQgaT0wOwogICAgICAgICAgICAgIGRvdWJsZSBkMSA9IGk7IC8vIG9rCiAgICAgICAgICAgICAgRG91YmxlIGQyID0gaTsgLy8gZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlczogaW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gRG91YmxlCgogICAgICAgICAgICBUaGlzIGNhbiBiZSBhIHByb2JsZW0gd2hlbiBjYWxsaW5nIHRoZSBhZGQgYW5kIHNldCBmdW5jdGlvbnMuIEEgc3VnZ2VzdGVkIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmxlIHdvcmthcm91bmQgaXMgdG8gdXNlIHNvbWV0aGluZyBsaWtlIChzaG93biBmb3Igc3RkOjp2ZWN0b3I8ZG91YmxlPjoKCiAgICAgICAgICAgICAgI2lmIGRlZmluZWQoU1dJR0pBVkEpCiAgICAgICAgICAgICAgLy8gQWRkIGluIG9sZCBhcGkgdGhhdCB1c2VzIG5vbi1ib3hlZCB0eXBlcwogICAgICAgICAgICAgICVleHRlbmQgc3RkOjp2ZWN0b3I8ZG91YmxlPiB7CiAgICAgICAgICAgICAgJXByb3h5Y29kZSAlewogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkKGRvdWJsZSB4KSB7CiAgICAgICAgICAgICAgICAgIGFkZChEb3VibGUudmFsdWVPZih4KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGksIGRvdWJsZSB2YWwpIHsKICAgICAgICAgICAgICAgICAgc2V0KGksIERvdWJsZS52YWx1ZU9mKHZhbCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JEb3VibGUpIHN0ZDo6dmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDUtMzA6IGRhdmlkY2wKICAgICAgICAgICAgW1NjaWxhYl0gIzk5NCBVbmRlZmluZWQgc3ltYm9sIGVycm9yIHdoZW4gbG9hZGluZyBpbiBTY2lsYWIgNgoKMjAxNy0wNS0yNTogYXNpYnJvc3MKICAgICAgICAgICAgW0phdmFdICMzNzAgIzQxNyBNaXNzaW5nIHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBkaXJlY3RvciBleHRyYSBtZXRob2RzCiAgICAgICAgICAgIHN3aWdSZWxlYXNlT3duZXJzaGlwKCkgYW5kIHN3aWdUYWtlT3duZXJzaGlwKCkuCgoyMDE3LTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzIzMCAjNzU5IEZpeCBKYXZhIHNoYXJlZF9wdHIgYW5kIGRpcmVjdG9ycyBmb3IgZGVyaXZlZCBjbGFzc2VzIGphdmEgY29tcGlsYXRpb24KICAgICAgICAgICAgZXJyb3IuCgogICAgICAgICAgICBGb3Igc2hhcmVkX3B0ciBwcm94eSBwcm94eSBjbGFzc2VzLCBhZGQgYSBwcm90ZWN0ZWQgbWV0aG9kIHN3aWdTZXRDTWVtT3duIGZvciBtb2RpZnlpbmcKICAgICAgICAgICAgdGhlIHN3aWdDTWVtT3duIGFuZCBzd2lnQ01lbU93bkRlcml2ZWQgbWVtYmVyIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB2YXJpb3VzIG90aGVyCiAgICAgICAgICAgIG1ldGhvZHMgZm9yIGNvbnRyb2xsaW5nIG1lbW9yeSBvd25lcnNoaXAuCgoyMDE3LTA1LTIxOiBTZ2hpcmF0ZQogICAgICAgICAgICBbSmF2YSwgQyMsIERdICM0NDkgUmVtb3ZlIHVubmVjZXNzYXJ5IHVzZSBvZiBkeW5hbWljX2Nhc3QgaW4gZGlyZWN0b3JzIHRvIGVuYWJsZQogICAgICAgICAgICBub24tUlRUSSBjb21waWxhdGlvbi4KCjIwMTctMDUtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM5OTMgRml4IGhhbmRsaW5nIG9mIGRlZmF1bHQgLXZlIHVuc2lnbmVkIHZhbHVlcywgc3VjaCBhczoKICAgICAgICAgICAgICB2b2lkIGYodW5zaWduZWQgPSAtMVUpOwoKMjAxNy0wNS0yMDoganNjaHVlbGxlcgogICAgICAgICAgICBbUHl0aG9uXSAjOTkxIEZpeCBFNzMxIFBFUDggd2FybmluZzogZG8gbm90IGFzc2lnbiBhIGxhbWJkYSBleHByZXNzaW9uCgoyMDE3LTA1LTE2OiBuaWhhbDk1CiAgICAgICAgICAgIFtQSFBdIEFkZCAlcHJhZ21hIHZlcnNpb24gZGlyZWN0aXZlIHRvIGFsbG93IHRoZSB2ZXJzaW9uIG9mIHRoZQogICAgICAgICAgICBleHRlbnNpb24gdG8gYmUgc2V0LiAgUGF0Y2ggIzk3MCwgZml4ZXMgIzM2MC4KCjIwMTctMDUtMTM6IHlhZzAwCiAgICAgICAgICAgIFBhdGNoICM5NzUgLSBBZGQgc3VwcG9ydCBmb3Igbm9leGNlcHQgb24gZGlyZWN0b3IgbWV0aG9kcy4KCjIwMTctMDQtMjc6IHJlZGJyYWluCiAgICAgICAgICAgIElzc3VlICM5NzQsIFBhdGNoICM5NzYgLSBGaXggcHJlcHJvY2Vzc29yIGhhbmRsaW5nIG9mIG1hY3JvcyB3aXRoIGNvbW1hcyBpbiBhIGNvbW1lbnQuCgoyMDE3LTA0LTI1OiBqbGV2ZXF1ZQogICAgICAgICAgICBbTHVhXSAjOTU5IC0gRml4IFZpc3VhbCBTdHVkaW8gQzQyNDQgY29udmVyc2lvbiB3YXJuaW5ncyBpbiBMdWEgd3JhcHBlcnMuCgoyMDE3LTA0LTIxOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5NjQgLSBBZGQgc2hhcmVkX3B0ciBkaXJlY3RvciB0eXBlbWFwcy4KCjIwMTctMDQtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSAjNTg2LCAjOTM1IEFkZCBhc3NlcnQgZm9yIGludmFsaWQgTlVMTCB0eXBlIHBhcmFtZXRlciB3aGVuIGNhbGxpbmcgU1dJR19SdWJ5X05ld1BvaW50ZXJPYmouCgoyMDE3LTA0LTIwOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5MzAsICM5MzcgLSBGaXggY29udGFpbmVycyBvZiBzdGQ6OnNoYXJlZF9wdHIuCiAgICAgICAgICAgIFVwY2FzdGluZywgY29uc3QgdHlwZXMgKGVnIHZlY3RvcjxzaGFyZWRfcHRyPGNvbnN0IFQ+PikgYW5kIE5VTEwvbnVsbHB0ciBzdXBwb3J0IGFkZGVkLgoKMjAxNy0wNC0xMjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBOZXcgcGFyYW1ldGVyIHRhcmdldHZlcnNpb24gdG8gc3BlY2lmeSB0aGUgU2NpbGFiIHRhcmdldCB2ZXJzaW9uICg1LCA2LCAuLikgZm9yIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgICBXaXRoIFNjaWxhYiA2IHRhcmdldCBzcGVjaWZpZWQsIGlkZW50aWZpZXIgbmFtZXMgdHJ1bmNhdGlvbiBpcyBkaXNhYmxlZCAobm8gbG9uZ2VyIG5lY2Vzc2FyeSkKCjIwMTctMDMtMjQ6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gRml4ICM5MzkgLSBXcmFwcGluZyBzdGQ6OnZlY3Rvcjxib29sPiBmaXggZHVlIHRvIGluY29ycmVjdCBudWxsIGNoZWNrcwogICAgICAgICAgICBvbiBWQUxVRSBvYmouCgoyMDE3LTAzLTE3OiB2YWR6CiAgICAgICAgICAgIFtDI10gIzk0NyBBZGQgc3VwcG9ydCBmb3Igc3RkOjpjb21wbGV4PFQ+CgoyMDE3LTAzLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBoYW5kbGluZyBvZiB0eXBlZGVmJ2QgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIHR5cGVkZWYnZCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMKICAgICAgICAgICAgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpGblB0cl90ZCkoaW50LCBpbnQpOwogICAgICAgICAgICAgIGludCBkb19vcChpbnQgeCwgaW50IHksIEZuUHRyX3RkIG9wKTsKCjIwMTctMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBtZW1iZXIgY29uc3QgZnVuY3Rpb24gcG9pbnRlcnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgaW50IGZuKHNob3J0IChGdW5jczo6KiBwYXJtKShib29sKSkgY29uc3Q7CgogICAgICAgICAgICBBbHNvIGZpeCBwYXJzaW5nIG9mIHJlZmVyZW5jZXMvcG9pbnRlcnMgYW5kIHF1YWxpZmllcnMgdG8gbWVtYmVyCiAgICAgICAgICAgIHBvaW50ZXJzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGludCBmbihzaG9ydCAoRnVuY3M6OiogY29uc3QgcGFybSkoYm9vbCkpOwogICAgICAgICAgICAgIGludCBmbihzaG9ydCAoRnVuY3M6OiogJiBwYXJtKShib29sKSk7CgoyMDE3LTAzLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBFeHRlbmQgQysrMTEgYWx0ZXJuYXRlIGZ1bmN0aW9uIHN5bnRheCBwYXJzaW5nIHRvIHN1cHBvcnQgY29uc3QgYW5kIG5vZXhjZXB0LCBzdWNoIGFzOgoKICAgICAgICAgICAgICBhdXRvIHN1bTEoaW50IHgsIGludCB5KSBjb25zdCAtPiBpbnQgeyByZXR1cm4geCArIHk7IH0KICAgICAgICAgICAgICBhdXRvIHN1bTIoaW50IHgsIGludCB5KSBub2V4Y2VwdCAtPiBpbnQgeyByZXR1cm4geCArIHk7IH0KCjIwMTctMDItMjk6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzkxNyAtIEFkZCBFbnVtZXJhYmxlIG1vZHVsZSB0byBhbGwgY29udGFpbmVyIGNsYXNzIHdyYXBwZXJzLiBJdCB3YXMgbWlzc2luZwogICAgICAgICAgICBmb3Igc3RkOjpsaXN0LCBzdGQ6Om11bHRpc2V0LCBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldCBhbmQgc3RkOjp1bm9yZGVyZWRfbWFwLgoKMjAxNy0wMi0yNzogYXNzYW1iYXIKICAgICAgICAgICAgW0MrKzExXSBFeHRlbmQgcGFyc2VyIHRvIHN1cHBvcnQgdGhyb3cgc3BlY2lmaWVyIGluIGNvbWJpbmF0aW9uCiAgICAgICAgICAgIHdpdGggb3ZlcnJpZGUgYW5kL29yIGZpbmFsLgoKMjAxNy0wMi0xMDogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjODgzIC0gQWRkIHN1cHBvcnQgZm9yIEMrKzExIGhhc2ggdGFibGVzOgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQKCjIwMTctMDItMDg6IGpjc2hhcnAKICAgICAgICAgICAgW0MjXSAjODg3IEltcHJvdmUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlciBjb25zdHJ1Y3RvcnMgLQogICAgICAgICAgICBSZXBsYWNlIGNvbnN0cnVjdG9yIHRha2luZyBJQ29sbGVjdGlvbiB3aXRoIElFbnVtZXJhYmxlIGFuZCBhbHNvIGFkZCBJRW51bWVyYWJsZTxUPgogICAgICAgICAgICBjb25zdHJ1Y3RvciB0byBhdm9pZCB0aGUgYm94aW5nIGFuZCB1bmJveGluZyBvdmVyaGVhZCBvZiB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IsCiAgICAgICAgICAgIHdoZW4gdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGEgdmFsdWUgdHlwZS4KClZlcnNpb24gMy4wLjEyICgyNyBKYW4gMjAxNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNy0wMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjODgyIEZpeCBtaXNzaW5nIGZpbGVuYW1lIGluIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtCiAgICAgICAgICAgIHdyaXRpbmcgb3V0IEMjIGZpbGVzLgoKMjAxNy0wMS0yNzogYnJpYW5jYWluZQogICAgICAgICAgICBbR3VpbGVdICM3NDQgRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBHdWlsZSB3cmFwcGVycyAtIHJlZ3Jlc3Npb24KICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTMuMC4xMS4KCjIwMTctMDEtMjQ6IGFuZHJleS1zdGFyb2R1YnRzZXYKICAgICAgICAgICAgW0phdmFdIEFwcGx5ICM3MDQgLSBkaXJlY3RvciB0eXBlbWFwIGltcHJvdmVtZW50cy4KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4ZXMsIGFkZCBzdXBwb3J0IGZvciAiZGlyZWN0b3JhcmdvdXQiIHR5cGVtYXAgYW5kCiAgICAgICAgICAgIGFkZCBkaXJlY3RvciBzdXBwb3J0IHRvIHR5cGVtYXBzLmkuCgoyMDE3LTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBFbmhhbmNlICVleHRlbmQgdG8gZXh0ZW5kIGEgY2xhc3Mgd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICAgICAgICBGb28oaW50IGEsIFQgYikgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vKSBGb286OkZvbzxkb3VibGU+OwoKMjAxNy0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzg3NiBFbmhhbmNlICVleHRlbmQgdG8gZXh0ZW5kIGEgY2xhc3Mgd2l0aCB0ZW1wbGF0ZSBtZXRob2RzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICAgdm9pZCBkb19zdHVmZihpbnQgYSwgVCBiKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShkb19zdHVmZl9pbnN0KSBGb286OmRvX3N0dWZmPGRvdWJsZT47CgogICAgICAgICAgICAgIFNpbWlsYXJseSBmb3Igc3RhdGljIHRlbXBsYXRlIG1ldGhvZHMuCgoyMDE3LTAxLTIyOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGFkZCBzdXBwb3J0IGZvciB2ZXJzaW9uIDQuMgogICAgICAgICAgICAtIFRoZSBPY3RhdmUgQVBJIG5vdyB1c2VzIHNvbWUgQysrMTEgZmVhdHVyZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQogICAgICAgICAgICAgIHRoZSBta29jdGZpbGUgcHJvZ3JhbSBzdXBwbGllZCBieSBPY3RhdmUgdG8gY29tcGlsZSB0aGUgU1dJRy1nZW5lcmF0ZWQKICAgICAgICAgICAgICB3cmFwcGVyIGNvZGUsIGFzIG1rb2N0ZmlsZSB3aWxsIGVuc3VyZSB0aGUgY29ycmVjdCBDKysgY29tcGlsZXIvb3B0aW9ucwogICAgICAgICAgICAgIGFyZSB1c2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgbWtvY3RmaWxlIC1wIENYWGAgc2hvdWxkIGJlIHBhcnNlZAogICAgICAgICAgICAgIGZvciBhbnkgLXN0ZD0qIGZsYWdzIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQuCiAgICAgICAgICAgIC0gT2N0YXZlIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yIDw8IGFuZCA+PiBvcGVyYXRvcnMsIHNvIFNXSUcgbm93CiAgICAgICAgICAgICAgaWdub3JlcyB0aGVtLgogICAgICAgICAgICAtIFRoZSBPY3RhdmUgZXJyb3IoKSBmdW5jdGlvbiBub3cgcmFpc2VzIEMrKyBleGNlcHRpb25zIHRvIHByb3BhZ2F0ZQogICAgICAgICAgICAgIE9jdGF2ZSBlcnJvcnMsIHNvICVleGNlcHRpb24gZGlyZWN0aXZlcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgICAgICAgICBGb3IgY29udmVuaWVuY2UgdGhlIFNXSUdfUkVUSFJPV19PQ1RBVkVfRVhDRVBUSU9OUyBtYWNybyBjYW4gYmUgdXNlZAogICAgICAgICAgICAgIHRvIHJldGhyb3cgYW55IE9jdGF2ZSBleGNlcHRpb25zIGZvciBPY3RhdmUgaXRzZWxmIHRvIGhhbmRsZSwgZS5nLjoKCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGNhbGwgZXJyb3IoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU1dJR19SRVRIUk9XX09DVEFWRV9FWENFUFRJT05TICAgLy8gZXJyb3IoKSBleGNlcHRpb25zIGFyZSByZXRocm93bgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTAxLTE2OiB3a2FsaW5pbgogICAgICAgICAgICBbQyNdIEZpeCAjNzMzIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgogICAgICAgICAgICBNaXNzaW5nIHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGUgaW4gQyMgbGF5ZXIgd2hlbiB1c2luZyAlaW1wb3J0LgoKMjAxNy0wMS0xNjogZnNjaGxpbWIKICAgICAgICAgICAgRml4ICM4MTMgdGVtcGxhdGUgc3ltYm9sIG5hbWUgbG9va3VwIGJ1ZyB3aGVuIHR5cGVkZWYgbmFtZXMgYXJlIHRoZSBzYW1lIGJ1dCBpbiBkaWZmZXJlbnQKICAgICAgICAgICAgbmFtZXNwYWNlcy4KCjIwMTctMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBEIEphdmFdCiAgICAgICAgICAgIFRoZSBTV0lHIGxpYnJhcnkgbm8gbG9uZ2VyIHVzZXMgdGhlIGphdmF0eXBlLCBkdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMsIHRoZXJlYnkKICAgICAgICAgICAgY29tcGxldGVseSBmcmVlaW5nIHRoZW0gdXAgZm9yIHVzZXJzIHRvIHVzZSB3aXRob3V0IGhhdmluZyB0byByZXBsaWNhdGUgdGhlIGxpYnJhcnkKICAgICAgICAgICAgY29kZSB0aGF0IHRoZXkgcHJldmlvdXNseSBhZGRlZC4gVGhlIGNvZGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgYnkgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG5ldyAlcHJveHljb2RlIGRpcmVjdGl2ZS4gVGhlaXIgdXNlIGluIHRoZSBsaWJyYXJ5IGNvZGUKICAgICAgICAgICAgd2FzIGZhaXJseSBtaW5pbWFsOgoKICAgICAgICAgICAgICBDIyAgIGNzdHlwZTogICBzdGRfYXJyYXkuaSBzdGRfbWFwLmkgc3RkX3ZlY3Rvci5pCiAgICAgICAgICAgICAgRCAgICBkdHlwZTogICAgc3RkX3ZlY3Rvci5pCiAgICAgICAgICAgICAgSmF2YSBqYXZhdHlwZTogYXJyYXlzX2phdmEuaQoKMjAxNy0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlICVleHRlbmQgZGlyZWN0aXZlIGNhbiBub3cgb3B0aW9uYWxseSBzdXBwb3J0IG9uZSBvZiB0aGUgJ2NsYXNzJywgJ3N0cnVjdCcgb3IgJ3VuaW9uJwogICAgICAgICAgICBrZXl3b3JkcyBiZWZvcmUgdGhlIGlkZW50aWZpZXIgbmFtZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHsgLi4uIH07CiAgICAgICAgICAgICAgJWV4dGVuZCBzdHJ1Y3QgWCB7IC4uLiB9CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoaXMgaGFkIHRvIHNwZWNpZmllZCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFggeyAuLi4gfTsKICAgICAgICAgICAgICAlZXh0ZW5kIFggeyAuLi4gfQoKMjAxNy0wMS0xMzogd3NmdWx0b24KCSAgICBbQyMgRCBKYXZhXSBBZGQgbmV3ICVwcm94eWNvZGUgZGlyZWN0aXZlIHdoaWNoIGlzIGEgbWFjcm8gZm9yICVpbnNlcnQoInByb3h5Y29kZSIpLgogICAgICAgICAgICBUaGlzIGlzIGEgd2F5IG9mIGFkZGluZyBwdXJlIEMjL0QvSmF2YSBjb2RlIGludG8gdGhlIGFwcHJvcHJpYXRlIHByb3h5IGNsYXNzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBQcm94eTIgewogICAgICAgICAgICAgICVwcm94eWNvZGUgJXsKICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJveHljb2RlMihpbnQgaSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gaSsyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgc3RydWN0IFByb3h5MiB7fTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgd2lsbCB0aGVuIGJlIGEgcHVyZSBKYXZhL0MjL0QgbWV0aG9kIGNhbGxlZCBwcm94eWNvZGUyIGluIHRoZSBQcm94eTIgY2xhc3MuCgoyMDE2LTEyLTMxOiBhanJoZWFkaW5nMQoJICAgIElzc3VlICM4NjAgLSBSZW1vdmUgdXNlIG9mIHN0ZDo6dW5hcnlfZnVuY3Rpb24gYW5kIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uCiAgICAgICAgICAgIHdoaWNoIGlzIGRlcHJlY2F0ZWQgaW4gQysrMTEuCgoyMDE2LTEyLTMwOiBvbGx5CgkgICAgW1BIUDddIFJlZ2lzdGVyIGludGVybmFsICdzd2lnX3J1bnRpbWVfZGF0YV90eXBlX3BvaW50ZXInIGNvbnN0YW50CgkgICAgYXMgIkNPTlNUX1BFUlNJU1RFTlQiIHRvIGF2b2lkIHNlZ21lbnRhdGlvbiBmYXVsdCBvbiBtb2R1bGUgdW5sb2FkLgoJICAgIEZpeGVzICM4NTkgcmVwb3J0ZWQgYnkgVGltb3RoZXVzIFBva29ycmEuIFRoYW5rcyBhbHNvIHRvIEphdmllciBUb3JyZXMKCSAgICBmb3IgYSBtaW5pbWFsIHJlcHJvZHVjZXIuCgpWZXJzaW9uIDMuMC4xMSAoMjkgRGVjIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMTItMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkICVmZWF0dXJlKCJjc2RpcmVjdG9yZGVsZWdhdGVtb2RpZmllcnMiKSB0byBlbmFibGUgY3VzdG9taXphdGlvbgogICAgICAgICAgICBvZiB0aGUgZGVsZWdhdGUgYWNjZXNzIG1vZGlmaWVycyBnZW5lcmF0ZWQgaW4gZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRml4ZXMgaXNzdWUgIzc0OC4KCjIwMTYtMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBidWlsdGluICJweXRob246c2xvdCIgZmVhdHVyZSBmYWlsaW5nIGZvciB0cF9oYXNoIHdoZW4gdXNpbmcKICAgICAgICAgICAgaGFzaGZ1bmMgY2xvc3VyZSB3aXRoIGEgIldyb25nIHR5cGUgZm9yIGhhc2ggZnVuY3Rpb24iIGZvciBQeXRob24gMi4KICAgICAgICAgICAgSXNzdWUgIzg0My4KCjIwMTYtMTItMjE6IGpvZXF1YW10CiAgICAgICAgICAgIENoYW5nZWQgZ2VuZXJhdGlvbiBvZiBmdW5jdGlvbnMgc28gdGhhdCBvbmx5IGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IGVuZCBpbiBfc2V0IGdlbmVyYXRlIGFjY2Vzc29yIGZ1bmN0aW9ucyByYXRoZXIgdGhhbgoJICAgIGxvb2tpbmcgZm9yICJzZXQiLgoJICAgIENoYW5nZSBnZW5lcmF0aW9uIG9mIG9wZXJhdG9ycyB0byBub3QgaGF2ZSB1bmRlcnNjb3JlcwoJICAgIHRvIHN0YXJ0IGluIFIuIFVzZXJzIG5lZWQgdG8gcHJvdmlkZSBjdXN0b20gbmFtZXMgZm9yIHRoZXNlIG9wZXJhdG9yIG92ZXJsb2Fkcy4KCjIwMTYtMTItMjE6IG9sbHkKCSAgICBGaXggaXNmaW5pdGUoKSBjaGVja3MgdG8gd29yayB3aXRoIGFsbCBDKysxMSBjb21waWxlcnMuCgkgICAgRml4ZXMgaXNzdWVzICM2MTUsICM3ODggYW5kICM4NDkuCgoyMDE2LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICAlbmFtZXdhcm4gdW5uZWNlc3NhcmlseSBjYXVzZWQga2V5d29yZCB3YXJuaW5ncyBmb3Igbm9uLWluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBjbGFzc2VzCiAgICAgICAgICAgIGFuZCBkdXBsaWNhdGUgd2FybmluZ3MgZm9yIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdoZW4ga2V5d29yZHMgd2VyZSB1c2VkLgogICAgICAgICAgICBJc3N1ZSAjODQ1LgoKMjAxNi0xMi0xODogZXpyYWxhbmdsb2lzIAogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmVdIE1lbW9yeSBsZWFrIGZpeCBvbiBlcnJvciBpbiBzdGQ6OnBhaXIgd3JhcHBlcnMuCiAgICAgICAgICAgIElzc3VlICM4NTEuCgoyMDE2LTEyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBaZXJvIGluaXRpYWxpemUgYXJyYXlzIHdoZW4gdXNpbmcgJWFycmF5X2NsYXNzIGFuZCAlYXJyYXlfZnVuY3Rpb25zLgoKMjAxNi0xMi0xODogdC1pa2VnYW1pCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjNDQ2CiAgICAgICAgICAgIFB5dGhvbiAlYXJyYXlfY2xhc3Mgb2YgY2FycmF5cy5pIGZhaWxlZCB3aXRoIC1idWlsdGluIG9wdGlvbi4KCjIwMTYtMTItMTY6IGJyaWFuY2FpbmUKICAgICAgICAgICAgW0d1aWxlXSBQYXRjaCAjNzQ0IEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlJ3MgbmF0aXZlIHBvaW50ZXIgZnVuY3Rpb25hbGl0eQoKMjAxNi0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzc2OS4KICAgICAgICAgICAgQWRkIG9wdGlvbmFsIG1vZHVsZWltcG9ydCBhdHRyaWJ1dGUgdG8gJW1vZHVsZSBzbyB0aGF0IHRoZQogICAgICAgICAgICBkZWZhdWx0IG1vZHVsZSBpbXBvcnQgY29kZSBjYW4gYmUgb3ZlcnJpZGRlbi4gU2VlIHRoZSAiU2VhcmNoaW5nIGZvciB0aGUgd3JhcHBlciBtb2R1bGUiCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gaW4gUHl0aG9uLmh0bWwuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgX2ZvbyIpIGZvbwoKICAgICAgICAgICAgJG1vZHVsZSBhbHNvIGV4cGFuZHMgdG8gdGhlIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgbmFtZSwgc28gdGhlIGZvbGxvd2luZyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyBhYm92ZQoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGUiKSBmb28KCjIwMTYtMTEtMzA6IG9sbHkKCSAgICBbUEhQXSBBZGQgc3VwcG9ydCBmb3IgUEhQNy4gIFBIUDUncyBDIGV4dGVuc2lvbiBBUEkgaGFzIGNoYW5nZWQKCSAgICBzdWJzdGFudGlhbGx5IHNvIHlvdSBuZWVkIHRvIHVzZSAtcGhwNyB0byBzcGVjaWZ5IHlvdSB3YW50IFBIUDcKCSAgICBjb21wYXRpYmxlIHdyYXBwZXJzLiAgVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBnZW5lcmF0ZWQgd3JhcHBlcnMKCSAgICBpcyBub3cgLmN4eCAodG8gbWF0Y2ggU1dJRydzIGRlZmF1bHQgZm9yIGV2ZXJ5IG90aGVyIGxhbmd1YWdlIC0gdG8KCSAgICBnZW5lcmF0ZSBmb29fd3JhcC5jcHAgeW91IGNhbiBydW4gU1dJRyB3aXRoIC1jcHBleHQgY3BwKS4gIEZpeGVzCgkgICAgaXNzdWUgIzU3MS4KCgkgICAgQXMgcGFydCBvZiB0aGlzIGNoYW5nZSwgdGhlIGxhbmd1YWdlIHN1YmRpcmVjdG9yeSBmb3IgUEhQNSBoYXMKCSAgICBjaGFuZ2VkIGZyb20gInBocCIgdG8gInBocDUiIC0gaWYgeW91IGFyZSBtYWtpbmcgdXNlIG9mIHRoZSBzZWFyY2gKCSAgICBwYXRoIGZlYXR1cmUgd2hlcmUgdGhlIGxhbmd1YWdlIHN1YmRpcmVjdG9yeSBvZiBlYWNoIGRpcmVjdG9yeQoJICAgIGlzIGFsc28gc2VhcmNoZWQsIHlvdSdsbCBuZWVkIHRvIHVwZGF0ZSB5b3VyIGJpbmRpbmdzLiAgQSBzaW1wbGUKCSAgICBmaXggd2hpY2ggd29ya3MgZm9yIG9sZGVyIGFuZCBuZXdlciBTV0lHIGlzIHRvIGFkZCBhIHN5bWxpbms6CgkgICAgbG4gLXMgcGhwIHBocDUKCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTExLTMwOiBvbGx5CgkgICAgW1BIUF0gT25seSBlbWl0IG9uZSBjb3B5IG9mIGVhY2ggZGlzdGluY3QgYXJnaW5mby4gIFByZXZpb3VzbHkgd2UKCSAgICBlbWl0dGVkIGEgc2VwYXJhdGUgb25lIGZvciBldmVyeSB3cmFwcGVkIGZ1bmN0aW9uLCBidXQgdHlwaWNhbGx5CgkgICAgbWFueSBmdW5jdGlvbnMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgY29tYmluYXRpb25zCgkgICAgb2YgcGFyYW1ldGVycyBwYXNzZWQgYnkgcmVmZXJlbmNlIG9yIG5vdC4KCgkgICAgVGhpcyBjaGFuZ2Ugc2lnbmlmaWNhbnRseSByZWR1Y2VzIGJvdGggdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZAoJICAgIHdyYXBwZXIsIGFuZCBvZiB0aGUgY29tcGlsZWQgUEhQIGV4dGVuc2lvbiBtb2R1bGUgKGUuZy4gYnkgfjYlIGZvcgoJICAgIHRoZSBzdHJpcHBlZCBleHRlbnNpb24gbW9kdWxlIGZvciBYYXBpYW4ncyBQSFA3IGJpbmRpbmdzKS4KCjIwMTYtMTEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlcmVuYW1lIG92ZXJyaWRlIG9mIHdpbGRjYXJkICVyZW5hbWUgZm9yIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoR2xvYmFsSW50T3BlcmF0b3IpICo6Om9wZXJhdG9yIGJvb2w7IC8vIHdpbGRjYXJkICVyZW5hbWUKCiAgICAgICAgICAgICAgJXJlbmFtZShYSW50T3BlcmF0b3IpIFg6Om9wZXJhdG9yIGJvb2w7IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGZpcnN0ICVyZW5hbWUgYWJvdmUKICAgICAgICAgICAgICBPUgogICAgICAgICAgICAgICVyZW5hbWUoWEludE9wZXJhdG9yKSBYPGludD46Om9wZXJhdG9yIGJvb2w7IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGZpcnN0ICVyZW5hbWUgYWJvdmUKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggewogICAgICAgICAgICAgICAgb3BlcmF0b3IgYm9vbCgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoWGludCkgWDxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzICVyZW5hbWUgb3ZlcnJpZGUgb2YgZ2xvYmFsICVyZW5hbWUgZm9yIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8vIEdsb2JhbCByZW5hbWUgdG8gbWFrZSBhbGwgZnVuY3Rpb25zIHN0YXJ0IHdpdGggYSBsb3dlciBjYXNlIGxldHRlcgogICAgICAgICAgICAgICVyZW5hbWUoIiUoZmlyc3Rsb3dlcmNhc2UpcyIsICUkaXNmdW5jdGlvbiApICIiOwogICAgICAgICAgICAgICVyZW5hbWUod29vaG9vKSBXOjpXb287IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGFib3ZlICVyZW5hbWUKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFcgewogICAgICAgICAgICAgICAgVyBXb28oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFdpbnQpIFc8aW50PjsKCiAgICAgICAgICAgIFRoZSBhYm92ZSBhbHNvIGludHJvZHVjZXMgYSBwb3NzaWJseSB1bmV4cGVjdGVkIGNoYW5nZS4gTWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgcHJvdmlkZWQgYnkgU1dJRyB1c2UgJXJlbmFtZSB0byByZW5hbWUgc29tZSBtZXRob2RzLCBlZyBpbiBzdGQ6OnZlY3RvciwgcHVzaF9iYWNrCiAgICAgICAgICAgIGlzIHJlbmFtZWQgdG8gYWRkIGluIEphdmEuIFByZXZpb3VzbHkgdGhpcyBpbnRlbmRlZCByZW5hbWUgZGlkIG5vdCBoYXBwZW4gd2hlbiB1c2luZwogICAgICAgICAgICB1c2luZyBnbG9iYWwgJXJlbmFtZSBydWxlcyBhbmQgdGhlIG1ldGhvZCB3b3VsZCByZW1haW4gYXMgcHVzaF9iYWNrLCBidXQgaXMgbm93CiAgICAgICAgICAgIHJlbmFtZWQgdG8gYWRkLiBTb21lIG1vcmUgaW5mbyBpbiBpc3N1ZSAjODU2LgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMTEtMjY6IG03dGhvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjNzA5IC0gaW1wcm92ZWQgd3JhcHBpbmcgb2YgZGl2aXNpb24gb3BlcmF0b3JzCiAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyBub3cgd29ya3MgaW4gUHl0aG9uIDIgd2hldGhlciBvciBub3QgdGhlCiAgICAgICAgICAgIC1weTMgZmxhZyBpcyB1c2VkLgoKMjAxNi0xMS0xMjogam9lcXVhbnQKICAgICAgICAgICAgW1JdIElzc3VlICM2OTcgLSBmaXggY29tbWEgaXNzdWUgd2l0aCBvdmVybG9hZCBtZXRob2RzCgoyMDE2LTExLTEyOiBqb2VxdWFudAoJICAgIFtSXSBJc3N1ZSAjNTU1IC0gUiBydW50aW1lIG5lZWRzIHN0ZGlvLmgKCjIwMTYtMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM4MTYgLSBmaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyAtZXh0cmFuYXRpdmUgYW5kIC1idWlsdGluLgoKMjAxNi0xMS0wMjogbGlvcmdvbGQKICAgICAgICAgICAgUGF0Y2ggIzc0MSAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSBhbGlhcyB0ZW1wbGF0ZXMsIHNlZSB1cGRhdGVkIENQbHVzUGx1czExLmh0bWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KCjIwMTYtMTAtMzA6IG15ZDczNDkKICAgICAgICAgICAgW0MjXSBQYXRjaCAjNzQwIEFkZCBzdGRfYXJyYXkuaSBmb3IgQyMgZm9yIHdyYXBwaW5nIHN0ZDo6YXJyYXkuCgogICAgICAgICAgICBQYXRjaCBhbHNvIGVuaGFuY2VzIHN0ZDo6dmVjdG9yPHN0ZDo6d3N0cmluZz4gQyMgd3JhcHBlcnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9ucwogICAgICAgICAgICAoQ29udGFpbnMsIEluZGV4T2YsIExhc3RJbmRleE9mIGFuZCBSZW1vdmUpLgoKMjAxNi0xMC0zMDogdG9iaWxhdQogICAgICAgICAgICBbSmF2YV0gRml4IHdyYXBwZXJzIGZvciB3c3RyaW5nIHBhcmFtZXRlcnMgaW4gZGlyZWN0b3IgbWV0aG9kcyB0byBjbGVhbnVwIGxvY2FsCiAgICAgICAgICAgIHJlZiBhZnRlciBkaXJlY3RvciBjYWxsYmFjayBoYXMgZmluaXNoZWQuCgoyMDE2LTEwLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBtaXNzaW5nIGNzZGlyZWN0b3JpbiBWT0lEX0lOVF9QVFIgYW5kIGNzZGlyZWN0b3JvdXQgVk9JRF9JTlRfUFRSIHR5cGVtYXBzLgoKMjAxNi0xMC0yMzogaml1bG9uZ3cKICAgICAgICAgICAgUGF0Y2ggIzc4MSAtIEZpeCB3cmFwcGluZyBvZiBDIGNvbXBvdW5kIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgY2hhciBjb25zdGFudHMKICAgICAgICAgICAgaW4gcXVvdGVzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICNkZWZpbmUgSF9TVVBQUkVTU19TQ0FMSU5HX01BR0lDICgoJ3MnPDwyNCkgfCAoJ3UnPDwxNikgfCAoJ3AnPDw4KSB8ICdwJykKCiAgICAgICAgICAgICAgZW51bSBEaWZmZXJlbnRUeXBlcyB7CiAgICAgICAgICAgICAgICB0eXBlY2hhcmNvbXBvdW5kPSdBJysxLAogICAgICAgICAgICAgICAgdHlwZWNoYXJjb21wb3VuZDI9J0InIDw8IDIKICAgICAgICAgICAgICB9OwoKMjAxNi0xMC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzgwOCAtIGZpeCBQeXRob24gcGlja2xpbmcgYW5kIG1ldGFjbGFzcyBmb3IgYnVpbHRpbiB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSBtZXRhY2xhc3MgKFN3aWdQeU9iamVjdFR5cGUpIGZvciBTV0lHIG9iamVjdHMgd2FzIG5vdCBkZWZpbmVkIGluCiAgICAgICAgICAgIGEgd2F5IHRoYXQgbGV0IGltcG9ydGxpYiBzdWNjZXNzZnVsbHkgaW1wb3J0IHRoZSBQeXRob24gd3JhcHBlcnMuCiAgICAgICAgICAgIFRoZSBwaWNrbGUgbW9kdWxlIHByZXZpb3VzbHkgZmFpbGVkIHRvIHBpY2tsZSBvYmplY3RzIGJlY2F1c2UgaXQgY291bGRuJ3QKICAgICAgICAgICAgZGV0ZXJtaW5lIHdoYXQgbW9kdWxlIHRoZSBTV0lHIHdyYXBwZWQgb2JqZWN0cyB3ZXJlIGluLgoKMjAxNi0wOS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0FsbGVncm9jbCwgQ0ZGSSwgR08sIEphdmFzY3JpcHQsIE9jYW1sLCBSLCBTY2lsYWJdCiAgICAgICAgICAgIEFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIHRoZSAicmV0IiB0eXBlbWFwIGluIGEgZmV3IHRhcmdldCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGFsc28gbm93IGhhcyBpbmZvIG9uIHRoZSAicmV0IiB0eXBlbWFwLgoKMjAxNi0wOS0yNzogYWhtZWQtdXNtYW4KICAgICAgICAgICAgW3htbF0gSGFuZGxlIHRlbXBsYXRlIHBhcmFtZXRlcnMgY29ycmVjdGx5LgoKMjAxNi0wOS0yNzogZG9udHBhbmljOTIKICAgICAgICAgICAgW0dvXSBGaXggYXJndW1lbnQgbmFtZXMgaW4gaW5oZXJpdGVkIGZ1bmN0aW9ucyB0YWtpbmcgbW9yZSB0aGFuIDgKICAgICAgICAgICAgcGFyYW1ldGVycy4gIEZpeGVzICM3OTUuCgoyMDE2LTA5LTI2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIG1saXN0cyB0aGF0IG1hcCBwb2ludGVycyBjYW4gYmUgZ2l2ZW4gYSBjdXN0b20gdHlwZSBuYW1lLgoKMjAxNi0wOS0yNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzc5MyBmcm9tIHEtcCB0byBleHBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nIHRvIGluY2x1ZGUgc3RkOjpiYWRfY2FzdAogICAgICAgICAgICBpbiBzdGRfZXhjZXB0LmkuCgoyMDE2LTA5LTI0OiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCBjb2RlIGdlbmVyYXRlZCBmb3IgZmVhdHVyZSgiZGlyZWN0b3I6ZXhjZXB0IikgLQogICAgICAgICAgICBwcmV2aW91c2x5IHRoZSByZXR1cm4gdmFsdWUgb2YgY2FsbF91c2VyX2Z1bmN0aW9uKCkgd2FzIGlnbm9yZWQgYW5kCiAgICAgICAgICAgIHdlIGNoZWNrZWQgYW4gdW5pbml0aWFsaXNlZCB2YWx1ZSBpbnN0ZWFkLiAgRml4ZXMgIzYyNy4gIEJhc2VkIG9uCiAgICAgICAgICAgIHBhdGNoIGZyb20gU2VyZ2V5IFNlcm9zaHRhbi4KCjIwMTYtMDktMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1vcmUgZmxleGlibGUgcHl0aG9uIGJ1aWx0aW4gc2xvdHMgZm9yIG92ZXJsb2FkZWQgQysrIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIGNsb3N1cmUgbmFtZXMgdXNlZCBmb3IgYnVpbHRpbiBzbG90cyBhcmUgbWFuZ2xlZCB3aXRoIHRoZWlyIGZ1bmN0eXBlIHNvCiAgICAgICAgICAgIHRoYXQgb3ZlcmxvYWRlZCBDKysgbWV0aG9kIG5hbWVzIGNhbiBiZSB1c2VkIGZvciBtdWx0aXBsZSBzbG90cy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246c2xvdCIsICJtcF9zdWJzY3JpcHQiLCBmdW5jdHlwZT0iYmluYXJ5ZnVuYyIpIFNpbXBsZUFycmF5OjpfX2dldGl0ZW1fXzsKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOnNsb3QiLCAic3FfaXRlbSIsIGZ1bmN0eXBlPSJzc2l6ZWFyZ2Z1bmMiKSBTaW1wbGVBcnJheTo6X19nZXRpdGVtX18oUHlfc3NpemVfdCBuKTsKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgY2xvc3VyZXM6CgogICAgICAgICAgICAgIFNXSUdQWV9TU0laRUFSR0ZVTkNfQ0xPU1VSRShfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fXykgLyogZGVmaW5lcyBfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fX19zc2l6ZWFyZ2Z1bmNfY2xvc3VyZSAqLwogICAgICAgICAgICAgIFNXSUdQWV9CSU5BUllGVU5DX0NMT1NVUkUoX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX18pIC8qIGRlZmluZXMgX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX19fYmluYXJ5ZnVuY19jbG9zdXJlICovCgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgb25lIG5hbWUgd2FzIGRlZmluZWQ6IF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fX2Nsb3N1cmUuCiAgICAgICAgICAgIEhlbmNlIHRoZSBvdmVybG9hZGVkIF9fZ2V0aXRlbV9fIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGJvdGggbXBfc3Vic2NyaXB0IGFuZCBzcV9pdGVtIHNsb3RzLgoKMjAxNi0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGl0ZXJhdG9ycyBmb3IgY29udGFpbmVycyBvZiBOVUxMIHBvaW50ZXJzIChvciBQeXRob24gTm9uZSkgd2hlbiB1c2luZwogICAgICAgICAgICAtYnVpbHRpbi4gUHJldmlvdXNseSBpdGVyYXRpb24gd291bGQgc3RvcCBhdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHdhcyBOVUxMLgoKMjAxNi0wOS0xNjogb2xseQogICAgICAgICAgICBbSmF2YXNjcmlwdF0gRml4IFNXSUdfZXhjZXB0aW9uKCkgbWFjcm8gdG8gcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQKICAgICAgICAgICAgZnVuY3Rpb24uICBGaXhlcyAjNzg5LCByZXBvcnRlZCBieSBKdWxpZW4gRHV0cmlhdXguCgoyMDE2LTA5LTE2OiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCBTV0lHX2V4Y2VwdGlvbigpIG1hY3JvIHRvIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgogICAgICAgICAgICBGaXhlcyAjMjQwLCByZXBvcnRlZCBieSBTZXJnZXkgU2Vyb3NodGFuLgoKMjAxNi0wOS0xMjogeHlwcm9uCiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzc4NiBLZXl3b3JkIHJlbmFtZSB0byBiZSBDTFMgY29tcGxpYW50IGJ5IGFkZGluZyBhbiB1bmRlcnNjb3JlCiAgICAgICAgICAgIHN1ZmZpeCBpbnN0ZWFkIG9mIGFuIHVuZGVyc2NvcmUgcHJlZml4IHRvIHRoZSBDIHN5bWJvbCBuYW1lLiBQbGVhc2UgdXNlIGFuIGV4cGxpY2l0CiAgICAgICAgICAgICVyZW5hbWUgdG8gcmVuYW1lIHRoZSBzeW1ib2wgd2l0aCBhIF8gcHJlZml4IGlmIHlvdSB3YW50IHRoZSBvbGQgc3ltYm9sIG5hbWUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMDktMDk6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IGltcG9ydCBoYW5kbGluZyBmb3IgUHl0aG9uIDIuNiB0byB3b3JrIGluIGEgZnJvemVuCiAgICAgICAgICAgIGFwcGxpY2F0aW9uLiAgRml4ZXMgIzE0NSwgcmVwb3J0ZWQgYnkgVGhvbWFzIEtsdXl2ZXIuCgoyMDE2LTA5LTAyOiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIFBvaW50ZXJzIGFyZSBtYXBwZWQgdG8gbWxpc3QgaW5zdGVhZCBvZiB0bGlzdAogICAgICAgICAgICAobWxpc3QgYmV0dGVyIGZvciBzY2lsYWIgb3ZlcmxvYWRpbmcpCgoyMDE2LTA5LTAyOiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCAib3V0IiB0eXBlbWFwIGZvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgYW5kICJpbiIKICAgICAgICAgICAgdHlwZW1hcCBmb3IgY2hhciBJTlBVVFtBTlldLgoKMjAxNi0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gTW9yZSBlZmZpY2llbnQgUHl0aG9uIHNsaWNpbmcuCiAgICAgICAgICAgIENhbGwgcmVzZXJ2ZSBmb3IgY29udGFpbmVyIHR5cGVzIHRoYXQgc3VwcG9ydCBpdCB0byBhdm9pZCByZXBlYXRlZAogICAgICAgICAgICBtZW1vcnkgcmVhbGxvY2F0aW9ucyBmb3IgbmV3IHNsaWNlcyBvciBzbGljZXMgdGhhdCBncm93IGluIHNpemUuCgoyMDE2LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzcxIC0gTWFrZSBidWlsdGluIHR5cGVzIGhhc2hhYmxlIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIERlZmF1bHQgaGFzaCBpcyB0aGUgdW5kZXJseWluZyBDL0MrKyBwb2ludGVyLiBUaGlzIG1hdGNoZXMgdXAgd2l0aCB0ZXN0aW5nIGZvcgogICAgICAgICAgICBlcXVpdmFsZW5jZSAoUHlfRVEgaW4gU3dpZ1B5T2JqZWN0X3JpY2hjb21wYXJlKSB3aGljaCBjb21wYXJlcyB0aGUgcG9pbnRlcnMuCgoyMDE2LTA4LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaGUgZm9sbG93aW5nIGJ1aWx0aW4gc2xvdHMgY2FuIGJlIGN1c3RvbWl6ZWQgbGlrZSBvdGhlciBzbG90cyB2aWEgdGhlCiAgICAgICAgICAgICJweXRob246PHg+IiBhbmQgInB5dGhvbjpzbG90IiBmZWF0dXJlcyB3aGVyZSA8eD4gaXMgdGhlIGFwcHJvcHJpYXRlIHNsb3QgbmFtZToKICAgICAgICAgICAgICB0cF9hbGxvY3MKICAgICAgICAgICAgICB0cF9iYXNlcwogICAgICAgICAgICAgIHRwX2Jhc2ljc2l6ZQogICAgICAgICAgICAgIHRwX2NhY2hlCiAgICAgICAgICAgICAgdHBfZGVsCiAgICAgICAgICAgICAgdHBfZGVhbGxvYwogICAgICAgICAgICAgIHRwX2ZsYWdzCiAgICAgICAgICAgICAgdHBfZnJlZXMKICAgICAgICAgICAgICB0cF9nZXRzZXQKICAgICAgICAgICAgICB0cF9pc19nYwogICAgICAgICAgICAgIHRwX21heGFsbG9jCiAgICAgICAgICAgICAgdHBfbWV0aG9kcwogICAgICAgICAgICAgIHRwX21ybwogICAgICAgICAgICAgIHRwX25ldwogICAgICAgICAgICAgIHRwX25leHQKICAgICAgICAgICAgICB0cF9wcmV2CiAgICAgICAgICAgICAgdHBfcmljaGNvbXBhcmUKICAgICAgICAgICAgICB0cF9zdWJjbGFzc2VzCiAgICAgICAgICAgICAgdHBfd2Vha2xpc3QKICAgICAgICAgICAgICB3YXNfc3FfYXNzX3NsaWNlCiAgICAgICAgICAgICAgd2FzX3NxX3NsaWNlCgogICAgICAgICAgICBBIGZldyBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyBmb3Igc2xvdCBjdXN0b21pemF0aW9uLgoKMjAxNi0wOC0wOTogam9lcXVhbnQKICAgICAgICAgICAgW1JdIFBhdGNoICM3NjUgRml4IGV4dGVybiAiQyIgaGVhZGVyIGluY2x1ZGVzIGZvciBDKysgY29kZS4KCjIwMTYtMDgtMDU6IG9sbHkKICAgICAgICAgICAgW3htbF0gRml4IGhvdyB0aGUgb3V0cHV0IGZpbGVuYW1lIGlzIGJ1aWx0IHRvIGF2b2lkIHByb2JsZW1zIHdoZW4KICAgICAgICAgICAgaXQgY29udGFpbnMgdGhlIGVtYmVkZGVkIHN0cmluZ3MgIi5jIiwgIi5jcHAiIG9yICIuY3h4Ii4KICAgICAgICAgICAgRml4ZXMgIzU0MCByZXBvcnRlZCBieSBkamFjazQyLgoKMjAxNi0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvcm5lciBjYXNlIG9mIHdyYXBwaW5nIHN0ZDo6dmVjdG9yIG9mIFQgcG9pbnRlcnMgd2hlcmUgYSBwb2ludGVyIHRvIGEgcG9pbnRlciBvZiBUCiAgICAgICAgICAgIGFsc28gZXhpc3RzIGluIHRoZSB3cmFwcGVkIGNvZGUuIFNGIEJ1ZyAyMzU5NDE3ICg5NjcpLgoKMjAxNi0wNi0yNjogd2thbGluaW4KICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCAjNjgxIEZpeCBzZWcgZmF1bHQgd2hlbiBpZ25vcmluZyBuZXN0ZWQgY2xhc3Nlcy4KCjIwMTYtMDYtMjU6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dICM3MTEgRml4IC1jYXN0bW9kZSBhbmQgY29udmVyc2lvbiBvZiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIFNlZSAyMDE1LTEyLTIzIENIQU5HRVMgZW50cnkgZm9yIGRldGFpbHMgb2YgdGhlc2UgaW1wcm92ZW1lbnRzIHdoZW4gdGhleSB3ZXJlCiAgICAgICAgICAgIGltcGxlbWVudGVkIGZvciB0aGUgZGVmYXVsdCBvcHRpb25zIChpZSBub3QgdXNpbmcgLWNhc3Rtb2RlKS4KCjIwMTYtMDYtMjU6IGFobm9sZHMKICAgICAgICAgICAgUGF0Y2ggIzczMCAtIEZpeCAlaW1wbGljaXRjb252IGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aGVuIHVzaW5nCiAgICAgICAgICAgIC1jYXN0bW9kZSBvciAtZmFzdGRpc3BhdGNoIG9wdGlvbnMuCgogICAgICAgICAgICBUaGUgcmVzdWx0IGlzIHRoYXQgaW4gYWxsIG92ZXJsb2FkIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpbGwgZmlyc3QgY2hlY2sgZm9yCiAgICAgICAgICAgIGV4YWN0IChha2Egbm9uIGltcGxpY2l0KSBtYXRjaGVzLCBhbmQgdGhlbiBzdWJzZXF1ZW50bHkgY2hlY2sgZm9yIGltcGxpY2l0CiAgICAgICAgICAgIGNhc3RpbmcgbWF0Y2hlcy4gVGhpcyB3YXMgYWxyZWFkeSBoYXBwZW5pbmcgaW4gdGhlIG5vcm1hbCBkaXNwYXRjaCBzaXR1YXRpb24sCiAgICAgICAgICAgIGFuZCBpbiB0aGUgLWZhc3RkaXNwYXRjaCBjYXNlIHR3byBwYXNzZXMgdGhyb3VnaCB0aGUgY2FuZGlkYXRlcyB3ZXJlIGhhcHBlbmluZywKICAgICAgICAgICAganVzdCB3aXRoIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WIGFsd2F5cyBzZXQuIEFmdGVyIHRoaXMgcGF0Y2gsIGl0IGlzIG5vdCBzZXQKICAgICAgICAgICAgb24gdGhlIGZpcnN0IHBhc3MsIGFuZCB0aGVuIHNldCBvbiB0aGUgc2Vjb25kIHBhc3MuCgoyMDE2LTA2LTI1OiBsaW9yZ29sZAogICAgICAgICAgICBQYXRjaCAjNzI3IC0gQWRkIHN1cHBvcnQgZm9yIEMrKzExIHR5cGUgYWxpYXNpbmcuCgpWZXJzaW9uIDMuMC4xMCAoMTIgSnVuIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMDYtMDY6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2OTguIEFkZCBzdXBwb3J0IGZvciAtcmVsYXRpdmVpbXBvcnQgZm9yIHB5dGhvbiAyLjcsIHNvIC1weTMgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIGFsc28gcmVxdWlyZWQgZm9yIHJlbGF0aXZlIGltcG9ydCBzdXBwb3J0LgoKMjAxNi0wNi0wNTogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzY5NCAtIEZpeCBwYWNrYWdlIGltcG9ydCByZWdyZXNzaW9ucyBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjkuCgogICAgICAgICAgICAxKSBUaGUgY29kZSBpbiAzLjAuOSBkaWQgbm90IGZhbGwgYmFjayB0byAnaW1wb3J0IF9mb28nIGlmICdpbXBvcnQgYmFyLl9mb28nIGZhaWxlZAogICAgICAgICAgICAoYXNzdW1pbmcgYmFyLmZvbyB3YXMgdGhlIG1haW4gbW9kdWxlKS4gRXZlcnkgcGxhY2UgX2ZvbyBpcyBpbXBvcnRlZCBub3cgZmlyc3QgdHJpZXMKICAgICAgICAgICAgaXQgZnJvbSB0aGUgcGFja2FnZSB3aGVyZSBmb28gd2FzIGZvdW5kIGFuZCBpZiB0aGF0IGZhaWxzIHRyaWVzIF9mb28gYXMgYSBnbG9iYWwgbW9kdWxlLgoKICAgICAgICAgICAgMikgVGhlIHNlcGFyYXRlIGJsb2NrIG9mIFB5dGhvbiBjb2RlIHRoYXQgaW5qZWN0ZWQgY29kZSB0byBwdWxsIGluIHRoZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZyb20gX2ZvbyB3aGVuIC1idWlsdGluIGlzIHVzZWQgbWFkZSB1c2Ugb2YgdGhlIC1weTMgc3dpdGNoIHRvIGVpdGhlciBkbwogICAgICAgICAgICAnZnJvbSAuX2ZvbyBpbXBvcnQgKicgb3IgImZyb20gX2ZvbyBpbXBvcnQgKiIuIFRoaXMgYmxvY2sgb2YgY29kZSBubyBsb25nZXIgZG9lcyB0aGlzCiAgICAgICAgICAgIGFuZCBpbnN0ZWFkIGNoZWNrcyB0aGUgUHl0aG9uIHZlcnNpb24gYXQgcnVudGltZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSwgc3dpZy0zLjAuMTAgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZWFzZSB0aGUgY3JlYXRpb24gb2Ygd3JhcHBlciBtb2R1bGVzCiAgICAgICAgICAgIHRoYXQgY2FuIGJlIGZ1bGx5IG1hZGUgcGFydCBvZiBhIFB5dGhvbiBwYWNrYWdlLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgYXNzdW1lcyB0aGUgZHluYW1pY2FsbHkgbGlua2VkIEMgbW9kdWxlIGlzIGEgZ2xvYmFsIG1vZHVsZS4KICAgICAgICAgICAgVGhlIGR5bmFtaWMgbW9kdWxlIGNhbiBub3cgYmUgcGxhY2VkIGludG8gZWl0aGVyIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHB1cmUgUHl0aG9uCiAgICAgICAgICAgIG1vZHVsZSBvciBhcyBhIGdsb2JhbCBtb2R1bGUuICBCb3RoIGxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgUHl0aG9uIHdyYXBwZXIgdG8KICAgICAgICAgICAgbG9jYXRlIHRoZSBDIG1vZHVsZS4KCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgY291bGQgY2F1c2UgYSBiYWNrd2FyZHMgaW5jb21wYXRpYmlsaXR5IHdpdGggc29tZSBjb2RlCiAgICAgICAgICAgIHRoYXQgd2FzIHJlbHlpbmcgb24gdGhlIGFiaWxpdHkgb2YgImZyb20gcGFja2FnZSBpbXBvcnQgX21vZHVsZSIgdG8KICAgICAgICAgICAgcHVsbCBhdHRyaWJ1dGVzIG91dCBvZiB0aGUgcGFja2FnZSBkaXJlY3RseS4gIElmIHlvdXIgY29kZSBwb3B1bGF0ZXMgYQogICAgICAgICAgICBtb2R1bGUgKHdoaWNoIGlzIGFsc28gYSBwYWNrYWdlKSB3aXRoIGF0dHJpYnV0ZXMgdGhhdCBhcmUgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB3aGljaCB3ZXJlIG5vdCBsb2FkZWQgaW4gYSBjb252ZW50aW9uYWwgd2F5LAogICAgICAgICAgICBzd2lnLTMuMC44IGFuZCBlYXJsaWVyIG1heSBoYXZlIHdvcmtlZCBkdWUgdG8gJ2Zyb20gcGFja2FnZSBpbXBvcnQKICAgICAgICAgICAgX21vZHVsZScgYnlwYXNzaW5nIGEgcmVhbCBpbXBvcnQgYW5kIHB1bGxpbmcgeW91ciBtb2R1bGUgaW4gYXMgYW4KICAgICAgICAgICAgYXR0cmlidXRlLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuICBTaW5jZSB0aGlzIGlzIG5vdCBhIGNvbW1vbiAob3IKICAgICAgICAgICAgZXZlbiByZWNvbW1lbmRlZCkgcHJhY3RpY2UsIG1vc3QgZm9sayBzaG91bGQgbm90IGJlIGFmZmVjdGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTA1LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzY5MCAtIFNtYXJ0IHBvaW50ZXIgdG8gJWlnbm9yZWQgY2xhc3MgZG9lc24ndCBleHBvc2UgaW5oZXJpdGVkIG1ldGhvZHMuCiAgICAgICAgICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgoKVmVyc2lvbiAzLjAuOSAoMjkgTWF5IDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNi0wNS0yNDogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMiAtIEFkZCBzdXBwb3J0IGZvciBQeXRob24ncyBpbXBsaWNpdCBuYW1lc3BhY2UgcGFja2FnZXMuCgoyMDE2LTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICM2MDIgLSBFcnJvciBoYW5kbGluZyByZWdyZXNzaW9uIG9mIG9wYXF1ZSBwb2ludGVycyBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIHN3aWctMy4wLjggd2hlbiBDIGZ1bmN0aW9ucyBleHBsaWNpdGx5IHJlc2V0IGEgcG9pbnRlciB1c2luZyAnREFUQV9QVFIoc2VsZikgPSAwJy4KICAgICAgICAgICAgQW4gT2JqZWN0UHJldmlvdXNseURlbGV0ZWQgZXJyb3Igd2FzIGluY29ycmVjdGx5IHRocm93biB3aGVuIHRoZSBwb2ludGVyIHdhcyB1c2VkCiAgICAgICAgICAgIGFzIGEgcGFyYW1ldGVyLgoKMjAxNi0wNS0xNzogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNjUxIC0gQ29ycmVjdCBvdmVybG9hZGVkIGZ1bmN0aW9uIGVycm9yIG1lc3NhZ2Ugd2hlbiBmdW5jdGlvbiBpcwogICAgICAgICAgICB1c2luZyAlbmV3b2JqZWN0LgoKMjAxNi0wNS0xNzogYXVyZWxqCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNTgyIC0gYWRkIHN1cHBvcnQgZm9yIGRvY3N0cmluZyBvcHRpb24gaW4gJW1vZHVsZSgpCgoyMDE2LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQzNCAtIFBhc3NpbmcgY2xhc3NlcyBieSB2YWx1ZSBhcyBwYXJhbWV0ZXJzIGluIGRpcmVjdG9yIG1ldGhvZHMgZGlkIG5vdCBjcmVhdGUKICAgICAgICAgICAgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCBsZWFkaW5nIHRvIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzIGlmIHRoZSBvYmplY3Qgd2FzIHVzZWQKICAgICAgICAgICAgYWZ0ZXIgdGhlIHVwY2FsbCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFBhc3NpbmcgYXJndW1lbnRzIGJ5IHZhbHVlIHNob3VsZG4ndCBnaXZlCiAgICAgICAgICAgIHJpc2UgdG8gdGhlc2Ugc29ydHMgb2YgbWVtb3J5IHByb2JsZW1zIGFuZCBzbyB0aGUgb2JqZWN0cyBhcmUgbm93IGNvcGllZCBhbmQgb3duZXJzaGlwCiAgICAgICAgICAgIG9mIHRoZWlyIGxpZmV0aW1lIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTYtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjExLiBGaXggYXNzZXJ0aW9uIGhhbmRsaW5nIGRlZmF1bHRhcmdzIHdoZW4gdXNpbmcgJWV4dGVuZCBmb3IgYSB0ZW1wbGF0ZQogICAgICAgICAgICBjbGFzcyBhbmQgdGhlIGV4dGVuZGVkIG1ldGhvZHMgY29udGFpbiBkZWZhdWx0IGFyZ3VtZW50cy4KCjIwMTYtMDUtMDU6IGVqdWxpYW4KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxNy4gRml4IG9wZXJhdG9yLyB3cmFwcGVycy4KCjIwMTYtMDUtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjY5LiBEb24ndCBpc3N1ZSB3YXJuaW5nIGFib3V0IGlnbm9yaW5nIGJhc2UgY2xhc3NlcyB3aGVuIHRoZSBkZXJpdmVkIGNsYXNzIGlzCiAgICAgICAgICAgIGl0c2VsZiBpZ25vcmVkLgoKMjAxNi0wNC0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeCB1c2Ugb2YgZ29vdXQgdHlwZW1hcCB3aGVuIGNhbGxpbmcgYmFzZSBtZXRob2QgYnkKCSAgICBmb3JjaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlIHRvIHRoZSB2YWx1ZSB3ZSBuZWVkLgoKMjAxNi0wNC0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeGVzIGZvciBHbyAxLjY6IGF2b2lkIHJldHVybmluZyBHbyBwb2ludGVycyBmcm9tCgkgICAgZGlyZWN0b3JzIHRoYXQgcmV0dXJuIHN0cmluZyB2YWx1ZXM7IGFkZCBhIHRyYWlsaW5nIDAgYnl0ZQoJICAgIHdoZW4gdHJlYXRpbmcgR28gc3RyaW5nIGFzIEMgY2hhciouCgoyMDE2LTA0LTA2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdICM1NTIgTWFrZSBTY2lsYWIgcnVudGltZSBrZWVwIHRyYWNrIG9mIHBvaW50ZXIgdHlwZXMKICAgICAgICAgICAgSW5zdGVhZCBvZiBhIFNjaWxhYiBwb2ludGVyIHdoaWNoIGhhcyBubyB0eXBlLCBTV0lHIFNjaWxhYiBtYXBzIGEKICAgICAgICAgICAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0bGlzdCBjb250YWluaW5nIHRoZSBwb2ludGVyIGFkcmVzcyBhbmQgaXRzIHR5cGUuCgoyMDE2LTA0LTAyOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5ICM1OTguIEZpeCBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYSBub24tZXhpc3RlbnQKICAgICAgICAgICAgYXR0cmlidXRlLiBUaGUgcHJldmlvdXMgY3J5cHRpYyBlcnJvciBtZXNzYWdlOgogICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiB0eXBlIG9iamVjdCAnb2JqZWN0JyBoYXMgbm8gYXR0cmlidXRlICdfX2dldGF0dHJfXycKICAgICAgICAgICAgaXMgbm93IHJlcGxhY2VkIHdpdGggb25lIG1lbnRpb25pbmcgdGhlIGF0dHJpYnV0ZSBuYW1lLCBlZzoKICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogJ0Zvbycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ2JhcicKCjIwMTYtMDQtMDI6IGRlcmt1Y2kKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMCB0byBmaXggIzYwNy4KICAgICAgICAgICAgRml4IHNpbmdsZSBhcmd1bWVudHMgd2hlbiB1c2luZyBweXRob24gLWJ1aWx0aW4gLU8gd2l0aCAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikKCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzICM1OTQuIEZpeCBhc3NlcnRpb24gZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZW4gd3JhcHBpbmcgYSBDKysxMSBlbnVtIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgcHJpdmF0ZSBpbiBhIGNsYXNzLgoKICAgICAgICAgICAgQWxzbyBkb24ndCB3cmFwIHByaXZhdGUgZW51bXMgZm9yIGEgZmV3IGxhbmd1YWdlcyB0aGF0IGF0dGVtcHRlZCB0byBkbyBzby4KCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSB1bnNpZ25lZCBsb25nIGxvbmcgbWFyc2hhbGxpbmcgaW1wcm92ZW1lbnRzIHdoZW4gYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgICAgICAgaXMgcGFzc2VkIGZyb20gSmF2YSB0byBDLiBBIGNhc3QgdG8gc2lnbmVkIGxvbmcgbG9uZyBpbiB0aGUgQyBsYXllciB3aWxsIG5vdwogICAgICAgICAgICByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIHZhbHVlLiBObyBjaGFuZ2UgZm9yIHBvc2l0aXZlIG51bWJlcnMgcGFzc2VkIHRvIEMuCiAgICAgICAgICAgIEZpeGVzICM2MjMuCgoyMDE2LTAzLTIyOiBhbGV4d2FyZwoJICAgIFtMdWFdICMzOTggRml4IGx1YSBfX2dldGl0ZW0gKyBpbmhlcml0YW5jZQogICAgICAgICAgICBUaGUgbmV3IGhhbmRsaW5nIG9mIGNsYXNzZXMgaW4gTHVhIChub3QgbWVyZ2luZyBtZXRob2RzIGludG8gdGhlIGRlcml2ZWQgY2xhc3NlcykKICAgICAgICAgICAgYnJlYWtzIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhIF9fZ2V0aXRlbSBmdW5jdGlvbi4gVGhlIF9fZ2V0aXRlbSBmdW5jdGlvbgogICAgICAgICAgICBwcmV2ZW50cyBtZXRob2QgY2FsbHMgdG8gYW55IG1ldGhvZCBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcy4gVGhpcyBmaXggY2FsbHMKICAgICAgICAgICAgX19nZXRpdGVtIG9ubHkgaWYgdGhlIG1lbWJlciBpcyBub3QgZm91bmQgdXNpbmcgcmVjdXJzaXZlIGxvb2t1cC4KCjIwMTYtMDMtMTg6IHB0b211bGlrCgkgICAgW1B5dGhvbl0gIzU2MyBTdG9wIGdlbmVyYXRpbmcgdW5uZWNlc3NhcnkgX3N3aWdjb25zdGFudCBoZWxwZXJzLgoKMjAxNi0wMy0xNjogcmljaGFyZGJlYXJlCgkgICAgW1JdICM2MzYgQWRkIGV4dHJhIHN0ZDo6dmVjdG9yIG51bWVyaWMgdHlwZXMKCjIwMTYtMDMtMTQ6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBzdGRfYXJyYXkuaSBmb3IgQysrMTEgc3RkOjphcnJheSBzdXBwb3J0LgoKMjAxNi0wMy0xMjogd3NmdWx0b24KCSAgICBbSmF2YSwgQyMsIERdIEZpeCBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZXJzIHdpdGggJWphdmFjb25zdCgxKQogICAgICAgICAgICAlY3Njb25zdCgxKSBvciAlZG1hbmlmZXN0Y29uc3QuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgdGhlIGNhc2Ugd2hlbiBhbiBpbnRlZ2VyIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxpemVyLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVyB7IHN0YXRpYyBjb25zdCBjaGFyIHcgPSAxMDA7IH07CgoJICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBwYXJzaW5nIGVudW0gdmFsdWVzIHVzaW5nIGNoYXIgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICB3aGVuIHRoZXNlIHZhbHVlcyBhcHBlYXIgaW4gdGhlIEphdmEgY29kZSAodXN1YWxseSB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkpCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGVudW0gWCB7IHgxID0gJ1xuJywgeDIgPSAnXDEnIH07CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgY2hhciB2YXJpYWJsZXMgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFkgeyBzdGF0aWMgY29uc3QgY2hhciB5ID0gJ1xuJzsgfQoKICAgICAgICAgICAgTGlrZXdpc2UgZm9yIEQgYW5kICVkbWFuaWZlc3Rjb25zdGFudC4gRm9yIEMjIGFuZCAlY3Njb25zdCgxKSwgY2hhcgogICAgICAgICAgICB2YWx1ZXMgaW4gQyMgYXJlIG5vdyBoZXggZXNjYXBlZCBhcyBDIyBkb2Vzbid0IHN1cHBvcnQgQyBvY3RhbCBlc2NhcGluZy4KCjIwMTYtMDMtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBBZGQgc3VwcG9ydCBmb3IgdHJlYXRpbmcgQysrIGJhc2UgY2xhc3NlcyBhcyBKYXZhIGludGVyZmFjZXMKICAgICAgICAgICAgaW5zdGVhZCBvZiBKYXZhIHByb3h5IGNsYXNzZXMuIFRoaXMgZW5hYmxlIHNvbWUgc29ydCBvZiBzdXBwb3J0IGZvcgogICAgICAgICAgICBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIHN3aWdpbnRlcmZhY2UuaSBhbmQKICAgICAgICAgICAgcHJvdmlkZXMgYWRkaXRpb25hbCBtYWNyb3MgKHNlZSBKYXZhLmh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbik6CgogICAgICAgICAgICAgICVpbnRlcmZhY2UoQ1RZUEUpCiAgICAgICAgICAgICAgJWludGVyZmFjZV9pbXBsKENUWVBFKQogICAgICAgICAgICAgICVpbnRlcmZhY2VfY3VzdG9tKCJQUk9YWSIsICJJTlRFUkZBQ0UiLCBDVFlQRSkKCjIwMTYtMDMtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCByc3RyaXAgZW5jb2RlciBmb3IgdXNlIGluICVyZW5hbWUuIFRoaXMgaXMgbGlrZSB0aGUgc3RyaXAgZW5jb2RlciBidXQKICAgICAgICAgICAgc3RyaXBzIHRoZSBzeW1ib2wncyBzdWZmaXggaW5zdGVhZCBvZiB0aGUgcHJlZml4LiBUaGUgZXhhbXBsZSBiZWxvdwogICAgICAgICAgICB3aWxsIHJlbmFtZSBTb21lVGhpbmdDbHMgdG8gU29tZVRoaW5nIGFuZCBBbm90aGVyVGhpbmdDbHMgdG8gQW5vdGhlclRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHJzdHJpcDpbQ2xzXSlzIikgIiI7CgogICAgICAgICAgICAgIGNsYXNzIFNvbWVUaGluZ0NscyB7fTsKICAgICAgICAgICAgICBzdHJ1Y3QgQW5vdGhlclRoaW5nQ2xzIHt9OwoKMjAxNi0wMy0wMTogb2xseQoJICAgIEZpeCBpc2Zpbml0ZSgpIGNoZWNrIHRvIHdvcmsgd2l0aCBHQ0M2LiAgRml4ZXMKCSAgICBpc3N1ZSAjNjE1IHJlcG9ydGVkIGJ5IGpwbGVzbmlrLgoKMjAxNi0wMi0xNzogb2xseQoJICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGtleXdvcmRzICdhcycgYW5kICd3aXRoJyB0byBweXRob25rdy5zd2cuCgoyMDE2LTAyLTA3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHJlY29nbmlzZSB2YXJpb3VzIHVuYXJ5IGZ1bmN0aW9ucwogICAgICAgICAgICAqIFVzZSBfX2Zsb2F0X18oKSBmb3IgbnVtZXJpYyBjb252ZXJzaW9ucywgZS5nLiB3aGVuIGNhbGxpbmcgZG91YmxlKCkKICAgICAgICAgICAgKiBNYXAgdmFyaW91cyB1bmFyeSBmdW5jdGlvbnMsIGUuZy4gYWJzKCkgdG8gX19hYnNfXygpLCBzZWUgZnVsbCBsaXN0CiAgICAgICAgICAgICAgaW4gc2VjdGlvbiAzMi4zLjEwIG9mIG1hbnVhbDsgb25seSBhdmFpbGFibGUgaW4gT2N0YXZlIDMuOC4wIG9yIGxhdGVyCgoyMDE2LTAyLTA3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGV4cG9ydCBmdW5jdGlvbiBzd2lnX29jdGF2ZV9wcmVyZXEoKSBmb3IgdGVzdGluZyBPY3RhdmUgdmVyc2lvbgoKMjAxNi0wMi0wNjogcGpvaGFuZ3VzdGF2c3NvbgogICAgICAgICAgICBbQyNdIEZpeCBkdXBsaWNhdGUgc3ltYm9sIHByb2JsZW1zIHdoZW4gbGlua2luZyB0aGUgc291cmNlIGdlbmVyYXRlZAogICAgICAgICAgICBmcm9tIG11bHRpcGxlIFNXSUcgbW9kdWxlcyBpbnRvIG9uZSBzaGFyZWQgbGlicmFyeSBmb3IgdGhlIC1uYW1lc3BhY2UKICAgICAgICAgICAgb3B0aW9uLiBUaGUgbmFtZXNwYWNlIGlzIG5vdyBtYW5nbGVkIGludG8gdGhlIGdsb2JhbCBQSW52b2tlIGZ1bmN0aW9uCiAgICAgICAgICAgIG5hbWVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTAxLTI3OiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIFB5dGhvbiBCeXRlcwogICAgICAgICAgICBhbmQgVW5pY29kZSBvYmplY3RzIHVzaW5nIGJ5IGRlZmluaW5nIFNXSUdfUFlUSE9OX1NUUklDVF9CWVRFX0NIQVIKICAgICAgICAgICAgYW5kIFNXSUdfUFlUSE9OX1NUUklDVF9VTklDT0RFX1dDSEFSLgoKMjAxNi0wMS0yNzogc3RlZXZlCiAgICAgICAgICAgIFtHb10gRW5zdXJlIHN0cnVjdHMgYXJlIHByb3Blcmx5IHBhY2tlZCBiZXR3ZWVuIGdjIGFuZCBHQ0MvY2xhbmcuCgoyMDE2LTAxLTI1OiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIFN1cHBvcnQgdGhlIGZ1bGwgUHl0aG9uIHRlc3Qgc3VpdGUgaW4gLWNsYXNzaWMgbW9kZQogICAgICAgICAgICAqIENvbnZlcnQgbG9uZy91bnNpZ25lZCBsb25nL2xvbmcgbG9uZy91bnNpZ25lZCBsb25nIGxvbmcgdG8gUHlJbnQKICAgICAgICAgICAgICByYXRoZXIgdGhhbiBQeUxvbmcgd2hlbiBwb3NzaWJsZS4gQ2VydGFpbiBweXRob24gZnVuY3Rpb25zIGxpa2UKICAgICAgICAgICAgICBsZW4oKSByZXF1aXJlIGEgUHlJbnQgd2hlbiBvcGVyYXRpbmcgb24gb2xkLXN0eWxlIGNsYXNzZXMuCiAgICAgICAgICAgICogQWRkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZXRob2RzIGluIGNsYXNzaWMgbW9kZSwgaW5jbHVkaW5nIHN1cHBvcnQKICAgICAgICAgICAgICBmb3IgcHl0aG9uYXBwZW5kLCBweXRob25wcmVwZW5kLCBhbmQgZG9jc3RyaW5ncy4KICAgICAgICAgICAgKiBSZW1vdmluZyB0aGUgdXNlIG9mIF9fc3dpZ19nZXRtZXRob2RzX18gZm9yIHN0YXRpYyBtZW1iZXIgbWV0aG9kcwogICAgICAgICAgICAgIHNpbmNlIHRoZXkgd2lsbCBhbHdheXMgYmUgZm91bmQgYnkgdGhlIHN0YW5kYXJkIGFyZ3VtZW50IGxvb2t1cAogICAgICAgICAgICAqIEZpeCBhIGJ1ZyB3aGVyZSB0aGUgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24gd2FzIGNhdWdodCB3aGVuCiAgICAgICAgICAgICAgY2hlY2tpbmcgZm9yIG5ldy1zdHlsZSBjbGFzcyBzdXBwb3J0CgoyMDE2LTAxLTIzOiBhaG5vbGRzCiAgICAgICAgICAgIFtHb10gRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBHbyB0ZXN0LXN1aXRlIG9uIE9TWDoKICAgICAgICAgICAgKiBUaGUgbGlua2VyIG9uIE9TWCByZXF1aXJlcyB0aGF0IGFsbCBzeW1ib2xzIChldmVuIHdlYWsgc3ltYm9scykKICAgICAgICAgICAgICBhcmUgZGVmaW5lZCBhdCBsaW5rIHRpbWUuIEJlY2F1c2UgdGhlIGZ1bmN0aW9uIF9jZ29fdG9wb2ZzdGFjayBpcwogICAgICAgICAgICAgIG9ubHkgZGVmaW5lZCBzdGFydGluZyBpbiBHbyB2ZXJzaW9uIDEuNCwgd2UgZXhwbGljaXRseSBtYXJrIGl0IGFzCiAgICAgICAgICAgICAgdW5kZWZpbmVkIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBHbyBvbiBPU1guCiAgICAgICAgICAgICogQXZvaWQgd3JpdGluZyBlbXB0eSBzd2lnYXJncyBzdHJ1Y3RzLCBzaW5jZSBlbXB0eSBzdHJ1Y3RzIGFyZSBub3QKICAgICAgICAgICAgICBhbGxvd2VkIGluIGV4dGVybiAiQyIgYmxvY2tzLgoKMjAxNi0wMS0xMjogb2xseQoJICAgIFtKYXZhc2NyaXB0XSBMb29rIGZvciAibm9kZWpzIiBhcyB3ZWxsIGFzICJub2RlIiwgYXMgaXQncyBwYWNrYWdlZAoJICAgIGFzIHRoZSBmb3JtZXIgb24gRGViaWFuLgoKMjAxNi0wMS0xMjogb2xseQoJICAgIFtKYXZhc2NyaXB0XSBGb3IgdjggPj0gNC4zLjAsIHVzZSBWOF9NQUpPUl9WRVJTSU9OLgoJICAgIEZpeGVzIGlzc3VlIDU2MS4KCjIwMTYtMDEtMTA6IGFobm9sZHMKICAgICAgICAgICAgSW1wcm92ZWQgc2l6ZV90IGFuZCBwdHJkaWZmX3QgdHlwZW1hcHMgdG8gc3VwcG9ydCBsYXJnZSB2YWx1ZXMKICAgICAgICAgICAgb24gcGxhdGZvcm1zIHdoZXJlIHNpemVvZihzaXplX3QpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIGFuZAogICAgICAgICAgICBzaXplb2YocHRyZGlmZl90KSA+IHNpemVvZihsb25nKS4KClZlcnNpb24gMy4wLjggKDMxIERlYyAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMTItMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBwZGYgZG9jdW1lbnRhdGlvbiBpcyBub3cgZ2VuZXJhdGVkIGJ5IHdraHRtbHRvcGRmIGFuZCBoYXMgY29sb3VyCiAgICAgICAgICAgIGZvciB0aGUgY29kZSBzbmlwcGV0cyBqdXN0IGxpa2UgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbiEKCjIwMTUtMTItMjM6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZXMgZm9yIGNvbnZlcnNpb24gb2Ygc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzOgoKICAgICAgICAgICAgTm8gbG9uZ2VyIGNoZWNrIGZvciBQeUludCBvYmplY3RzIGluIFB5dGhvbjMuIEJlY2F1c2UgUHlJbnRfQ2hlY2sKICAgICAgICAgICAgYW5kIGZyaWVuZHMgYXJlICNkZWZpbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5TG9uZyBtZXRob2RzLCB0aGlzCiAgICAgICAgICAgIGhhZCBjYXVzZWQgZXJyb3JzIGluIFB5dGhvbjMgd2hlcmUgdmFsdWVzIGdyZWF0ZXIgdGhhbiB3aGF0IGNvdWxkIGJlCiAgICAgICAgICAgIHN0b3JlZCBpbiBhIGxvbmcgd2VyZSBpbmNvcnJlY3RseSBpbnRlcnByZXRlZCBhcyB0aGUgdmFsdWUgLTEgd2l0aAogICAgICAgICAgICB0aGUgUHl0aG9uIGVycm9yIGluZGljYXRvciBzZXQgdG8gT3ZlcmZsb3dFcnJvci4gVGhpcyBhcHBsaWVzIHRvCiAgICAgICAgICAgIGJvdGggdGhlIGNvbnZlcnNpb25zIFB5TG9uZy0+bG9uZyBhbmQgUHlMb25nLT5kb3VibGUuCgogICAgICAgICAgICBDb252ZXJzaW9uIGZyb20gUHlMb25nIHRvIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcgbG9uZywgYW5kCiAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBub3cgcmFpc2UgT3ZlcmZsb3dFcnJvciBpbnN0ZWFkIG9mIFR5cGVFcnJvciBpbgogICAgICAgICAgICBib3RoIFB5dGhvbjIgYW5kIFB5dGhvbjMgZm9yIFB5TG9uZyB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UKICAgICAgICAgICAgZXhwcmVzc2libGUgYnkgdGhlIGNvcnJlc3BvbmRpbmcgQyB0eXBlLiBUaGlzIG1hdGNoZXMgdGhlIGV4aXN0aW5nCiAgICAgICAgICAgIGJlaGF2aW9yIGZvciBvdGhlciBpbnRlZ3JhbCB0eXBlcyAoc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzLCBzaG9ydHMsCiAgICAgICAgICAgIGFuZCBjaGFycyksIGFzIHdlbGwgYXMgdGhlIGNvbnZlcnNpb24gZm9yIFB5SW50IHRvIGFsbCBudW1lcmljCiAgICAgICAgICAgIHR5cGVzLiBUaGlzIGFsc28gaW5kaXJlY3RseSBhcHBsaWVzIHRvIHRoZSBzaXplX3QgYW5kIHB0cmRpZmZfdAogICAgICAgICAgICB0eXBlcywgd2hpY2ggZGVwZW5kIG9uIHRoZSBjb252ZXJzaW9ucyBmb3IgdW5zaWduZWQgbG9uZyBhbmQgbG9uZy4KCjIwMTUtMTItMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAyIFVuaWNvZGUgVVRGLTggc3RyaW5ncyBjYW4gYmUgdXNlZCBhcyBpbnB1dHMgdG8gY2hhciAqIG9yCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVzIGlmIHRoZSBnZW5lcmF0ZWQgQy9DKysgY29kZSBoYXMgU1dJR19QWVRIT05fMl9VTklDT0RFIGRlZmluZWQuCgoyMDE1LTEyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZXMgIzI4NiwgIzEyOAogICAgICAgICAgICBSZW1vdmUgY2NhY2hlLXN3aWcuMSBtYW4gcGFnZSAtIHBsZWFzZSB1c2UgdGhlIENDYWNoZS5odG1sIGRvY3MgaW5zdGVhZC4KICAgICAgICAgICAgVGhlIHlvZGwybWFuIGFuZCB5b2RsMmh0bWwgdG9vbHMgYXJlIG5vIGxvbmdlciB1c2VkIGFuZCBzbyBTV0lHIG5vCiAgICAgICAgICAgIGxvbmdlciBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoZXNlIHBhY2thZ2VzIHdoaWNoIHdlcmUgcmVxdWlyZWQgd2hlbgogICAgICAgICAgICBidWlsZGluZyBmcm9tIGdpdC4KCjIwMTUtMTItMTY6IHp0dXJuZXIvY29sZWIKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbjMuNSBpbnRlcnByZXRlciBhc3NlcnRpb25zIHdoZW4gb2JqZWN0cyBhcmUgYmVpbmcKICAgICAgICAgICAgZGVsZXRlZCBkdWUgdG8gYW4gZXhpc3RpbmcgZXhjZXB0aW9uLiBNb3N0IG5vdGFibHkgaW4gZ2VuZXJhdG9ycwogICAgICAgICAgICB3aGljaCB0ZXJtaW5hdGUgdXNpbmcgYSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbi4gRml4ZXMgIzU1OSAjNTYwICM1NzMuCiAgICAgICAgICAgIElmIGEgZnVydGhlciBleGNlcHRpb24gaXMgcmFpc2VkIGR1cmluZyBhbiBvYmplY3QgZGVzdHJ1Y3Rpb24sCiAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSBpcyB1c2VkIG9uIHRoaXMgc2Vjb25kIGV4Y2VwdGlvbiBhbmQgdGhlCiAgICAgICAgICAgIG9yaWdpbmFsIGV4Y2VwdGlvbiBidWJibGVzIHRocm91Z2guCgoyMDE1LTEyLTE0OiBhaG5vbGRzL3dzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBpbiBtaXNzaW5nIGluaXRpYWxpemVycyBmb3IgdHBfZmluYWxpemUsCiAgICAgICAgICAgIG5iX21hdHJpeF9tdWx0aXBseSwgbmJfaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHksIGh0X3F1YWxuYW1lCiAgICAgICAgICAgIGh0X2NhY2hlZF9rZXlzIGFuZCB0cF9wcmV2LgoKMjAxNS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNUTCB3cmFwcGVycyB0byBub3QgZ2VuZXJhdGUgPDogZGlncmFwaHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHN0ZDo6dmVjdG9yPDo6WDo6WT4gd2FzIHNvbWV0aW1lcyBnZW5lcmF0ZWQsIG5vdwogICAgICAgICAgICBjb3JyZWN0ZWQgdG8gc3RkOjp2ZWN0b3I8IDo6WDo6WSA+LgoKMjAxNS0xMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNUTCByYW5nZXMgYW5kIHNsaWNlcyBmaXhlcy4KCiAgICAgICAgICAgIFJ1YnkgU1RMIGNvbnRhaW5lciBzZXR0aW5nIHNsaWNlcyBmaXhlczoKCiAgICAgICAgICAgIFNldHRpbmcgYW4gU1RMIGNvbnRhaW5lciB3cmFwcGVyIHNsaWNlIGJldHRlciBtYXRjaGVzIHRoZSB3YXkgUnVieQogICAgICAgICAgICBhcnJheXMgd29yay4gVGhlIGJlaGF2aW91ciBpcyBub3cgdGhlIHNhbWUgYXMgUnVieSBhcnJheXMuIFRoZSBvbmx5CiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkIHdoZW4gZXhwYW5kaW5nIGEgY29udGFpbmVyCiAgICAgICAgICAgIGNhbm5vdCBiZSBuaWwgYXMgdGhpcyBpcyBub3QgYSB2YWxpZCB0eXBlL3ZhbHVlIGZvciBDKysgY29udGFpbmVyCiAgICAgICAgICAgIGVsZW1lbnRzLgoKICAgICAgICAgICAgT2J0YWluaW5nIGEgUnVieSBTVEwgY29udGFpbmVyIHJhbmdlcyBhbmQgc2xpY2VzIGZpeGVzOgoKICAgICAgICAgICAgQWNjZXNzIHZpYSByYW5nZXMgYW5kIHNsaWNlcyBub3cgYmVoYXZlIGlkZW50aWNhbGx5IHRvIFJ1YnkgYXJyYXlzLgogICAgICAgICAgICBUaGUgZml4ZXMgYXJlIG1vc3RseSBmb3Igb3V0IG9mIHJhbmdlIGluZGljZXMgYW5kIGxlbmd0aHMuCiAgICAgICAgICAgIC0gWmVybyBsZW5ndGggc2xpY2UgcmVxdWVzdHMgcmV0dXJuIGFuIGVtcHR5IGNvbnRhaW5lciBpbnN0ZWFkIG9mIG5pbC4KICAgICAgICAgICAgLSBTbGljZXMgd2hpY2ggcmVxdWVzdCBhIGxlbmd0aCBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lcgogICAgICAgICAgICAgIG5vIGxvbmdlciBjaG9wIG9mZiB0aGUgbGFzdCBlbGVtZW50LgogICAgICAgICAgICAtIFJhbmdlcyB3aGljaCB1c2VkIHRvIHJldHVybiBuaWwgbm93IHJldHVybiBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZQogICAgICAgICAgICAgIHRoZSBzdGFydCBlbGVtZW50IGlzIGEgdmFsaWQgaW5kZXguCgogICAgICAgICAgICBSdWJ5IFNUTCBjb250YWluZXIgbmVnYXRpdmUgaW5kZXhpbmcgc3VwcG9ydCBpbXByb3ZlZC4KCiAgICAgICAgICAgIFVzaW5nIG5lZ2F0aXZlIGluZGV4ZXMgdG8gc2V0IHZhbHVlcyB3b3JrcyB0aGUgc2FtZSBhcyBSdWJ5IGFycmF5cywgZWcKCiAgICAgICAgICAgICV0ZW1wbGF0ZShJbnRWZWN0b3IpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBpdiA9IEludFZlY3Rvci5uZXcoWzEsMiwzLDRdKQogICAgICAgICAgICBpdlstNF0gPSA5ICMgPT4gWzEsMiwzLDldCiAgICAgICAgICAgIGl2Wy01XSA9IDkgIyA9PiBJbmRleEVycm9yCgoyMDE1LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBBZGQgc3RkOjphcnJheSBjb250YWluZXIgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGVzZSB3b3JrIG11Y2ggbGlrZSBhbnkgb2YgdGhlIG90aGVyIFNUTCBjb250YWluZXJzIGV4Y2VwdCBQeXRob24vUnVieSBzbGljaW5nCiAgICAgICAgICAgIGlzIHNvbWV3aGF0IGxpbWl0ZWQgYmVjYXVzZSB0aGUgYXJyYXkgaXMgYSBmaXhlZCBzaXplLiBPbmx5IHNsaWNlcyBvZgogICAgICAgICAgICB0aGUgZnVsbCBzaXplIGFyZSBzdXBwb3J0ZWQuCgoyMDE1LTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNTM5IC0gU3VwcG9ydCBQeXRob24gMy41IGFuZCAtYnVpbHRpbi4gIFB5QXN5bmNNZXRob2RzIGlzIGEgbmV3CiAgICAgICAgICAgIG1lbWJlciBpbiBQeUhlYXBUeXBlT2JqZWN0LgoKMjAxNS0xMC0wNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IGVtaXQgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYSBkaXJlY3RvcgoJICAgIGNsYXNzIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLCBzaW5jZSB0aGUgZnVuY3Rpb24gd2lsbAoJICAgIGFsd2F5cyBwYW5pYy4KCjIwMTUtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlc2hhcmVkX3B0ciBzdXBwb3J0IGZvciBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IFdhcm5pbmcgNTIwOiBEZXJpdmVkIGNsYXNzICdEZXJpdmVkJyBvZiAnQmFzZScKICAgICAgICAgICAgICBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgLSBEbyBub3QgZ2VuZXJhdGUgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGNhc3QgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluIGluIHRoZQogICAgICAgICAgICAgIHR5cGUgc3lzdGVtIHJ1bnRpbWUgaW4gc3VjaCBjYXNlcyBhcyBpdCBkb2Vzbid0IGNvbXBpbGUgYW5kIGNhbid0IGJlIHVzZWQuCiAgICAgICAgICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB3YXJuaW5nIDUyMCBmb3IgJXNoYXJlZF9wdHIgd2hlbiB0aGUgYmFzZSBjbGFzcyBpcyBpZ25vcmVkLgoKMjAxNS0xMC0wMTogdmthbGluaW4KICAgICAgICAgICAgRml4ICM1MDg6IEZpeCBzZWdmYXVsdCBwYXJzaW5nIGFub255bW91cyB0eXBlZGVmIG5lc3RlZCBjbGFzc2VzLgoKMjAxNS0wOS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFkZCBzaGFyZWRfcHRyIHN1cHBvcnQKCjIwMTUtMDktMTM6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIFJlc29sdmUgdHJhY2tpbmcgYnVnIC0gaXNzdWUgIzIyNS4KICAgICAgICAgICAgVGhlIGJ1ZyBpcyB0aGF0IHRoZSB0cmFja2luZyBjb2RlIHVzZXMgYSBydWJ5IGhhc2ggYW5kIHRodXMgbWF5CiAgICAgICAgICAgIGFsbG9jYXRlIG9iamVjdHMgKEJpZ251bSkgd2hpbGUgcnVubmluZyB0aGUgR0MuIFRoaXMgd2FzIHRvbGVyYXRlZCBpbgogICAgICAgICAgICAxLjggYnV0IGlzIGludmFsaWQgKHJhaXNlcyBhbiBleGNlcHRpb24pIGluIDEuOS4KICAgICAgICAgICAgVGhlIHBhdGNoIHVzZXMgYSBDIGhhc2ggKGFsc28gdXNlZCBieSBydWJ5KSBpbnN0ZWFkLgoKMjAxNS0wOS0wOTogbHl6ZQogICAgICAgICAgICBbQ0ZGSV0gRXh0ZW5kIHRoZSAiZXhwb3J0IiBmZWF0dXJlIGluIHRoZSBDRkZJIG1vZHVsZSB0byBzdXBwb3J0CiAgICAgICAgICAgIGV4cG9ydGluZyB0byBhIHNwZWNpZmllZCBwYWNrYWdlLgoKMjAxNS0wOS0wNDogb2xseQoJICAgIFtQeXRob25dIEZpeCBkb2NzdHJpbmdzIGZvciAlY2FsbGJhY2sgZnVuY3Rpb25zLgoKMjAxNS0wOS0wMzogZGVtaS1ybHVkZHkKICAgICAgICAgICAgW0dvXSBSZW1vdmVkIGdvbGFuZyBzdHJpbmdpbmcgZm9yIHNpZ25lZC91bnNpZ25lZCBjaGFyCgogICAgICAgICAgICBDaGFuZ2VkIGRlZmF1bHQgaGFuZGxpbmcgb2Ygc2lnbmVkIGNoYXIqIGFuZCB1bnNpZ25lZCBjaGFyKiB0byBiZQogICAgICAgICAgICBvcGFxdWUgcG9pbnRlcnMgcmF0aGVyIHRoYW4gc3RyaW5ncywgc2ltaWxhcmx5IHRvIGhvdyBvdGhlcgogICAgICAgICAgICBsYW5ndWFnZXMgd29yay4KCiAgICAgICAgICAgIEFueSBleGlzdGluZyBjb2RlIHJlbHlpbmcgb24gdHJlYXRpbmcgc2lnbmVkIGNoYXIqIG9yIHVuc2lnbmVkCiAgICAgICAgICAgIGNoYXIqIGFzIGEgc3RyaW5nIGNhbiByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3Igd2l0aCB0eXBlbWFwcy5pIGJ5CiAgICAgICAgICAgIHVzaW5nICVhcHBseSB0byBjb3B5IHRoZSBbdW5jaGFuZ2VkXSBjaGFyKiBiZWhhdmlvci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNS0wOC0wNzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIHRpZHkgLVd0YXV0b2xvZ2ljYWwtY29uc3RhbnQtb3V0LW9mLXJhbmdlLWNvbXBhcmUgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZSB1bmRlciBjbGFuZwoKMjAxNS0wOC0wNzogeGFudGFyZXMKICAgICAgICAgICAgW1B5dGhvbl0gcGVwMjU3ICYgbnVtcHlkb2MgY29uZm9ybWluZyBkb2NzdHJpbmdzOgogICAgICAgICAgICAtIE1vbm8tbGluZSBtb2R1bGUgZG9jc3N0cmluZwogICAgICAgICAgICAtIFJld3JpdGUgYXV0b2RvYyBwYXJhbWV0ZXJzIHNlY3Rpb24gaW4gbnVtcHlkb2Mgc3R5bGU6CiAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL251bXB5L251bXB5L2Jsb2IvbWFzdGVyL2RvYy9IT1dUT19ET0NVTUVOVC5yc3QudHh0CiAgICAgICAgICAgIC0gT25lIGxpbmUgc3VtbWFyeSBzaG91bGQgZW5kIHdpdGggIi4iCiAgICAgICAgICAgIC0gQWRkcyBhIGJsYW5rIGxpbmUgYWZ0ZXIgY2xhc3MgZG9jc3RyaW5nCgoyMDE1LTA4LTA1OiB2YWR6CiAgICAgICAgICAgIFtKYXZhXSBNYWtlIChjaGFyKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHVzYWJsZSBmb3IKICAgICAgICAgICAgc3RyaW5ncyBvZiBvdGhlciB0eXBlcywgZS5nLiAidW5zaWduZWQgY2hhcioiLgoKVmVyc2lvbiAzLjAuNyAoMyBBdWcgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDgtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggcG90ZW50aWFsIHNlY3VyaXR5IGV4cGxvaXQgaW4gZ2VuZXJhdGVkIEphdmEgY2xhc3Nlcy4KICAgICAgICAgICAgVGhlIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgSmF2YQogICAgICAgICAgICBjbGFzc2VzIGFyZSBub3cgZGVjbGFyZWQgJ3RyYW5zaWVudCcgYnkgZGVmYXVsdC4gRnVydGhlciBkZXRhaWxzIG9mIHRoZSBleHBsb2l0CiAgICAgICAgICAgIGluIEFuZHJvaWQgaXMgYmVpbmcgcHVibGlzaGVkIGluIGFuIGFjYWRlbWljIHBhcGVyIGFzIHBhcnQgb2YgVVNFTklYIFdPT1QgJzE1OgogICAgICAgICAgICBodHRwczovL3d3dy51c2VuaXgub3JnL2NvbmZlcmVuY2Uvd29vdDE1L3dvcmtzaG9wLXByb2dyYW0vcHJlc2VudGF0aW9uL3BlbGVzLgoKICAgICAgICAgICAgSW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgeW91IGFyZSByZWx5aW5nIG9uIHRoZXNlIG1lbWJlcnMgYmVpbmcgc2VyaWFsaXphYmxlLAogICAgICAgICAgICB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMKICAgICAgICAgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBnZW5lcmF0ZWQgY29kZS4gVGhlIHJlbGV2YW50IHR5cGVtYXBzIGFyZSBpbiB0aGUgTGliIGRpcmVjdG9yeQogICAgICAgICAgICBpbiB0aGUgamF2YS5zd2csIGJvb3N0X3NoYXJlZF9wdHIuaSBhbmQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGZpbGVzLiBDb3B5IHRoZQogICAgICAgICAgICByZWxldmFudCBkZWZhdWx0IHR5cGVtYXBzIGludG8geW91ciBpbnRlcmZhY2UgZmlsZSBhbmQgcmVtb3ZlIHRoZSAndHJhbnNpZW50JyBrZXl3b3JkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE1LTA4LTAxOiB2YWR6CiAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiBtb3JlIHVzZWZ1bDogaXQgY2FuIG5vdyBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgLS13aXRoLXh4eCBvcHRpb25zLCBhbGxvd2luZyB0byBlYXNpbHkgZW5hYmxlIGp1c3Qgb25lIG9yIHR3byBsYW5ndWFnZXMuCgoyMDE1LTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ0MCAtIEluaXRpYWxpc2UgYWxsIG5ld2x5IGNyZWF0ZWQgYXJyYXlzIHdoZW4gdXNpbmcgJWFycmF5X2Z1bmN0aW9ucyBhbmQgJWFycmF5X2NsYXNzCiAgICAgICAgICAgIGluIHRoZSBjYXJyYXlzLmkgbGlicmFyeSAtIGJ1ZyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgQysrLgoKMjAxNS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSW1wcm92ZSBpbmRlbnRhdGlvbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBmb3IgY29kZSBpbiB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVweXRob25wcmVwZW5kCiAgICAgICAgICAgICAgJXB5dGhvbmFwcGVuZAogICAgICAgICAgICAgICVweXRob25jb2RlCiAgICAgICAgICAgICAgJXB5dGhvbmJlZ2luCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpCgogICAgICAgICAgICBPbGQgZXJyb3IgZXhhbXBsZToKICAgICAgICAgICAgICBFcnJvcjogTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKGxpbmUgMyBvZiBweXRob25jb2RlKQoKICAgICAgICAgICAgTmV3IGVycm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgRXJyb3I6IExpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkIChsaW5lIDMgb2YgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCiAgICAgICAgICAgICAgYXMgbm8gbGluZSBzaG91bGQgYmUgaW5kZW50ZWQgbGVzcyB0aGFuIHRoZSBpbmRlbnRhdGlvbiBpbiBsaW5lIDEKCiAgICAgICAgICAgIE9sZCB3YXJuaW5nIGV4YW1wbGU6CiAgICAgICAgICAgICAgV2FybmluZyA3NDA6IFdoaXRlc3BhY2UgcHJlZml4IGRvZXNuJ3QgbWF0Y2ggKGxpbmUgMiBvZiAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKCiAgICAgICAgICAgIE5ldyB3YXJuaW5nIGV4YW1wbGU6CiAgICAgICAgICAgICAgV2FybmluZyA3NDA6IFdoaXRlc3BhY2UgaW5kZW50YXRpb24gaXMgaW5jb25zaXN0ZW50IGNvbXBhcmVkIHRvIGVhcmxpZXIgbGluZXMgKGxpbmUgMyBvZgogICAgICAgICAgICAgICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQoKICAgICAgICAgICAgCjIwMTUtMDctMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjNDc1LiBJbXByb3ZlIGRvY3N0cmluZyBpbmRlbnRhdGlvbiBoYW5kbGluZy4KICAgICAgICAgICAgCiAgICAgICAgICAgIFNXSUctMy4wLjUgYW5kIGVhcmxpZXIgc29tZXRpbWVzIHRydW5jYXRlZCB0ZXh0IHByb3ZpZGVkIGluIHRoZSBkb2NzdHJpbmcgZmVhdHVyZS4KICAgICAgICAgICAgVGhpcyBvY2N1cnJlZCB3aGVuIHRoZSBpbmRlbnRhdGlvbiAod2hpdGVzcGFjZSkgaW4gdGhlIGRvY3N0cmluZyB3YXMgbGVzcyBpbiB0aGUKICAgICAgICAgICAgc2Vjb25kIG9yIGxhdGVyIGxpbmVzIHdoZW4gY29tcGFyZWQgdG8gdGhlIGZpcnN0IGxpbmUuCiAgICAgICAgICAgIFNXSUctMy4wLjYgZ2F2ZSBhICdMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCcgZXJyb3IgaW5zdGVhZCBvZiB0cnVuY2F0aW5nCiAgICAgICAgICAgIHRoZSBkb2NzdHJpbmcgdGV4dC4KICAgICAgICAgICAgTm93IHRoZSBpbmRlbnRhdGlvbiBmb3IgdGhlICdkb2NzdHJpbmcnIGZlYXR1cmUgaXMgc21hcnRlciBhbmQgaXMgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBhZGp1c3RlZCBzbyB0aGF0IG5vIHRydW5jYXRpb24gb2NjdXJzLgoKMjAxNS0wNy0yMjogd3NmdWx0b24KICAgICAgICAgICAgU3VwcG9ydCBmb3Igc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24gaW4gdHlwZW1hcCBhdHRyaWJ1dGVzLiBFeGFtcGxlIHVzYWdlIGV4cGFuc2lvbgogICAgICAgICAgICBpbiB0aGUgJ291dCcgYXR0cmlidXRlIChDIyBzcGVjaWZpYyk6CgogICAgICAgICAgICAgICV0eXBlbWFwKGN0eXBlLCBvdXQ9IiQqMV9sdHlwZSIpIHVuc2lnbmVkIGludCYgIiQqMV9sdHlwZSIKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBhcyAkKjFfbHR5cGUgZXhwYW5kcyB0byAndW5zaWduZWQgaW50JzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3R5cGUsIG91dD0idW5zaWduZWQgaW50IikgdW5zaWduZWQgaW50JiAidW5zaWduZWQgaW50IgoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgd2l0aGluIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvby4gRXhhbXBsZSB1c2FnZSBleHBhbnNpb246CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgdW5zaWduZWQgaW50ICJ1aW50IgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsICQqMV9sdHlwZSkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsICQqMV9sdHlwZSkiCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgZmlyc3QgYW5kIGhlbmNlIHRoZSBhYm92ZSBpcyBlcXVpdmFsZW50IHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIgoKICAgICAgICAgICAgd2hpY2ggdGhlbiBleHBhbmRzIHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0idWludCIpIHVuc2lnbmVkIGludCYgInVpbnQiCgoyMDE1LTA3LTIyOiBsaW5kbGV5ZgoJICAgIEFwcGx5IHBhdGNoICM0MzkgLSBzdXBwb3J0IGZvciAkdHlwZW1hcCgpIChha2EgZW1iZWRkZWQgdHlwZW1hcHMgb3Igc3BlY2lhbCB2YXJpYWJsZQogICAgICAgICAgICBtYWNyb3MpIGluIHR5cGVtYXAgYXR0cmlidXRlcy4gQSBzaW1wbGUgZXhhbXBsZSB3aGVyZSAkdHlwZW1hcCgpIGlzIGV4cGFuZGVkIGluIHRoZQogICAgICAgICAgICAnb3V0JyBhdHRyaWJ1dGUgKEMjIHNwZWNpZmljKToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSB1bnNpZ25lZCBpbnQgInVpbnQiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSJ1aW50IikgdW5zaWduZWQgaW50JiAidWludCIKCjIwMTUtMDctMTg6IG03dGhvbgoJICAgIFtQeXRob25dIERvY3N0cmluZ3MgcHJvdmlkZWQgdmlhICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93IHF1b3RlZCBhbmQgYWRkZWQgdG8KICAgICAgICAgICAgdGhlIHRwX2RvYyBzbG90IHdoZW4gdXNpbmcgcHl0aG9uIGJ1aWx0aW4gY2xhc3NlcyAoLWJ1aWx0aW4pLiBXaGVuIG5vIGRvY3N0cmluZyBpcwogICAgICAgICAgICBwcm92aWRlZCwgdGhlIHRwX2RvYyBzbG90IGlzIHNldCB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGNsYXNzIG5hbWUuCiAgICAgICAgICAgIEdpdGh1YiBpc3N1ZXMgIzQ0NSBhbmQgIzQ2MS4KCjIwMTUtMDctMTc6IGt3d2V0dGUKICAgICAgICAgICAgW29jdGF2ZV0gU3VwcG9ydCBPY3RhdmUgdmVyc2lvbiA0LjAuMCAodGhhbmtzIHRvIHBhdGNoZXMgZnJvbSBPcmlvbiBQb3BsYXdza2kpLgoKMjAxNS0wNy0wNzogd3NmdWx0b24KCSAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSB3cmFwcGVyIGZvciBhIGNsYXNzJyBjb25zdHJ1Y3RvciBpZiB0aGF0IGNsYXNzIGhhcwogICAgICAgICAgICBhbnkgYmFzZSBjbGFzcyB3aXRoIGEgcHJpdmF0ZSBkZXN0cnVjdG9yLiBUaGlzIGlzIGJlY2F1c2UgeW91ciBjb21waWxlciBzaG91bGQKICAgICAgICAgICAgbm90IGFsbG93IGEgY2xhc3MgdG8gYmUgaW5zdGFudGlhdGVkIGlmIGEgYmFzZSBoYXMgYSBwcml2YXRlIGRlc3RydWN0b3IuIFNvbWUKICAgICAgICAgICAgY29tcGlsZXJzIGRvLCBzbyBpZiB5b3UgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciwgdXNlIHRoZSAibm90YWJzdHJhY3QiIGZlYXR1cmUsIGVnOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSBEZXJpdmVkOwogICAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgICAgfkJhc2UoKSB7fQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHt9OwoKVmVyc2lvbiAzLjAuNiAoNSBKdWwgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDctMDI6IHdzZnVsdG9uCgkgICAgRml4IHN5bnRheCBlcnJvciB3aGVuIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkIGlzIHVzZWQgaW4gdHlwZXMsIGVnOgoKICAgICAgICAgICAgICBzdGQ6OnRlbXBsYXRlIHZlY3RvcjxpbnQ+IHY7CgoyMDE1LTA3LTAyOiBuZ2xhZGl0egoJICAgIFtMdWFdIFB1c2ggY2hhcmFjdGVycyBhcyB1bmZvcm1hdHRlZCAxLWNoYXJhY3RlciBzdHJpbmdzIHRvIGF2b2lkCgkgICAgdW5wcmludGFibGUgY2hhcmFjdGVycyBzdWNoIGFzIChjaGFyKTEyNyBiZWluZyBjb252ZXJ0ZWQgdG8KCSAgICAiPFwxMjc+IiB3aXRoIEx1YSA1LjMgYW5kIGxhdGVyLiAgKGdpdGh1YiBQUiAjNDUyKQoKMjAxNS0wNi0yOTogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSBpbiAlcHl0aG9uY29kZS4KCgkgICAgUHJldmlvdXNseSBTV0lHIGxvb2tlZCBhdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IGxpbmUgYW5kCgkgICAgcmVtb3ZlZCB0aGF0IG1hbnkgY2hhcmFjdGVycyBmcm9tIGVhY2ggc3Vic2VxdWVudCBsaW5lLCByZWdhcmRsZXNzCgkgICAgb2Ygd2hhdCB0aG9zZSBjaGFyYWN0ZXJzIHdlcmUuICBUaGlzIHdhcyBtYWRlIHdvcnNlIGJlY2F1c2UgU1dJRydzCgkgICAgcHJlcHJvY2Vzc29yIHJlbW92ZXMgYW55IHdoaXRlc3BhY2UgYmVmb3JlIGEgJyMnLiAgRml4ZXMgZ2l0aHViCgkgICAgaXNzdWUgIzM3OSwgcmVwb3J0ZWQgYnkgSm9lIE9ydG9uLgoKMjAxNS0wNi0xMjogd3NmdWx0b24KCSAgICBbUl0gRml4ICM0MzAgLSBjYWxsIHRvIFNXSUdfY3JlYXRlTmV3UmVmIGluIGNvcHlUb0Mgd2FzIGluY29ycmVjdGx5IG5hbWVkLgoKMjAxNS0wNi0xMTogc2doaXJhdGUKCSAgICBbQyNdIFBhdGNoICM0MjcgYWRkcyBpbiBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtb3V0ZmlsZSB0byBjb21iaW5lIGFsbCB0aGUKICAgICAgICAgICAgZ2VuZXJhdGVkIEMjIGNvZGUgaW50byBhIHNpbmdsZSBmaWxlLgoKMjAxNS0wNi0wOTogd3NmdWx0b24KCSAgICBGaXggc2VnIGZhdWx0IHByb2Nlc3NpbmcgQysrMTEgdHlwZSBhbGlhc2luZy4gSXNzdWUgIzQyNC4KCjIwMTUtMDUtMjg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQWRkIG5ldyBmZWF0dXJlICJweXRob246Y2RlZmF1bHRhcmdzIiB0byBjb250cm9sIGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uLiBCeSBkZWZhdWx0LCBTV0lHIGF0dGVtcHRzIHRvIGNvbnZlcnQgQy9DKysgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMKICAgICAgICAgICAgaW50byBQeXRob24gdmFsdWVzIGFuZCBnZW5lcmF0ZXMgY29kZSBpbnRvIHRoZSBQeXRob24gbGF5ZXIgd2l0aCB0aGVzZSB2YWx1ZXMuCiAgICAgICAgICAgIFJlY2VudCB2ZXJzaW9ucyBvZiBTV0lHIGFyZSBhYmxlIHRvIGNvbnZlcnQgbW9yZSBvZiB0aGVzZSB2YWx1ZXMsIGhvd2V2ZXIsIHRoZQogICAgICAgICAgICBuZXcgYmVoYXZpb3VyIGNhbiBiZSBjaXJjdW12ZW50ZWQgaWYgZGVzaXJlZCB2aWEgdGhpcyBuZXcgZmVhdHVyZSwgc3VjaCB0aGF0CiAgICAgICAgICAgIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgQyBsYXllciBhbmQgbm90IHRoZSBQeXRob24gbGF5ZXIuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0RBIHsKICAgICAgICAgICAgICAgIGludCBmZmYoaW50IGEgPSAxLCBib29sIGIgPSBmYWxzZSk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgUHl0aG9uIGxheWVyIGlzOgoKICAgICAgICAgICAgICBjbGFzcyBDREEoX29iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBkZWYgZmZmKHNlbGYsIGE9MSwgYj1GYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRfYXJncy5DREFfZmZmKHNlbGYsIGEsIGIpCgogICAgICAgICAgICBBZGRpbmcgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246Y2RlZmF1bHRhcmdzIikgQ0RBOjpmZmY7CgogICAgICAgICAgICBSZXN1bHRzIGluOgoKICAgICAgICAgICAgICBjbGFzcyBDREEoX29iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBkZWYgZmZmKHNlbGYsICphcmdzKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdF9hcmdzLkNEQV9mZmYoc2VsZiwgKmFyZ3MpCgogICAgICAgICAgICBTb21lIGNvZGUgZ2VuZXJhdGlvbiBtb2RlcywgZWcgLWJ1aWx0aW4gYW5kIC1mYXN0cHJveHksIGFyZSB1bmFmZmVjdGVkIGJ5IHRoaXMgYXMKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhbHdheXMgb2J0YWluZWQgZnJvbSB0aGUgQyBsYXllci4KCjIwMTUtMDUtMjc6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRGVhbCB3aXRoIGFuIGludGVnZXIgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSB0eXBlZGVmIHRvIGJvb2wKCSAgICBwYXJhbWV0ZXIgaW4gdGhlIEMrKyBwcm90b3R5cGUuICBTZWUgIzMyNy4gUmVncmVzc2lvbiBmcm9tIDMuMC4wIG9ud2FyZHMuCgoyMDE1LTA1LTE5OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUgd2l0aCBNU1ZDLgoJICAgIChGaXhlcyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvcGF0Y2hlcy8zNTEvIHJlcG9ydGVkIGJ5CgkgICAgTWF0ZXVzeiBTenltYb9za2kpLgoKMjAxNS0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCB3cmFwcGluZyBzaGFyZWRfcHRyIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIAogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgdGhlICJ1bnJlZiIgZmVhdHVyZSB3aGVuIHVzZWQgb24gY2xhc3NlcyB3aXRoIHByaXZhdGUgZGVzdHJ1Y3RvcnMuCgoyMDE1LTA1LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpCiAgICAgICAgICAgIHNvIHRoYXQgdGhleSBjYW4gYmUgYXBwbGllZCB0byBhIHdpZGVyIHJhbmdlIG9mIHR5cGVzLiBGaXhlcyAjMzg1LgoKMjAxNS0wNS0wNzogb2xseQoJICAgIFtQeXRob25dIERlYWwgd2l0aCBhbiBpbnRlZ2VyIGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgYm9vbAoJICAgIHBhcmFtZXRlciBpbiB0aGUgQysrIHByb3RvdHlwZS4gIEZpeGVzIGdpdGh1YiAjMzI3LCByZXBvcnRlZCBieQoJICAgIEdyZWcgQWxsZW4uCgoyMDE1LTA1LTA3OiBMaW5kbGV5RgoJICAgIFtKYXZhXSBBbGxvdyBmZWF0dXJlKCJkaXJlY3RvciIpIGFuZCBmZWF0dXJlKCJyZWYiKSB0byBiZSB1c2VkCgkgICAgdG9nZXRoZXIuICBHaXRodWIgUFIjNDAzLgoKMjAxNS0wNS0wNTogb2xseQoJICAgIFN1cHByZXNzIHdhcm5pbmcgMzI1ICJOZXN0ZWQgY2xhc3Mgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKEZvbwoJICAgIGlnbm9yZWQpIiB3aGVuIEZvbyBoYXMgYWxyZWFkeSBiZWVuIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoICIlaWdub3JlIi4KCjIwMTUtMDUtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBmcmllbmQgdGVtcGxhdGVzLCBpbmNsdWRpbmcgb3BlcmF0b3Igb3ZlcmxvYWRpbmcgLSBmaXhlcyAjMTk2LiBDb25zaWRlcmluZwogICAgICAgICAgICB0aGUgZXhhbXBsZSBiZWxvdywgcHJldmlvdXNseSB0aGUgb3BlcmF0b3IgZ2F2ZSBhIHN5bnRheCBlcnJvciBhbmQgZnJpZW5kZnVuYyBpbmNvcnJlY3RseQogICAgICAgICAgICB3YXJuZWQgd2l0aDoKCiAgICAgICAgICAgICAiV2FybmluZyA1MDM6IENhbid0IHdyYXAgJ2ZyaWVuZGZ1bmM8KFR5cGUpPicgdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLiIKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFR5cGU+IGNsYXNzIE15Q2xhc3MgewogICAgICAgICAgICAgICAgZnJpZW5kIGludCBmcmllbmRmdW5jIDxUeXBlPihkb3VibGUgaXMsIE15Q2xhc3MgPFR5cGU+ICYgeCk7CiAgICAgICAgICAgICAgICBmcmllbmQgaW50IG9wZXJhdG9yPDwgPFR5cGU+KGRvdWJsZSB1biwgY29uc3QgTXlDbGFzcyA8VHlwZT4gJngpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGFsc28gcHJldmlvdXNseSBpbmNvcnJlY3RseSB3YXJuZWQgd2l0aDoKCiAgICAgICAgICAgICAgIldhcm5pbmcgMzAyOiBJZGVudGlmaWVyICd0ZW1wbGF0ZV9mcmllbmQnIHJlZGVmaW5lZCAoaWdub3JlZCksIgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIHRlbXBsYXRlX2ZyaWVuZChUKTsKICAgICAgICAgICAgICBzdHJ1Y3QgTXlUZW1wbGF0ZSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgVCB0ZW1wbGF0ZV9mcmllbmQoVCk7CiAgICAgICAgICAgICAgfTsKCjIwMTUtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBoYW5kbGluZyBvZiBjb252ZXJzaW9uIG9wZXJhdG9ycyB3aGVyZSB0aGUgb3BlcmF0b3IgaXMgc3BsaXQgb3ZlciBtdWx0aXBsZQogICAgICAgICAgICBsaW5lcyBvciBoYXMgY29tbWVudHMgd2l0aGluIHRoZSBvcGVyYXRvciB0eXBlLiBGaXhlcyAjNDAxLgoKICAgICAgICAgICAgQWxzbyBmaXggc2ltaWxhciBwcm9ibGVtIHdpdGggbm9ybWFsIG9wZXJhdG9ycyB3aGljaCBnYXZlIGEgc3ludGF4IGVycm9yIGlmIHNwbGl0IG92ZXIKICAgICAgICAgICAgbXVsdGlwbGUgbGluZXMgb3IgaGFkIGEgY29tbWVudCB3aXRoaW4gdGhlIG9wZXJhdG9yIGRlY2xhcmF0aW9uLgoKMjAxNS0wNC0zMDogb2xseQoJICAgIElnbm9yZSB1bmtub3duIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHdoaWNoIGFyZSBpbnNpZGUgYW4gaW5hY3RpdmUKCSAgICBjb25kaXRpb25hbCAoZ2l0aHViIGlzc3VlICMzOTQsIHJlcG9ydGVkIGJ5IERhbiBXaWxjb3gpLgoJICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAzLjAuMy4KCjIwMTUtMDQtMjc6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICJkZWZhdWx0IiB0eXBlbWFwIHVzZWQgYWZ0ZXIgYW4gYXJndW1lbnQgd2l0aCAibnVtaW5wdXRzPTAiICgjMzc3KS4KCjIwMTUtMDQtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjU2LiBDb2RlIGdlbmVyYXRlZCB3aXRoICctYnVpbHRpbiAtbW9kZXJuYXJncycgc2VnZmF1bHRzIGZvciBhbnkKICAgICAgICAgICAgbWV0aG9kIHRha2luZyB6ZXJvIGFyZ3VtZW50cy4KCiAgICAgICAgICAgIEFsc28gZml4ZXM6ICJTeXN0ZW1FcnJvcjogZXJyb3IgcmV0dXJuIHdpdGhvdXQgZXhjZXB0aW9uIHNldCIgZHVyaW5nIGVycm9yIGNoZWNraW5nCiAgICAgICAgICAgIHdoZW4gdXNpbmcganVzdCAtYnVpbHRpbiBhbmQgdGhlIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIGlzIHBhc3NlZCB0byBhIGNsYXNzCiAgICAgICAgICAgIG1ldGhvZCBleHBlY3RpbmcgemVybyBhcmd1bWVudHMuCgoyMDE1LTA0LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMzODYgLSBNZW1vcnkgbGVhayBmaXggaW4gKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMuCgoyMDE1LTA0LTIzOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIE1ha2UgImRlZmF1bHQiIHR5cGVtYXAgd29yayBhZ2FpbiAoIzMzMCwgIzM3NykuCgoyMDE1LTA0LTIzOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgdXNlIG9mIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcG9pbnRlciB0eXBlcyAoIzM2NSwgIzM3NikuCgoyMDE1LTA0LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJ21ha2UgY2hlY2stY2NhY2hlJyB3aGljaCBpcyBwYXJ0IG9mICdtYWtlIGNoZWNrJyB3aGVuIG9uZSBvZiB0aGUgQ0NBQ0hFXwogICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGZvciBleGFtcGxlIENDQUNIRV9ESVNBQkxFLCBpcyBzZXQuCgoyMDE1LTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBDbGVhcmVyIHdhcm5pbmcgbWVzc2FnZSBmb3IgYmFkbHkgY29uc3RydWN0ZWQgdHlwZWNoZWNrIHR5cGVtYXBzLiBGb3IgZXhhbXBsZSwgd2FzOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzogV2FybmluZyA0Njc6IE92ZXJsb2FkZWQgZm9vKGludCkgbm90IHN1cHBvcnRlZCAobm8gdHlwZSBjaGVja2luZwogICAgICAgICAgICAgIHJ1bGUgZm9yICdpbnQnKS4KCiAgICAgICAgICAgIE5vdzoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgNDY3OiBPdmVybG9hZGVkIGZvbyhpbnQpIG5vdCBzdXBwb3J0ZWQgKGluY29tcGxldGUgdHlwZSBjaGVja2luZwogICAgICAgICAgICAgIHJ1bGUgLSBubyBwcmVjZWRlbmNlIGxldmVsIGluIHR5cGVjaGVjayB0eXBlbWFwIGZvciAnaW50JykuCgoyMDE1LTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMzNTMgLSBMaW5rZXIgbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiAnRXhjZXB0aW9uTWF0Y2hlcycgd2hlbgogICAgICAgICAgICB1c2luZyBkaXJlY3RvcnMgYW5kIG11bHRpcGxlIG1vZHVsZXMuCgoyMDE1LTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNZXJnZSAjMzIwIC0gTWFrZSBfX2RpY3RfXyBhY2Nlc3NpYmxlIGZvciBQeXRob24gYnVpbHRpbiBjbGFzc2VzLgoKMjAxNS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNzUgLSBwYXJzaW5nIG9mIGV4dGVybiAiQyIgYW5kIHR5cGVkZWYgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgZXh0ZXJuICJDIiB0eXBlZGVmIHZvaWQgKCpIb29rMl90KShpbnQsIGNvbnN0IGNoYXIgKik7CiAgICAgICAgICAgICAgZXh0ZXJuICJDIiB0eXBlZGVmIGludCBJbnRlZ2VyOwoKMjAxNS0wMy0xMjogb2xseQoJICAgIC1EU1dJR19ESVJFQ1RPUl9TVEFUSUMgaXMgbm93IHN1cHBvcnRlZCBmb3IgYWxsIGxhbmd1YWdlcyB3aXRoCgkgICAgZGlyZWN0b3Igc3VwcG9ydCwgbm90IG9ubHkgUHl0aG9uIGFuZCBQSFAuCgoyMDE1LTAzLTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIC1jZ28gb3B0aW9uLCByZXF1aXJlZCBmb3IgR28gdmVyc2lvbnMgMS41IGFuZAoJICAgIGxhdGVyLgoKMjAxNS0wMi0yNjogb2xseQoJICAgIEZpeCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiB0b3A9PU5VTEwsIGludHJvZHVjZWQgYnkgbmVzdGVkIGNsYXNzCgkgICAgaGFuZGxpbmcgKHJlcG9ydGVkIGluIGlzc3VlIzM0NiBieSBQYXdlvyBUb211bGlrKS4KCjIwMTUtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHdWlsZV0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdoZW4KICAgICAgICAgICAgZGVmaW5lZCBhbmQgZGVjbGFyZWQgaW5saW5lLgoKMjAxNS0wMi0wOTogbWlzaGFzCiAgICAgICAgICAgIFtHb10gRml4ICVpbXBvcnQgb2YgZmlsZXMgaW4gc3ViIGRpcmVjdG9yaWVzLgoKMjAxNS0wMi0wNTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBJZ25vcmUgR28gc3BlY2lmaWMgdHlwZSBtYXBzIChnb2luLCBnb291dCwgZXRjLikgaWYgdGhleSBhcmUgZW1wdHkuCgoyMDE1LTAyLTA1OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIEdlbmVyYXRlZCBHbyBjb2RlIG5vIGxvbmdlciBjYWxscyBfc3dpZ19nb2FsbG9jYXRlIG9yCiAgICAgICAgICAgIF9zd2lnX21ha2Vnb3N0cmluZywgYXMgdGhleSB3aWxsIG5vIGxvbmdlciB3b3JrIGFzIG9mIEdvIDEuNS4KClZlcnNpb24gMy4wLjUgKDMxIEphbiAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gLWNsYXNzaWMgYW5kIHByb3BlcnR5IHNldHRpbmcuIFNldHRpbmcgcHJvcGVydGllcyBvbiBjbGFzc2ljIGNsYXNzZXMKICAgICAgICAgICAgd2FzIGJyb2tlbiBpbiBzd2lnLTMuMC4zIGJ5IGF0dGVtcHRpbmcgdG8gdXNlIF9fc2V0YXR0cl9fLiBUaGlzIHJlZ3Jlc3Npb24gaXMgZml4ZWQgbm93CiAgICAgICAgICAgIGJ5IHVzaW5nIF9fZGljdF9fIGFnYWluIHdoZW4gdXNpbmcgLWNsYXNzaWMuCiAgICAgICAgICAgIEZpeGVzIHBhdGNoICMyMzIuCgoyMDE1LTAxLTI3OiBzbWFyY2hldHRvCgkgICAgW1NjaWxhYl0gU3VwcG9ydCBmb3IgdGhlIFNjaWxhYiBsYW5ndWFnZSBoYXMgYmVlbiBhZGRlZAoKMjAxNS0wMS0yMzogb2xseQoJICAgIFtQSFBdIFdoZW4gd3JhcHBpbmcgYSByZXR1cm5lZCByZXNvdXJjZSBhcyBhbiBvYmplY3QsIGNoZWNrIGlmIGFsbAoJICAgIGNhc2VzIHdyYXAgaXQgaW4gdGhlIHNhbWUgY2xhc3MsIGFuZCBpZiBzbyBlbGltaW5hdGUgdGhlIHBvaW50bGVzcwoJICAgIHN3aXRjaCBzdGF0ZW1lbnQgd3JhcHBlciB3ZSBwcmV2aW91c2x5IGdlbmVyYXRlZC4KCjIwMTUtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIE1lcmdlIHBhdGNoICMyOTcgZm9yIFNGIGJ1ZyAjMTI3NyAtIE9jdGF2ZSBzaGFyZWRfcHRyIHN1cHBvcnQKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1lcmdlIHBhdGNoICMyNTAgLSBGaXhlcyBmb3IgdXNpbmcgJWNvbnN0YW50IGFuZCBvYmplY3RzIChub24tcHJpbWl0aXZlIHR5cGVzKQoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIEdvXSBNZXJnZSBwYXRjaCAjMzA4IGFuZCBmaXggIzMwNyAtIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW0gc3VwcG9ydAogICAgICAgICAgICBpbiBkaXJlY3RvcnMKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNlY29uZCBmaXggZm9yICMyOTQgIzI5NiAtIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBTV0lHLTMuMC4zIHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMsIHRoaXMgdGltZSB3aGVuIHVzaW5nIGt3YXJncy4KClZlcnNpb24gMy4wLjQgKDE0IEphbiAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDEtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgaW4gZGlyZWN0b3IgdXBjYWxsIGNoZWNrIHdoZW4gdXNpbmcgUEhQIGJ1aWx0IHdpdGgKCSAgICBaVFMgZW5hYmxlZC4gIEZpeGVzICMxNTUsIHJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZS4KCjIwMTUtMDEtMTI6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTQgIzI5NiAtIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBTV0lHLTMuMC4zIHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuIEludmFsaWQgb3IgbWlzc2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyB3ZXJlIHNvbWV0aW1lcyBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgcHl0aG9uIGxheWVyLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEFsbG93IEMrKzExICJleHBsaWNpdCBjb25zdGV4cHIiLiAgRml4ZXMgZ2l0aHViIGlzc3VlICMyODQgcmVwb3J0ZWQKCSAgICBieSBQYXdlbCBUb211bGlrLiAgQWxzbyBoYW5kbGUgImNvbnN0ZXhwciBleHBsaWNpdCIgYW5kICJjb25zdGV4cHIKCSAgICBzdGF0aWMiLgoKMjAxNS0wMS0wODogb2xseQoJICAgIFdoZW4gcmVwb3J0aW5nIGFuIGVycm9yIGZvciBhIGNvbnN0cnVjdCB3aGljaCBoYXNuJ3QgYmVlbgoJICAgIHRlcm1pbmF0ZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQsIHJlcG9ydCBpdCBhdCB0aGUKCSAgICBzdGFydCBsaW5lIHJhdGhlciB0aGFuICJFT0YiIGFzIHRoZW4gdG9vbHMgbGlrZSBlZGl0b3JzIGFuZCBJREVzCgkgICAgd2lsbCB0YWtlIHlvdSB0byBhIGdlbmVyYWxseSBtb3JlIHVzZWZ1bCBwbGFjZSBmb3IgZml4aW5nIHRoZQoJICAgIHByb2JsZW0uCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgSW1wcm92ZSBlcnJvciBtZXNzYWdlcyBmb3IgYSBmZXcgY2FzZXMgd2hpY2ggcHJldmlvdXNseSBnYXZlIHRoZQoJICAgIG9uZSBvZiB0aGUgY3J5cHRpYyBjYXRjaC1hbGwgZXJyb3JzICJTeW50YXggZXJyb3IgaW4gaW5wdXQiLgoKMjAxNS0wMS0wODogb2xseQoJICAgIFByb3ZpZGUgLWNwcGV4dCBhcyBhIGdlbmVyYWwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3Igc2V0dGluZyB0aGUKCSAgICBleHRlbnNpb24gdXNlZCBmb3IgZ2VuZXJhdGVkIEMrKyBmaWxlcyAocHJldmlvdXNseSBpdCB3YXMgc3BlY2lmaWMKCSAgICB0byB0aGUgUEhQIGJhY2tlbmQpLiAgRGVwcmVjYXRlIHRoZSBlcXVpdmFsZW50IC1zdWZmaXggb3B0aW9uCgkgICAgcHJvdmlkZWQgYnkgdGhlIE9jYW1sIGJhY2tlbmQsIGJ1dCBjb250aW51ZSB0byBzdXBwb3J0IHRoYXQgZm9yCgkgICAgbm93LgoKVmVyc2lvbiAzLjAuMyAoMzAgRGVjIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0xMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODAgLSBhYm9ydCB1c2luZyBhbGwgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGhpbiBvdGhlciB0ZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzLgoKMjAxNC0xMi0yNzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIElzc3VlICMyODIgcGVybDUgYXJjaGxpYiB2cyBhcmNobGliZXhwCiAgICAgICAgICAgIFtQZXJsXSB0aWR5ICJ3YXJuaW5nOiBkdXBsaWNhdGUgJ2V4dGVybicgZGVjbGFyYXRpb24gc3BlY2lmaWVyIiB3aGVuIGJ1aWxkaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIGNsYW5nCgoyMDE0LTEyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgJWNvbnN0YW50IGFuZCBzdHJ1Y3RzL2NsYXNzZXMgLSBpc3N1ZSAjMjcyCgoyMDE0LTEyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0NSAtIHJlZ3Jlc3Npb24gKHNpbmNlIHN3aWctMy4wLjApIGluIHRlbXBsYXRlZCBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFRlbXBsYXRlZCBjb25zdHJ1Y3RvcnMgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCAtIHRoZXkgd2VyZSBpbmNvcnJlY3RseSBpZ25vcmVkIHdpdGggYSB3YXJuaW5nIDUwNDoKICAgICAgICAgICAgIkZ1bmN0aW9uOiB4eXogbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUuIElnbm9yZWQuIgoKMjAxNC0xMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW1lcmF0aW9ucy4KCjIwMTQtMTEtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggbXVsdGlwbHkgZGVmaW5lZCBlcnJvciB3aGVuIHVzaW5nICVyZW5hbWUgb2YgZW51bSBpdGVtcyB3aGVuIHVzaW5nIHRoZSAic2ltcGxlIGVudW0iCiAgICAgICAgICAgIHdyYXBwZXJzLgoKMjAxNC0xMC0yODogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjAxIFRoZSBnZW5lcmF0ZWQgLnB5IGZpbGUgbm8gbG9uZ2VyIHVzZXMgKmFyZ3MgZm9yIGFsbCBQeXRob24gcGFyYW1ldGVycy4KICAgICAgICAgICAgSW5zdGVhZCwgdGhlIHBhcmFtZXRlcnMgYXJlIG5hbWVkIHVzaW5nIHRoZSBDKysgcGFyYW1ldGVyIG5hbWVzLgoKICAgICAgICAgICAgImNvbXBhY3RkZWZhdWx0YXJncyIgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCB0byByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3VyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE0LTEwLTI0OiB0aW1vdGhlZWNvdXIKICAgICAgICAgICAgW0RdIFBhdGNoICMyMDQgVXNlIGNvcmUuYXRvbWljLmF0b21pY09wIHRvIG11dGF0ZSBzaGFyZWQgdmFyaWFibGVzCgoyMDE0LTEwLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaXNzdWUgIzI0MiAtIFVzZSBvZiB0aGUgImt3YXJncyIgZmVhdHVyZSBubyBsb25nZXIgYXV0b21hdGljYWxseSB0dXJucyBvbiB0aGUKICAgICAgICAgICAgImNvbXBhY3RkZWZhdWx0YXJncyIgZmVhdHVyZSBpZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGRvZXMgbm90IHN1cHBvcnQga3dhcmdzLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhZmZlY3RzIGFsbCBsYW5ndWFnZXMgZXhjZXB0IFB5dGhvbiBhbmQgUnVieS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMTAtMTA6IGRpb3JjZXR5CiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMzIgRml4IHByb3BlcnR5IGFjY2VzcyB1c2luZyBkaXJlY3RvcnMKCjIwMTQtMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIHdoZW4gdXNpbmcgLWJ1aWx0aW4gYW5kIHN0ZDo6dmVjdG9yL3N0ZDo6bGlzdCB3cmFwcGVycyB0byBhbGxvdyBkZWxldGlvbgogICAgICAgICAgICBvZiBzaW5nbGUgZWxlbWVudHMsIHN1Y2ggYXMgJ2RlbCB2ZWNbMF0nLgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzIxNiBieSBSaWNoaWU3NjUgLSBBZGRlZCBzdXBwb3J0IGZvciBtYW55IHZlcnNpb25zIG9mIHY4IGphdmFzY3JpcHQuCgoyMDE0LTA5LTMwOiBvbGl2ZXJiCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBNZXJnZSBwYXRjaCAjMTk1IGJ5IHppdHRpeCAtIEZpeGVkIEpTQ2xhc3NSZWYgZGVjbGFyYXRpb24gbm90IHVzaW5nIHRoZSBzdGF0aWMgb25lLgoKMjAxNC0wOS0zMDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEluIGNvbmZpZ3VyZSBzY3JpcHQsIHJlcXVpcmUgR28gMS4xIG9yIGxhdGVyLgoKMjAxNC0wOS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwNyAtIEZpeCBObyBtb2R1bGUgZXJyb3Igd2l0aCAtcmVsYXRpdmVpbXBvcnQgd2hlbiB1c2luZyBzaW5nbGUKICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW1wb3J0LgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzIwOCAtIEluaXRpYWxpc2UgbmV3bHkgY3JlYXRlZCBhcnJheSB3aGVuIHVzaW5nIGFycmF5X2Z1bmN0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2FycmF5cy5pIGxpYnJhcnkgKEMrKyB1c2FnZSkuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzE4NyAtIEZpeCBjcmFzaCBvbiBzaHV0ZG93biBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBpZiBtb3JlIHRoYW4gb25lCiAgICAgICAgICAgIG1vZHVsZSB3YXMgbG9hZGVkIGF0IGEgdGltZSB3aGVuIGRhdGEgaXMgYmVpbmcgc2hhcmVkIGJldHdlZW4gbW9kdWxlcy4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTY4IC0gRml4IGxlYWsgaW4gSmF2YSBkaXJlY3RvciBzdHJpbmcgaGFuZGxpbmcgYWZ0ZXIgdGhlIEphdmEKICAgICAgICAgICAgdXBjYWxsIHdoZW4gY2FsbGVkIGZyb20gYSBuYXRpdmUgdGhyZWFkLgoKMjAxNC0wOS0yNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkanVzdCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggdXBjb21pbmcgR28gMS40CgkgICAgcmVsZWFzZS4KCjIwMTQtMDktMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBwYXRjaCBmcm9tIFRob21hcyBNYXNsYWNoIHRvIGZpeCBjcmFzaCBpbiB3cmFwcGVycyB3aGVuIHVzaW5nIC10aHJlYWRzIGluCiAgICAgICAgICAgIHRoZSBTVEwgaXRlcmF0b3JzIChTd2lnUHlJdGVyYXRvciBkZXN0cnVjdG9yKS4KCjIwMTQtMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIyOSBmcm9tIGNvbnRyZSAtIEFkZCBib29sIGFycmF5IHR5cGVzIHRvIGFycmF5c19jc2hhcnAuaQoKMjAxNC0wOS0xMjogb2xseQoJICAgIFtQSFBdIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFueSBQSFAgaW50ZXJmYWNlcyBhIHdyYXBwZWQgY2xhc3MKCSAgICBpbXBsZW1lbnRzLCBlLmcuOiAldHlwZW1hcCgicGhwaW50ZXJmYWNlcyIpIE15SXRlcmF0b3IgIkl0ZXJhdG9yIgoKMjAxNC0wOS0xMTogb2xseQoJICAgIFtQSFBdIEZpeCB0aHJvd2luZyBhIFBIUCBleGNlcHRpb24gdGhyb3VnaCBDKysgZnJvbSBhIHN1YmNsYXNzZWQKCSAgICBkaXJlY3RvciBtZXRob2QgLSBQSFAgTlVMTCBnZXRzIHJldHVybmVkIGJ5IHRoZSBzdWJjbGFzc2VkIG1ldGhvZAoJICAgIGluIHRoaXMgY2FzZSwgc28gdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXAgbmVlZHMgdG8gYWxsb3cgdGhhdCAoYXQKCSAgICBsZWFzdCBpZiBhbiBleGNlcHRpb24gaXMgYWN0aXZlKS4KCjIwMTQtMDktMDk6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgZ29hcmdvdXQgdHlwZW1hcC4KCjIwMTQtMDktMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnbWVudGF0aW9uIGZhdWx0cyB3aXRoIGRpcmVjdG9ycyBpbiBQSFAgPj0gNS40LCBhbmQKCSAgICByZWVuYWJsZSBydW5tZSB0ZXN0cyBmb3IgZGlyZWN0b3JfYmFzaWMgdGVzdGNhc2UuICBGaXggZnJvbQoJICAgIHBhdmVsLWNoYXJ2YXQgaW4gaXNzdWUjMTY0LgoKMjAxNC0wOS0wNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBpbXR5cGUsIGdvaW4sIGdvb3V0LCBnb2RpcmVjdG9yaW4sIGFuZAoJICAgIGdvZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHRvIHN1cHBvcnQgd3JpdGluZyBHbyBjb2RlIHRvCgkgICAgY29udmVydCBiZXR3ZWVuIHR5cGVzLgoKMjAxNC0wOS0wMjogb2xseQoJICAgIFtQeXRob25dIEZpeCByZWdyZXNzaW9uIGluIGluZGVudGF0aW9uIG9mIHB5dGhvbiBjb2RlIHByb2R1Y2VkIHdpdGgKCSAgICAtbW9kZXJuLCBpbnRyb2R1Y2VkIGJ5IGNoYW5nZXMgaW4gIzE4OC4gIFJlcG9ydGVkIGJ5IGZhYmllbmNhc3RhbgoJICAgIGluICMyMTguCgoyMDE0LTA5LTAxOiBvbGx5CgkgICAgSXNzdWUgYW4gZXJyb3IgZm9yIHVua25vd24gU1dJRyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcywgcmF0aGVyCgkgICAgdGhhbiBxdWlldGx5IGlnbm9yaW5nIHRoZW0uICBSZXBvcnRlZCBieSBqcmhlbHNleSBpbiBpc3N1ZSMyMTcuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTA4LTE1OiB0YWxieQogICAgICAgICAgICBbUGVybF0gSW5jbHVkZSBndWFyZCBmaXggZm9yIG5lc3RlZCBtb2R1bGVzIGZyb20gQW50aG9ueSBIZWFkaW5nIChTRiBQYXRjaCAjMzUwKS4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIwMCBmcm9tIGdwZXRyb3UgLSBDaGFuZ2VkIENTaGFycCBsaWNlbnNlIGhlYWRlciB0byBpbmNsdWRlIGF1dG8tZ2VuZXJhdGVkCiAgICAgICAgICAgIHRhZyBzbyB0aGF0IFN0eWxlQ29wIGlnbm9yZXMgdGhlIGZpbGVzLgoKMjAxNC0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1lcmdlIHBhdGNoICMxOTggZnJvbSBZdXZhbCBLYXNodGFuIC0gU3VwcG9ydCBmb3IgamF2YS5uaW8uQnl0ZUJ1ZmZlciBtYXBwaW5nIHRvCiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBpbiB2YXJpb3VzLmkgaW4gTklPQlVGRkVSIHR5cGVtYXBzLgoKMjAxNC0wNy0xNDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIENoYW5nZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byB1c2Ugdm9pZCAqLCBub3QgdWludDgsIHNvCgkgICAgdGhhdCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwb3NzaWJseSBjb250YWluaW5nCgkgICAgcG9pbnRlcnMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgMS4zIGdhcmJhZ2UgY29sbGVjdG9yCgkgICAgZG9lcyBub3QgY29sbGVjdCBwb2ludGVycyBwYXNzZWQgdG8gQysrIGNvZGUuCgoyMDE0LTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICMxMzc1IC0gRXhwYW5zaW9uIG9mIHRoZSAkcGFyZW50Y2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgaW5jb3JyZWN0bHkgY29udGFpbnMKICAgICAgICAgICAgYnJhY2tldHMgaW4gdGhlIGV4cGFuZGVkIG5hbWUuCgpWZXJzaW9uIDMuMC4yICg0IEp1biAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wNi0wMjogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIFB1bGwgcmVxdWVzdCAjMTc2OgogICAgICAgICAgICBJZiBjbGFzcyBoYXMgbm8gX19lcSBpbXBsZW1lbnRlZCwgdGhlbiBkZWZhdWx0IF9fZXEgaXMgZ2VuZXJhdGVkLiAKICAgICAgICAgICAgRGVmYXVsdCBfX2VxIGNvbXBhcmVzIGFjdHVhbCBwb2ludGVycyBzdG9yZWQgaW5zaWRlIEx1YSB1c2VyZGF0YS4KCjIwMTQtMDYtMDI6IHZrYWxpbmluCiAgICAgICAgICAgIEZpeCAjMTgzIC0gJWV4dGVuZCBhbmQgdW5uYW1lZCBuZXN0ZWQgc3RydWN0cwoKMjAxNC0wNS0yODoga3d3ZXR0ZQogICAgICAgICAgICBGaXggaW5zdGFsbCBmYWlsdXJlIHdoZW4gdXNpbmcgYW4gJ291dCBvZiBzb3VyY2UnIGJ1aWxkIHVzaW5nIHRoZSBzaGlwcGVkCiAgICAgICAgICAgIHRhcmJhbGwgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuMS4KCjIwMTQtMDUtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIGRlcHJlY2F0ZWQgLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lIGFyZ3VtZW50cwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKVmVyc2lvbiAzLjAuMSAoMjcgTWF5IDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wNS0yNTogaGZhbGNpYwoJICAgIFtQeXRob25dIFB5dGhvbiAzIGJ5dGUgc3RyaW5nIG91dHB1dDogdXNlIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIgogICAgICAgICAgICBpZiBhdmFpbGFibGUgb24gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHRoYXQncyBpbiB1c2UuIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgb3JpZ2luYWwgYnl0ZSBzdHJpbmcgKGFuZCBwb3RlbnRpYWxseSB0cnlpbmcgYSBmYWxsYmFjawogICAgICAgICAgICBlbmNvZGluZykgaWYgdGhlIGJ5dGVzIGNhbid0IGJlIGRlY29kZWQgYXMgVVRGLTguCgogICAgICAgICAgICBQcmV2aW91c2x5LCBhIFVuaWNvZGVEZWNvZGVFcnJvciB3b3VsZCBiZSByYWlzZWQgd2l0aCBubyB3YXkgdG8gdHJlYXQKICAgICAgICAgICAgdGhlIGRhdGEgYXMgYnl0ZXMgb3IgdHJ5IGFub3RoZXIgY29kZWMuCgoyMDE0LTA1LTE4OiB2a2FsaW5pbgoJICAgIEJ1ZyAjMTc1IC0gUmVzdG9yZSAlZXh0ZW5kIHRvIHdvcmsgZm9yIHVubmFtZWQgbmVzdGVkIHN0cnVjdHVyZXMgYnkgdXNpbmcgYSBDCiAgICAgICAgICAgIHN5bWJvbCBjb21wcmlzaW5nIHRoZSBvdXRlciBzdHJ1Y3R1cmUgbmFtZSBhbmQgdW5uYW1lZCB2YXJpYWJsZSBpbnN0YW5jZSBuYW1lLgoKMjAxNC0wNS0xNToga3d3ZXR0ZQoJICAgIEFkZCAjMTY2IC0gJ21ha2UgY2hlY2snIG5vdyB3b3JrcyBvdXQgb2Ygc291cmNlLiBUaGlzIHJlcXVpcmVkIHRoZSBleGFtcGxlcyB0byBidWlsZAogICAgICAgICAgICBvdXQgb2Ygc291cmNlLiBUaGUgbWFpbiBsYW5ndWFnZXMgaGF2ZSBiZWVuIHRlc3RlZCAtIEMjLCBHbywgR3VpbGUsIEphdmEsIEphdmFzY3JpcHQsCiAgICAgICAgICAgIEx1YSwgT2N0YXZlLCBQZXJsLCBQSFAsIFB5dGhvbiwgUnVieSBhbmQgVGNsLgoKMjAxNC0wNS0wMTogT2xpdmVyIEJ1Y2h0YWxhCgkgICAgSmF2YXNjcmlwdCBzdXBwb3J0IGFkZGVkLCBzZWUgSmF2YXNjcmlwdCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAxNC0wNS0wMTogb2xseQoJICAgIFtQSFBdIFRoZSBnZW5lcmF0ZWQgX19pc3NldCgpIG1ldGhvZCBub3cgcmV0dXJucyB0cnVlIGZvciByZWFkLW9ubHkgcHJvcGVydGllcy4KCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgW0dvXSBGaXggZ28gLi9jb25maWd1cmUgcGFyc2luZyBvZiBnY2NnbyAtLXZlcnNpb24sIGFuZAogICAgICAgICAgICBnb3J1bnRpbWUuc3dnIHR5cG8gaW4gX19HTlVDX1BBVENITEVWRUxfXyAoU0YgQnVnICMxMjk4KQoKMjAxNC0wNC0yNDoga3d3ZXR0ZQogICAgICAgICAgICBGaXgge3B5dGhvbnxwZXJsNXxydWJ5fHRjbH0vamF2YSBleGFtcGxlcwoKICAgICAgICAgICAgSW4gTGliL2djai9jbmkuaSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBuZXdlciBnY2ogdmVyc2lvbnM6CgogICAgICAgICAgICAtIHJlbW92ZSBKdkFsbG9jT2JqZWN0KCkgd2hpY2ggZ2NqIG5vIGxvbmdlciBkZWZpbmVzLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNC0wNC0xNiAgQnJ5Y2UgTWNLaW5sYXkgIDxtY2tpbmxheUByZWRoYXQuY29tPgogICAgICAgICAgICAgICAgKiBnY2ovY25pLmggKEp2QWxsb2NPYmplY3QpOiBSZW1vdmUgdGhlc2Ugb2Jzb2xldGUsCiAgICAgICAgICAgICAgICB1bmRvY3VtZW50ZWQgQ05JIGNhbGxzLgoKICAgICAgICAgICAgLSBjaGFuZ2UgSnZDcmVhdGVKYXZhVk0oKSBhcmd1bWVudCBmcm9tIHZvaWQqIHRvIEp2Vk1Jbml0QXJncyosIGZyb20gZ2NqIENoYW5nZWxvZzoKICAgICAgICAgICAgICAyMDA1LTAyLTIzICBUaG9tYXMgRml0enNpbW1vbnMgIDxmaXR6c2ltQHJlZGhhdC5jb20+CiAgICAgICAgICAgICAgUFIgbGliZ2NqLzE2OTIzCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgKEp2Q3JlYXRlSmF2YVZNKTogRGVjbGFyZSB2bV9hcmdzIGFzIEp2Vk1Jbml0QXJncyogcmF0aGVyIHRoYW4gdm9pZCouCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTA0LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiBCdWcgIzEzNjYgLSBSZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBvZiBzdHJ0b2ltYXggYW5kIHN0cnRvdW1heCBpbiBpbnR0eXBlcy5pCgoyMDE0LTA0LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRW51bXMgd2hpY2ggaGF2ZSBiZWVuIGlnbm9yZWQgdmlhICVpZ25vcmUgYW5kIGFyZSBzdWJzZXF1ZW50bHkKICAgICAgICAgICAgdXNlZCBhcmUgaGFuZGxlZCBzbGlnaHRseSBkaWZmZXJlbnRseS4gVHlwZSB3cmFwcGVyIGNsYXNzZXMgYXJlIG5vdyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGEgd3JhcHBlciBvZiBhbiBlbXB0eSBlbnVtLiBQcmV2aW91c2x5IGluIEphdmEgdW5jb21waWxhYmxlCiAgICAgICAgICAgIGNvZGUgd2FzIGdlbmVyYXRlZCBhbmQgaW4gQyMgYW4gaW50IHdhcyB1c2VkLgoKMjAxNC0wNC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHJlZ3Jlc3Npb24gaW4gMy4wLjAgd2hlcmUgbGVnYWwgY29kZSBmb2xsb3dpbmcgYW4gb3BlcmF0b3I8PCBkZWZpbml0aW9uIG1pZ2h0CiAgICAgICAgICAgIGdpdmUgYSBzeW50YXggZXJyb3IuIFNGIEJ1ZyAjMTM2NS4KCjIwMTQtMDQtMDM6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgZGlyZWN0b3IgY29uc3RydWN0b3JzIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4KCjIwMTQtMDQtMDI6IG9sbHkKCSAgICBbUEhQXSBQYXNzIHRoZSBaVFMgY29udGV4dCB3ZSBhbHJlYWR5IGhhdmUgdG8gYXZvaWQgbmVlZGluZyB0bwoJICAgIGNhbGwgVFNSTUxTX0ZFVENILCB3aGljaCBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZS4KCjIwMTQtMDQtMDI6IG9sbHkKCSAgICBbUEhQXSBQYXNzIFpUUyBjb250ZXh0IHRocm91Z2ggdG8gdF9vdXRwdXRfaGVscGVyKCkgc28gaXQgd29ya3MKCSAgICB3aXRoIGEgWlRTLWVuYWJsZWQgYnVpbGQgb2YgUEhQLiAgUmVwb3J0ZWQgYnkgUGllcnJlIExhYmFzdGllIGluCgkgICAgZ2l0aHViIFBSIzE1NS4KCjIwMTQtMDMtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjIEQgR29dIEZpeGVzIGZvciBDIGVudW1zIHVzZWQgaW4gYW4gQVBJIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bQogICAgICAgICAgICBoYXMgbm90IGJlZW4gcGFyc2VkLiBGb3IgRCwgdGhpcyBmaXhlcyBhIHNlZ2ZhdWx0IGluIFNXSUcuIFRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgbm93IHByb2R1Y2UgY29kZSB0aGF0IGNvbXBpbGVzLCBhbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bSBpcyBuZWVkZWQKICAgICAgICAgICAgaW4gb3JkZXIgdG8gdXNlIHRoZSBlbnVtIHByb3Blcmx5IGZyb20gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTQtMDMtMjM6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBGaXggZm9yIHVzYWdlIG9mIHNucHJpbnRmIGluIEx1YSBydW50aW1lIHdoaWNoIFZpc3VhbCBTdHVkaW8gZG9lcyBub3QgaGF2ZS4KClZlcnNpb24gMy4wLjAgKDE2IE1hciAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgaW5pdGlhbGx5IGRldmVsb3BlZCBhcyBDKysweCBzdXBwb3J0IGJ5IE1hdGV2eiBKZWtvdmVjIGFzIGEgR29vZ2xlIFN1bW1lciBvZiBDb2RlCiAgICAgICAgICAgIHByb2plY3QgaGFzIGJlZW4gZnVydGhlciBleHRlbmRlZC4gVGhlIEMrKzExIHN1cHBvcnQgaXMgY29tcHJlaGVuc2l2ZSwgYnV0IGJ5IG5vIG1lYW5zIGNvbXBsZXRlCiAgICAgICAgICAgIG9yIHdpdGhvdXQgbGltaXRhdGlvbnMuIEZ1bGwgZGV0YWlscyBmb3IgZWFjaCBuZXcgZmVhdHVyZSBpbiBDKysxMSBpcyBjb3ZlcmVkIGluIHRoZQogICAgICAgICAgICBDUGx1c1BsdXMxMS5odG1sIGNoYXB0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gd2hpY2ggaXMgaW5jbHVkZWQgaW4gU1dJRyBhbmQgYWxzbyBhdmFpbGFibGUKICAgICAgICAgICAgb25saW5lIGF0IGh0dHBzOi8vd3d3LnN3aWcub3JnL0RvYzMuMC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxNC0wMy0xNDogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIE51bWVyb3VzIEx1YSBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIDEuICVuc3BhY2Ugc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gTmFtZXNwYWNlcyBhcmUgbWFwcGVkIHRvIHRhYmxlcyBpbiB0aGUgbW9kdWxlLCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICAgICAgIG5hbWUgYXMgdGhlIEMrKyBuYW1lc3BhY2UuCiAgICAgICAgICAgIDIuIEluaGVyaXRhbmNlIGlzIG5vdyBoYW5kbGVkIGRpZmZlcmVudGx5LiBFYWNoIGNsYXNzIG1ldGF0YWJsZSBrZWVwcyBhIGxpc3Qgb2YgY2xhc3MgYmFzZXMgaW5zdGVhZAogICAgICAgICAgICAgICBvZiBtZXJnaW5nIGFsbCBtZW1iZXJzIG9mIGFsbCBiYXNlcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICAzLiBUaGUgbmV3IG1ldGF0YWJsZXMgcmVzdWx0IGluIGRpZmZlcmVuY2VzIGluIGFjY2Vzc2luZyBjbGFzcyBtZW1iZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgc3RydWN0IFRlc3QgewogICAgICAgICAgICAgICAgICAgICBlbnVtIHsgVEVTVDEgPSAxMCwgVEVTVDIgPSAyMCB9OwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IElDT05TVCA9IDEyOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIE5vdyB0aGlzIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuSUNPTlNUKQogICAgICAgICAgICAgICAgIFRoZSBvbGQgd2F5IHdhczoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9JQ09OU1QpCgogICAgICAgICAgICA0LiBUaGUgc3BlY2lhbCBjbGFzcyBtZXRhdGFibGUgbWVtYmVyICIuY29uc3RydWN0b3IiIHdhcyByZW1vdmVkLiBOb3cgU1dJRyBnZW5lcmF0ZXMgdGhlIHByb3h5CiAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ5IGl0c2VsZiBhbmQgYXNzaWducyBpdCBkaXJlY3RseSB0byB0aGUgY2xhc3MgdGFibGUgIl9fY2FsbCIgbWV0aG9kLgogICAgICAgICAgICA1LiBlTHVhIHNob3VsZCBhbHNvIG5vdyBzdXBwb3J0IGluaGVyaXRhbmNlLgogICAgICAgICAgICA2LiAnY29uc3QnIHN1YnRhYmxlIGluIGVMdWEgaXMgY29uc2lkZXJlZCBkZXByZWNhdGVkLgoKICAgICAgICAgICAgQ2hhbmdlcyBpbiBiZWhhdmlvdXI6CiAgICAgICAgICAgIGEuIFlvdSBjYW4gbm8gbG9uZ2VyIGFzc2lnbiB0byBub24tZXhpc3RpbmcgY2xhc3MgbWVtYmVycyBpbiBjbGFzc2VzIHdpdGhvdXQgYSBfX3NldGl0ZW1fXyBtZXRob2QuCiAgICAgICAgICAgICAgIEl0IHdpbGwgY2F1c2UgYSBMdWEgZXJyb3IuCiAgICAgICAgICAgIGIuIFlvdSBjYW4gbm8gbG9uZ2VyIGl0ZXJhdGUgb3ZlciBhIG1vZHVsZSB0YWJsZSBhbmQgY29weSBldmVyeXRoaW5nIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCiAgICAgICAgICAgICAgIEFjdHVhbGx5LCB0aGlzIHdhcyBuZXZlciB0aGUgY2FzZSwgYnV0IGl0IGlzIG5vdyBleHBsaWNpdGx5IHByb2hpYml0ZWQuCiAgICAgICAgICAgIGMuIE5vdyBjaGFuZ2luZyBhIGJhc2UgY2xhc3Mgd2lsbCBpbW1lZGlhdGVseSBhZmZlY3QgYWxsIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgZC4gVGhlcmUgbWlnaHQgYmUgc29tZSBpc3N1ZXMgd2l0aCBpbmhlcml0YW5jZS4gQWx0aG91Z2ggdGhlIGJhc2VzIGl0ZXJhdGlvbiBzY2hlbWUgaXMgdGhlIHNhbWUKICAgICAgICAgICAgICAgYXMgd2FzIHVzZWQgZm9yIG1lcmdpbmcgYmFzZSBjbGFzc2VzIGludG8gZGVyaXZlZCBvbmUsIHNvbWUgdW5rbm93biBpc3N1ZXMgbWF5IGFyaXNlLgoKICAgICAgICAgICAgVGhlIG9sZCBtZXRhdGFibGUgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSB1c2luZyB0aGUgLW5vLW9sZC1tZXRhdGFibGUtYmluZGluZ3Mgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ2hhbmdlIGluIGRlZmF1bHQgYmVoYXZpb3VyIHdyYXBwaW5nIEMrKyBib29sLiBPbmx5IGEgUHl0aG9uIFRydWUgb3IgRmFsc2UKICAgICAgICAgICAgd2lsbCBub3cgd29yayBmb3IgQysrIGJvb2wgcGFyYW1ldGVycy4gVGhpcyBmaXhlcyBvdmVybG9hZGluZyBib29sIHdpdGggb3RoZXIgdHlwZXMuCiAgICAgICAgICAgIFB5dGhvbiAyLjMgbWluaW11bSBpcyBub3cgcmVxdWlyZWQgZm9yIHdyYXBwaW5nIGJvb2wuCgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGJvb2wgdmFsdWUpIHsgcmV0dXJuICJib29sIjsgfQogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoaW50IHZhbHVlKSB7IHJldHVybiAiaW50IjsgfQoKICAgICAgICAgICAgUHJldmlvdXMgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+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+KQoKMjAxMC0wNi0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIHN0ZF9zaGFyZWRfcHRyLmkgZm9yIHdyYXBwaW5nIHN0ZDo6c2hhcmVkX3B0ci4gUmVxdWlyZXMgdGhlICVzaGFyZWRfcHRyCiAgICAgICAgICAgIG1hY3JvIGxpa2UgaW4gdGhlIGJvb3N0X3NoYXJlZF9wdHIuaSBsaWJyYXJ5LiBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZQogICAgICAgICAgICB3cmFwcGVkIGlmIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVmaW5lZDoKCiAgICAgICAgICAgICAgI2RlZmluZSBTV0lHX1NIQVJFRF9QVFJfU1VCTkFNRVNQQUNFIHRyMQogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc2hhcmVkX3B0ci5pPgoKICAgICAgICAgICAgc2hhcmVkX3B0ciBpcyBhbHNvIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sIG5vdy4KCjIwMTAtMDUtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSBmb3IgJHR5cGVtYXAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG8gY2FsbCBvdGhlciAkdHlwZW1hcAogICAgICAgICAgICBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQ0MgIkNDIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQkIgIiR0eXBlbWFwKGNzdHlwZSwgQ0MpIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQUEgIiR0eXBlbWFwKGNzdHlwZSwgQkIpIgogICAgICAgICAgICAgIHZvaWQgaGFoKEFBIGFhKTsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBDIyBzdGQ6OnZlY3RvciBjb250YWluZXJzIG9mIHNoYXJlZF9wdHIgYW5kICVzaGFyZWRfcHRyLgoKICAgICAgICAgICAgQWxzbyBhZGRlZCBkaWFnbm9zdGljcyBmb3IgJHR5cGVtYXAgd2l0aCAtZGVidWctdG1zZWFyY2gsIGZvciBleGFtcGxlLCB0aGUKICAgICAgICAgICAgYWJvdmUgZGlzcGxheXMgYWRkaXRpb25hbCBkaWFnbm9zdGljIGxpbmVzIHN0YXJ0aW5nICJDb250YWluaW5nOiAiOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBBQQogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBCQikKICAgICAgICAgICAgICBleGFtcGxlLmk6MzE6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQkIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBCQgogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQkIKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQ0MpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjI5OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IENDCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQ0MKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIENDCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgRml4ICVhdHRyaWJ1dGUycmVmIG5vdCB0byBwcm9kdWNlIGEgc3ludGF4IGVycm9yIGlmIHRoZSBsYXN0CgkgICAgYXJndW1lbnQgKEFjY2Vzc29yTWV0aG9kKSBpcyBvbWl0dGVkLiAgUGF0Y2ggZnJvbSBEYXZpZCBQaWVwZ3JhcwoJICAgIGluIFNGIzIyMzU3NTYuCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgW1BIUF0gV2hlbiB1c2luZyAldGhyb3dzIG9yICVjYXRjaGVzLCBTV0lHLWdlbmVyYXRlZCBQSFA1IHdyYXBwZXJzCgkgICAgbm93IHRocm93IFBIUCBFeGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIGdpdmluZyBhIFBIUCBlcnJvciBvZgoJICAgIHR5cGUgRV9FUlJPUi4KCgkgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkbid0IGNhdXNlIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHNpbmNlIHlvdSBjYW4ndAoJICAgIHNldCBhbiBlcnJvciBoYW5kbGVyIGZvciBFX0VSUk9SLCBzbyBwcmV2aW91c2x5IFBIUCB3b3VsZCBqdXN0IGV4aXQKCSAgICB3aGljaCBhbHNvIGhhcHBlbnMgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLiAgVGhlIGJlbmVmaXQgaXMgeW91IGNhbgoJICAgIG5vdyBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvLgoKCSAgICBGaXhlcyBTRiMyNTQ1NTc4IGFuZCBTRiMyOTU1NTIyLgoKMjAxMC0wNS0yNTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY29uc3Qgc3RkOjpzdHJpbmcgJi4KCSAgICBGaXhlcyBTRiMzMDA2NDA0IHJlcG9ydGVkIGJ5IHQtTGVnaWF3LgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzI5NTczNzUgLSBTV0lHU3RyaW5nSGVscGVyIGFuZCBTV0lHRXhjZXB0aW9uSGVscGVyIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSBpbiAuTkVUIDQgYXMgdGhlIGNsYXNzZXMgd2VyZSBub3QgbWFya2VkIGJlZm9yZWZpZWxkaW5pdC4KICAgICAgICAgICAgQSBzdGF0aWMgY29uc3RydWN0b3IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVwcmFnbWEoY3NoYXJwKSBpbWNsYXNzY29kZT0lewogICAgICAgICAgICAgICAgc3RhdGljICRpbWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgSWYgeW91IGhhZCBhZGRlZCB5b3VyIG93biBjdXN0b20gc3RhdGljIGNvbnN0cnVjdG9yIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgaW4KICAgICAgICAgICAgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLCB5b3Ugd2lsbCBoYXZlIHRvIG1vZGlmeSB5b3VyIGFwcHJvYWNoIHRvIHVzZSBzdGF0aWMgdmFyaWFibGUKICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb3IgZGVmaW5lIFNXSUdfQ1NIQVJQX05PX0lNQ0xBU1NfU1RBVElDX0NPTlNUUlVDVE9SIC0gU2VlIGNzaGFycGhlYWQuc3dnLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQwODIzMi4gSW1wcm92ZSBzaGFyZWRfcHRyIGFuZCBpbnRydXNpdmVfcHRyIHdyYXBwZXJzIGZvciBjbGFzc2VzIGluIGFuCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gTm8gc3BlY2lhbCB0cmVhdG1lbnQgaXMgbmVlZGVkIGZvciBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBwcm94eSBjbGFzcyBhbHNvIG5vIGxvbmdlciBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgZGVkdWNlZC4gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVzaGFyZWRfcHRyKFRZUEUpCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgaW50cnVzaXZlX3B0ciB3cmFwcGVycywgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlaW50cnVzaXZlX3B0cihUWVBFKQoKMjAxMC0wNS0yMTogb2xseQoJICAgIFtQSFBdIFN0b3AgZ2VuZXJhdGluZyBhIGJvZ3VzIGxpbmUgb2YgY29kZSBpbiBjZXJ0YWluIGNvbnN0cnVjdG9ycy4KCSAgICBUaGlzIHdhcyBtb3N0bHkgaGFybWxlc3MsIGJ1dCBjYXVzZWQgYSBQSFAgbm90aWNlIHRvIGJlIGlzc3VlZCwgaWYKCSAgICBlbmFibGVkIChTRiMyOTg1Njg0KS4KCjIwMTAtMDUtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoyMDEwLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgQysrIGVudW0gYm9vbGVhbiB2YWx1ZXMgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmOgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7IFBMQVkgPSB0cnVlLCBTVE9QID0gZmFsc2UgfSBwbGF5X3N0YXRlOwoKMjAxMC0wNS0xNDogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIHdhcyBwcm9kdWNpbmcKCSAgICB1bmNvbXBpbGFibGUgY29kZSBpbiBzb21lIGNhc2VzLgoKMjAxMC0wNS0xMjogZHJqb2UKCSAgICBbUl0gQWRkIHR3byBtb3JlIGNoYW5nZXMgZnJvbSBXaWwgTm9sYW4uICBHZXQgZ2FyYmFnZQoJICAgIGNvbGxlY3Rpb24gdG8gd29yay4gIEltcGxlbWVudCBuZXdmcmVlCgoyMDEwLTA1LTA5OiBkcmpvZQogICAgICAgICAgICBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbCBOb2xhbiBjaGFuZ2UgY3JlYXRpb24gb2Ygc3RyaW5nIHNvCiAgICAgICAgICAgIHRoYXQgUiAyLjcuMCsgY2FuIHVzZSBjaGFyIGhhc2hlcwoKMjAxMC0wNS0wNzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzI5NTUxNDYgZnJvbSBTZXJnZXkgU2F0c2tpeSB0byBmaXggZXhwcmVzc2lvbnMgY29udGFpbmluZyBkaXZpZGUgYnkKICAgICAgICAgICAgb3BlcmF0b3IgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdHMuCgoyMDEwLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gTWVtb3J5IGxlYWsgZml4IGhhbmRsaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5wdXRzLCByZXBvcnRlZCBieSBXaWxsIE5vbGFuLgoKMjAxMC0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBtYXRjaGluZyBlbmhhbmNlbWVudCBmb3Igbm9uLWRlZmF1bHQgdHlwZW1hcHMuIFByZXZpb3VzbHkgYWxsCiAgICAgICAgICAgIHF1YWxpZmllcnMgd2VyZSBzdHJpcHBlZCBpbiBvbmUgc3RlcCwgbm93IHRoZXkgYXJlIHN0cmlwcGVkIG9uZSBhdCBhIHRpbWUKICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdCBtb3N0IHF1YWxpZmllci4gRm9yIGV4YW1wbGUsIGludCBjb25zdCpjb25zdCAKICAgICAgICAgICAgaXMgZmlyc3Qgc3RyaXBwZWQgdG8gaW50ICpjb25zdCB0aGVuIGludCAqLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDQtMjU6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5ODU2NTUgLSBicm9rZW4gY29uc3RydWN0b3IgcmVuYW1pbmcuCgoyMDEwLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIGZyYWdtZW50cyBhcmUgbm93IG9mZmljaWFsIGFuZCBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMyMDQ4MDY0IGFuZCAjMjQwODAyMC4KICAgICAgICAgICAgQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBSdWJ5IGFuZCBzdGQ6OnZlY3RvciB3cmFwcGVycyB3aXRoIC1taW5oZXJpdC4KICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzUyMjg3NAoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW016c2NoZW1lXSBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IHN0ZDo6bWFwIHdyYXBwZXJzOgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvMjAzODc2CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjk1MjM3NCAtIGZpeCBkaXJlY3RvcnMgYW5kIHRoZSAtbm9ydHRpIG9wdGlvbi4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMjg4NzI1NCBhbmQgIzI5NDYwMzIgLSBTV0lHX0x1YV90eXBlbmFtZSB1c2luZyB3cm9uZyBzdGFjayBpbmRleC4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBleGNlcHRpb25zIGJlaW5nIHRocm93biB3aXRoIHRoZSAtdGhyZWFkcyBvcHRpb24gYmFzZWQgb24gcGF0Y2ggZnJvbSBBcnRvIFZ1b3JpLgogICAgICAgICAgICBGaXhlcyBidWcgIzI4MTg0OTkuCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggTWFrZWZpbGUgdGFyZ2V0czogZGlzdGNsZWFuIGFuZCBtYWludGFpbmVyLWNsZWFuCgoyMDEwLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggY2hhciBwb2ludGVycywgd2NoYXJfdCBwb2ludGVycyBhbmQgY2hhciBhcnJheXMgc28gdGhhdCBuaWwgY2FuIGJlIHBhc3NlZCBhcyBhCiAgICAgICAgICAgIHZhbGlkIHZhbHVlLiBCdWcgcmVwb3J0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDEwLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBOdW1lcm91cyBzdWJ0bGUgdHlwZW1hcCBtYXRjaGluZyBydWxlIGZpeGVzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGVtYXAKICAgICAgICAgICAgbWF0Y2hpbmcgcnVsZXMgYXJlIHRvIHRha2UgYSB0eXBlIGFuZCBmaW5kIHRoZSBiZXN0IGRlZmF1bHQgdHlwZW1hcCAoU1dJR1RZUEUsIFNXSUdUWVBFKiBldGMpLAogICAgICAgICAgICB0aGVuIGxvb2sgZm9yIHRoZSBuZXh0IGJlc3QgbWF0Y2ggYnkgcmVkdWNpbmcgdGhlIGNob3NlbiBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBub3cgZm9sbG93cyBDKysgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBtYXRjaGluZyBydWxlcy4KCiAgICAgICAgICAgIEJlbG93IGFyZSB0aGUgc2V0IG9mIGNoYW5nZXMgbWFkZSBzaG93aW5nIHRoZSBkZWZhdWx0IHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIGFsb25nIHdpdGggdGhlIG9sZCByZWR1Y2VkIHR5cGUgYW5kIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcmVkdWNlZCB0eXBlOgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICZbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJltdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoJilbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0IComCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICoKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICoKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoqCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIComCgogICAgICAgICAgICBBZGRpdGlvbmFsbHksIGEgY29uc3QgU1dJR1RZUEUgbG9va3VwIGlzIHVzZWQgbm93IGZvciBhbnkgY29uc3RhbnQgdHlwZS4gU29tZSBleGFtcGxlcywgd2hlcmUKICAgICAgICAgICAgVCBpcyBzb21lIHJlZHVjZWQgdHlwZSwgZWcgaW50LCBzdHJ1Y3QgRm9vOgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKmNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0W10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0W10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFW10KCiAgICAgICAgICAgICAgICAgICBlbnVtIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IGVudW0gU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IGVudW0gU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCopW10KCiAgICAgICAgICAgIFJlbWluZGVyOiB0aGUgdHlwZW1hcCBtYXRjaGluZyBydWxlcyBjYW4gbm93IGJlIHNlZW4gZm9yIGFueSB0eXBlcyBiZWluZyB3cmFwcGVkIGJ5IHVzaW5nCiAgICAgICAgICAgIGVpdGhlciB0aGUgLWRlYnVnLXRtc2VhcmNoIG9yIC1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCiAgICAgICAgICAgIEluIHByYWN0aWNlIHRoaXMgbGVhZHMgdG8gc29tZSBzdWJ0bGUgbWF0Y2hpbmcgcnVsZSBjaGFuZ2VzIGFuZCB0aGUgbWFqb3JpdHkgb2YgdXNlcnMKICAgICAgICAgICAgd29uJ3Qgbm90aWNlIGFueSBjaGFuZ2VzLCBleGNlcHQgaW4gdGhlIHByaW1lIGFyZWEgb2YgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2U6IEltcHJvdmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lcnMgb2YgY29uc3QgcG9pbnRlcnMgYW5kIHBhc3NpbmcgY29uc3QgcG9pbnRlcnMgYnkgcmVmZXJlbmNlLiBUaGlzIGlzIGZpeGVkCiAgICAgICAgICAgIGJlY2F1c2UgbWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMgdXNlIGEgdHlwZSAnVCBjb25zdCYnIGFzIHBhcmFtZXRlcnMgYW5kIHdoZW4gVCBpcyAKICAgICAgICAgICAgYSBjb25zdCBwb2ludGVyLCBmb3IgZXhhbXBsZSwgJ0sgY29uc3QqJywgdGhlbiB0aGUgZnVsbCB0eXBlIGlzICdLIGNvbnN0KmNvbnN0JicuIFRoaXMKICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgJ1NXSUdUWVBFICpjb25zdCYnIHR5cGVtYXBzIG5vdyBtYXRjaCB3aGVuIFQgaXMgZWl0aGVyIGEgbm9uLWNvbnN0IG9yCiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIuIEZ1cnRoZXJtb3JlLCBzb21lIHRhcmdldCBsYW5ndWFnZXMgaW5jb3JyZWN0bHkgaGFkICdTV0lHVFlQRSAqJicgdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB0aGVzZSBzaG91bGQgaGF2ZSBiZWVuICdTV0lHVFlQRSAqY29uc3QmJy4gVGhlc2UgaGF2ZSBiZWVuIGNvcnJlY3RlZCAoSmF2YSwgQyMsIEx1YSwgUEhQKS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU29tZSB2ZXJ5IG9sZCBkZXByZWNhdGVkIHByYWdtYSB3YXJuaW5ncyBhcmUgbm93IGVycm9ycy4KCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZmlsZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkb3VibGUvbXVsdGlwbGUgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMy0xMDogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIFVzZSBmdWxseSBxdWFsaWZpZWQgc3ltYm9sIG5hbWUgb2YgY2w6OmlkZW50aXR5IGluIGVtaXRfZGVmdW4oKS4KCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUaGUgaW50ZXJtZWRpYXJ5IEpOSSBjbGFzcyBtb2RpZmllcnMgYXJlIG5vdyBwdWJsaWMgYnkgZGVmYXVsdCBtZWFuaW5nIHRoZXNlCiAgICAgICAgICAgIGludGVybWVkaWFyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFyZSBub3cgYWNjZXNzaWJsZSBieSBkZWZhdWx0IGZyb20gb3V0c2lkZSBhbnkgcGFja2FnZQogICAgICAgICAgICB1c2VkLiBUaGUgcHJveHkgY2xhc3MgcG9pbnRlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFsc28gbm93IHB1YmxpYy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIG5zcGFjZSBvcHRpb24gdG8gd29yayB3aXRob3V0IGFueSBvdGhlciBtb2RzLgogICAgICAgICAgICBUaGUgcHJldmlvdXMgZGVmYXVsdCBvZiBwcm90ZWN0ZWQgYWNjZXNzIGNhbiBiZSByZXN0b3JlZCB1c2luZzoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9NRVRIT0RTKHByb3RlY3RlZCwgcHJvdGVjdGVkLCBTV0lHVFlQRSkKICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgPSAiY2xhc3MiCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZSBmb3IgQyMuIERvY3VtZW50YXRpb24gZm9yIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyBub3cgYXZhaWxhYmxlLgoKMjAxMC0wMy0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlLiBUaGlzIGFkZHMgc29tZSBpbXByb3ZlZCBuYW1lc3BhY2Ugc3VwcG9ydC4gQ3VycmVudGx5IG9ubHkgSmF2YQogICAgICAgICAgICBpcyBzdXBwb3J0ZWQgZm9yIHRhcmdldCBsYW5ndWFnZXMsIHdoZXJlIEMrKyBuYW1lc3BhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgICBKYXZhIHBhY2thZ2VzLiBUaGUgZmVhdHVyZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3NlcyxzdHJ1Y3QsdW5pb25zIGFuZCBlbnVtcyBkZWNsYXJlZCB3aXRoaW4KICAgICAgICAgICAgYSBuYW1lc3BhY2UuIE1ldGhvZHMgYW5kIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBuYW1lc3BhY2VzIHN0aWxsIGVmZmVjdGl2ZWx5IGhhdmUgdGhlaXIKICAgICAgICAgICAgbmFtZXNwYWNlcyBmbGF0dGVuZWQuIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMTo6Q29sb3I7CiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIyOjpDb2xvcjsKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjEgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIEphdmEsIHRoZSAtcGFja2FnZSBvcHRpb24gaXMgYWxzbyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBuc3BhY2UgZmVhdHVyZS4gU2F5CiAgICAgICAgICAgIHdlIHVzZSAtcGFja2FnZSBjb20ubXljbywgdGhlIHR3byBjbGFzc2VzIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGFzIGZvbGxvd3MgZnJvbSBKYXZhOgoKICAgICAgICAgICAgICBjb20ubXljby5PdXRlci5Jbm5lcjEuQ29sb3IgYW5kIGNvbS5teWNvLk91dGVyLklubmVyMi5Db2xvci4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSAtZGlydnRhYmxlIGZyb20gdGhlIG9wdGltaXphdGlvbnMgaW5jbHVkZWQgYnkgLU8gYXMgaXQgdGhpcyBvcHRpb24KICAgICAgICAgICAgY3VycmVudGx5IGxlYWRzIHRvIG1lbW9yeSBsZWFrcyBhcyByZXBvcnRlZCBieSBKb2hhbiBCbGFrZS4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIExpY2Vuc2UgY29kZSBjaGFuZ2VzOiBTV0lHIFNvdXJjZSBpcyBHUEwtdjMgYW5kIGxpYnJhcnkgY29kZSBsaWNlbnNlIGlzIG5vdyBjbGVhcmVyCiAgICAgICAgICAgIGFuZCBpcyBwcm92aWRlZCB1bmRlciBhIHZlcnkgcGVybWlzc2l2ZSBsaWNlbnNlLiBTZWUgaHR0cHM6Ly93d3cuc3dpZy5vcmcvbGVnYWwuaHRtbC4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBIGZldyBmaXhlcyBmb3IgY29tcGlsaW5nIHVuZGVyIHJ1YnktMS45LnggaW5jbHVkaW5nIHBhdGNoIGZyb20gJ05pYmJsZScuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggZnJvbSBQYXRyaWNrIEJlbm5ldHQgdG8gZml4IFJBUlJBWV9MRU4gYW5kIFJBUlJBWV9QVFIgdXNhZ2UgZm9yIFJ1YnkgMS45LngKICAgICAgICAgICAgdXNlZCBpbiB2YXJpb3VzIFNUTCB3cmFwcGVycy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IGluY29ycmVjdCBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbCBuYW1lIGVycm9yIHdoZW4gYW4gZW51bSBpdGVtCiAgICAgICAgICAgIGFuZCBjbGFzcyBuYW1lIGhhdmUgdGhlIHNhbWUgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgTmF0aGFuIEtyaWVnZXIuIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFZlY3RvciB7fTsKICAgICAgICAgICAgICBuYW1lc3BhY2UgVGV4dCB7CiAgICAgICAgICAgICAgICBlbnVtIFByZWZlcmVuY2UgeyBWZWN0b3IgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgb3RoZXIgaW5jb3JyZWN0IGNvcm5lciBjYXNlIHRhcmdldCBsYW5ndWFnZSBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAxMC0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSAtZGVidWctbHN5bWJvbHMgb3B0aW9uIGZvciBkaXNwbGF5aW5nIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbGF5ZXIgc3ltYm9scy4KCjIwMTAtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtTU0gYW5kIC1NTUQgb3B0aW9ucyBvbiBXaW5kb3dzLiBUaGV5IHdlcmUgbm90IG9taXR0aW5nIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkgYXMKICAgICAgICAgICAgdGhleSBzaG91bGQgYmUuCgoyMDEwLTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE4MDczMjkgLSBXaGVuIE1ha2VmaWxlIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZ2VuZXJhdGVkIHVzaW5nIHRoZSAtTSBmYW1pbHkgb2Ygb3B0aW9ucwogICAgICAgICAgICBvbiBXaW5kb3dzLCB0aGUgZmlsZSBwYXRocyBoYXZlIGJlZW4gY29ycmVjdGVkIHRvIHVzZSBzaW5nbGUgYmFja3NsYXNoZXMgcmF0aGVyIHRoYW4gZG91YmxlCiAgICAgICAgICAgIGJhY2tzbGFzaGVzIGFzIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkxODkwMiAtIGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gY29ycmVjdCBkaXJlY3Rvcnkgb24KICAgICAgICAgICAgV2luZG93cyB3aGVuIHVzaW5nIGZvcndhcmQgc2xhc2hlcyBmb3IgLW8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtYysrIC1vIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2Vfd3JhcC5jcHAgc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZS5pCgoyMDEwLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI4OTQ0MDUgLSBhc3NlcnRpb24gd2hlbiB1c2luZyAteG1sb3V0LgoKMjAxMC0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVtYXAgbWF0Y2hpbmcgYnVnIHdoZW4gYSB0ZW1wbGF0ZWQgdHlwZSBoYXMgYSB0eXBlbWFwIGJvdGggc3BlY2lhbGl6ZWQgYW5kIG5vdAogICAgICAgICAgICBzcGVjaWFsaXplZC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYWCB7IC4uLiB9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWCAmICIuLi4iCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYPCBpbnQgPiAmICIuLi4iCgogICAgICAgICAgICByZXN1bHRlZCBpbiB0aGUgMm5kIHR5cGVtYXAgYmVpbmcgYXBwbGllZCBmb3IgYWxsIFQgaW4gWFg8IFQgPi4KCjIwMTAtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkzMzEyOSAtIHR5cGVtYXBzIG5vdCBiZWluZyBmb3VuZCB3aGVuIHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGlzIHVzZWQgdG8gZGVub3RlCiAgICAgICAgICAgIGdsb2JhbCBzY29wZSwgdGhlIHR5cGVtYXAgaXMgbm93IHVzZWQgaW4gc2l0dWF0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgOjpYICYpOwoKICAgICAgICAgICAgYW5kIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCA6OlggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCBYICYpOwoKMjAxMC0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBkZW5vdGluZyBnbG9iYWwgc2NvcGUgcHJvYmxlbXMgaW4gdGhlIHR5cGVzIGdlbmVyYXRlZAogICAgICAgICAgICBpbnRvIHRoZSBDKysgbGF5ZXIuIFByZXZpb3VzbHkgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yIHdhcyBkcm9wcGVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBpZiB0aGUgdHlwZSBoYWQgYW55IHNvcnQgb2YgcXVhbGlmaWVyLCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIHBvaW50ZXJzLCByZWZlcmVuY2VzLCBsaWtlCiAgICAgICAgICAgIDo6Zm9vKiwgOjpmb28mLCBiYXI8IDo6Zm9vKiA+LgoKMjAxMC0wMS0xMzogb2xseQoJICAgIFtQSFBdIEFkZCBkYXRldGltZSB0byB0aGUgbGlzdCBvZiBQSFAgcHJlZGVmaW5lZCBjbGFzc2VzIChwYXRjaAoJICAgIGZyb20gRGF2aWQgRmxldGNoZXIgaW4gU0YjMjkzMTA0MikuCgoyMDEwLTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHdhcm5pbmcsIGVycm9yIGFuZCBkaWFnbm9zdGljIHJlcG9ydGluZy4gVGhlIHdhcm5pbmcgbnVtYmVyIGlzIG5vIAogICAgICAgICAgICBsb25nZXIgc2hvd24gd2l0aGluIGJyYWNrZXRzLiBUaGlzIGlzIHRvIGhlbHAgZGVmYXVsdCBwYXJzaW5nIG9mIHdhcm5pbmcgbWVzc2FnZXMgYnkKICAgICAgICAgICAgb3RoZXIgdG9vbHMsIHZpbSBvbiBVbml4IGluIHBhcnRpY3VsYXIuCgogICAgICAgICAgICBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXkgdXNpbmcgLUZzdGFuZGFyZDoKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KCiAgICAgICAgICAgIEFsc28gc3VidGxlIGZpeCB0byAtRm1pY3Jvc29mdCBmb3JtYXQgYWRkaW5nIGluIG1pc3Npbmcgc3BhY2UuIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCkgOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBhIGZldyBpbmNvbnNpc3RlbmNpZXMgaW4gcmVwb3J0aW5nIG9mIGZpbGUvbGluZSBudW1iZXJpbmdzIGluY2x1ZGluZyBtb2RpZnlpbmcKICAgICAgICAgICAgdGhlIG92ZXJsb2FkIHdhcm5pbmdzIDUwOSwgNTEyLCA1MTYsIDQ3NCwgNDc1IHRvIG5vdyBiZSB0d28gbGluZSB3YXJuaW5ncy4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSAtZGVidWctdGFncyBvdXRwdXQgdG8gdXNlIHN0YW5kYXJkIGZpbGUgbmFtZS9saW5lIHJlcG9ydGluZyBzbyB0aGF0IGVkaXRvcnMKICAgICAgICAgICAgY2FuIGVhc2lseSBuYXZpZ2F0ZSB0byB0aGUgYXBwcm9wcmlhdGUgbGluZXMuCiAgICAgICAgICAgIFdhcyB0eXBpY2FsbHk6CiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMikKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6MzkpCiAgICAgICAgICAgIG5vdzoKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyOiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZQogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5OiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUKCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtaXNzaW5nIGZpbGUvbGluZSBudW1iZXJzIGZvciB0eXBlbWFwIHdhcm5pbmdzIGFuZCBpbiBvdXRwdXQgZnJvbSB0aGUKICAgICAgICAgICAtZGVidWctdG1zZWFyY2gvLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHR5cGVtYXBzIHVzZWQgZGVidWdnaW5nIG9wdGlvbiAoLWRlYnVnLXRtdXNlZCkuIFdoZW4gdXNlZCBlYWNoIGxpbmUgZGlzcGxheXMKICAgICAgICAgICAgdGhlIHR5cGVtYXAgdXNlZCBmb3IgZWFjaCB0eXBlIGZvciB3aGljaCBjb2RlIGlzIGJlaW5nIGdlbmVyYXRlZCBpbmNsdWRpbmcgdGhlIGZpbGUKICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyIHJlbGF0ZWQgdG8gdGhlIHR5cGUuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjb25kZW5zZWQgZm9ybSBvZiB0aGUKICAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbi4gRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlamF2YWV4Y2VwdGlvbiBhbmQgZGlyZWN0b3JzIHNvIHRoYXQgYWxsIHRoZSBhcHByb3ByaWF0ZSB0aHJvd3MgY2xhdXNlcyAKICAgICAgICAgICAgYXJlIGdlbmVyYXRlZC4gUHJvYmxlbSByZXBvcnRlZCBieSBQZXRlciBHcmVlbndvb2QuCgoyMDA5LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbiBmb3IgZGVidWdnaW5nIHRoZSB0eXBlbWFwIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZXMuCiAgICAgICAgICAgIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSB0aGUgLWFwaSBvcHRpb24gYW5kIHVzZSB0aGUgbmV3IE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIKICAgICAgICAgICAgbWFjcm8gcHJvdmlkZWQgaW4gdGhlIG9jdGF2ZSBoZWFkZXJzIGZvciBkZXRlcm1pbmluZyB0aGUgYXBpIHZlcnNpb24gaW5zdGVhZC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUnVieV0gSW1wcm92ZSBzdXBwb3J0IGZvciBSdWJ5IDEuOSB1bmRlciBHQ0MuICBBZGRyZXNzZXMgcGFydCBvZgoJICAgIFNGIzI4NTk2MTQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIG1vZHVsbyBvcGVyYXRvciAoJSkgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMKCSAgICAoU0YjMjgxODU2MikuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1BIUF0gImVtcHR5IiBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUEhQLCBzbyByZW5hbWUgZW1wdHkoKSBtZXRob2QKCSAgICBvbiBTVEwgY2xhc3NlcyB0byAiaXNfZW1wdHkoKSIgKHByZXZpb3VzbHkgdGhpcyB3YXMgYXV0b21hdGljYWxseQoJICAgIHJlbmFtZWQgdG8gImNfZW1wdHkoKSIpLgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMi0wMzogb2xseQoJICAgIFtQSFBdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcsIGFuZCBmb3IKCSAgICBwb2ludGVyIHRvIG1ldGhvZC4KCjIwMDktMTItMDI6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZyBhbmQgcmVuYW1lIG9mIHJlc2VydmVkIGNsYXNzIG5hbWUgdG8gYmUgY2FzZQoJICAgIGluc2Vuc2l0aXZlLgoKMjAwOS0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgUmV2ZXJ0IHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzIGFkZGVkIGluIHN3aWctMS4zLjM5LiBUaGUKCSAgICBtZW1iZXJpbiB0eXBlbWFwcyBhcmUgaWdub3JlZCBhZ2FpbiBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGluY29uc2lzdGVuY3kgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAwOS0xMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZ2VuZXJhdGVkIHF1b3Rpbmcgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciAKICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBBOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEE7CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgQSA9ICdBJzsgCiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIGNvbnN0YW50IHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCwgcmF0aGVyIHRoYW4gdGhlIEMrKyBjb2RlIHRvCiAgICAgICAgICAgIGFjY2VzcyB0aGUgbWVtYmVyLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEVOOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEVOOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgRU4gPSAyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysgbmVzdGVkIHR5cGVkZWYgY2xhc3NlcyBjYW4gbm93IGJlIGhhbmRsZWQgdG9vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgdHlwZWRlZiBGb28geyB9IEZvb1R5cGVkZWYxLCBGb29UeXBlZGVmMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZvciBDIG5lc3RlZCBzdHJ1Y3RzIGFyZSBub3cgZ2VuZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGRlY2xhcmVkIAogICAgICAgICAgICBpbiB0aGUgcGFyc2VkIGNvZGUuCgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ5MTQ3NiAtIG11bHRpcGxlIGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgc3RydWN0cywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICB9IGlubmVyMSwgaW5uZXIyLCAqaW5uZXIzLCBpbm5lcjRbMV07CiAgICAgICAgICAgICAgfSBvdXRlcjsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIGVudW0gZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBBQkMgewogICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgfSBBID0gYSwgKnBDID0gJkMsIGFycmF5WzNdID0ge2EsIGIsIGN9OwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2Ygc3RydWN0IGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHsKICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICB9IGluc3RhbmNlID0geyAxMCB9OwoKMjAwOS0xMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTYwOTc3IC0gU3ludGF4IGVycm9yIHBhcnNpbmcgZGVyaXZlZCBuZXN0ZWQgY2xhc3MgZGVjbGFyYXRpb24gYW5kIG1lbWJlcgogICAgICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZS4KCjIwMDktMTEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjMxMDQ4MyAtIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZiB3aXRoaW4gZXh0ZXJuICJDIiBibG9jay4KCjIwMDktMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gdGVtcGxhdGVkIGNsYXNzZXMgc28gdGhhdCBjb21waWxhYmxlIGNvZGUgCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZC4KCjIwMDktMTEtMTM6IG9sbHkKCSAgICBbcGhwXSBGaXggcGxhY2Ugd2hlcmUgY2xhc3MgcHJlZml4IChhcyBzcGVjaWZpZWQgd2l0aCAtcHJlZml4KQoJICAgIHdhc24ndCBiZWluZyB1c2VkLiAgUGF0Y2ggZnJvbSBndmVyYnJ1Z2dlbiBpbiBTRiMyODkyNjQ3LgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIGlzIGdlbmVyYXRlZCAtIHRoZSBuZXN0ZWQKICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgaXMgbm93IHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBuZXN0ZWQgY2xhc3NlcywgdGhhdCBpcywgYXMgYW4gb3BhcXVlIHR5cGUKICAgICAgICAgICAgdW5sZXNzIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgaXMgdXNlZC4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlcGxhY2UgU1dJR1dBUk5fUEFSU0VfTkVTVEVEX0NMQVNTIHdpdGggU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTIGFuZAogICAgICAgICAgICBTV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUyBmb3IgbmFtZWQgYW5kIHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgoKICAgICAgICAgICAgTmFtZWQgbmVzdGVkIGNsYXNzIGlnbm9yZWQgd2FybmluZ3MgY2FuIG5vdyBiZSBzdXBwcmVzc2VkIGJ5IG5hbWUgdXNpbmcgJXdhcm5maWx0ZXIsIGVnOgoKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MpIE91dGVyOjpJbm5lcjsKCiAgICAgICAgICAgIGJ1dCBjbGVhcmx5IHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgY2Fubm90IGFuZCB0aGUgZ2xvYmFsIHN1cHByZXNzaW9uIGlzIHN0aWxsIHJlcXVpcmVkLCBlZzoKCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj1TV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUwoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBhcyBhIHdheSB0byB1c2UgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiBhIG5lc3RlZCBjbGFzcyAKICAgICAgICAgICAgKEMrKyBtb2RlIG9ubHkpLiBJdCByZW1vdmVzIHRoZSBuZXN0ZWQgY2xhc3MgZnJvbSBTV0lHJ3MgdHlwZSBpbmZvcm1hdGlvbiBzbyBpdCBpcyBhcyBpZiBTV0lHCiAgICAgICAgICAgIGhhZCBuZXZlciBwYXJzZWQgdGhlIG5lc3RlZCBjbGFzcy4gVGhlIGRvY3VtZW50ZWQgbmVzdGVkIGNsYXNzIHdvcmthcm91bmRzIHVzaW5nIGEgZ2xvYmFsCiAgICAgICAgICAgIGZha2UgY2xhc3Mgc3RvcHBlZCB3b3JraW5nIHdoZW4gU1dJRyB0cmVhdGVkIHRoZSBuZXN0ZWQgY2xhc3MgYXMgYW4gb3BhcXVlIHBvaW50ZXIsIGFuZAogICAgICAgICAgICB0aGlzIGZlYXR1cmUgcmV2ZXJ0cyB0aGlzIGJlaGF2aW91ci4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB3aXRoIGRldGFpbHMgb2YgaG93CiAgICAgICAgICAgIHRvIHVzZSBhbmQgaW1wbGVtZW50IGl0LCBzZWUgdGhlICJOZXN0ZWQgY2xhc3NlcyIgc2VjdGlvbiBpbiBTV0lHUGx1cy5odG1sLgoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlcmUgd2VyZSBhIG51bWJlciBvZiBDKysgY2FzZXMgd2hlcmUgbmVzdGVkIGNsYXNzZXMvc3RydWN0cy91bmlvbnMgd2VyZSBiZWluZyBoYW5kbGVkCiAgICAgICAgICAgIGFzIGlmIEMgY29kZSB3YXMgYmVpbmcgcGFyc2VkIHdoaWNoIHdvdWxkIG9mdGVudGltZXMgbGVhZCB0byB1bmNvbXBpbGFibGUgY29kZSBhcyBhbgogICAgICAgICAgICBhdHRlbXB0IHdhcyBtYWRlIHRvIHdyYXAgdGhlIG5lc3RlZCBzdHJ1Y3RzIGxpa2UgaXQgaXMgZG9jdW1lbnRlZCBmb3IgQyBjb2RlLiBOb3cgYWxsCiAgICAgICAgICAgIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGFyZSBpZ25vcmVkIGluIEMrKyBtb2RlLCBhcyB3YXMgYWx3YXlzIGRvY3VtZW50ZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZXJlIGlzIGFuIGltcHJvdmVtZW50IGFzIHVzYWdlIG9mIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGlzIG5vdyBhbHdheXMgdHJlYXRlZAogICAgICAgICAgICBhcyBhbiBvcGFxdWUgdHlwZSBieSBkZWZhdWx0LCByZXN1bHRpbmcgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBzaG91bGQgYWx3YXlzIGNvbXBpbGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTEtMDk6IGRyam9lCgkgICAgRml4IFIgZm9yIC1mY29tcGFjdCBhbmQgYWRkIHN0ZF9tYXAuaQoKMjAwOS0xMS0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29uc2lzdGVuY3kgZm9yIG5lc3RlZCBzdHJ1Y3RzL3VuaW9ucy9jbGFzc2VzLiBVbmNvbXBpbGFibGUgY29kZSB3YXMgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5uZXIgc3RydWN0IGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMgd2VyZSB1c2VkIGFzIHR5cGVzIHdpdGhpbiB0aGUKICAgICAgICAgICAgaW5uZXIgc3RydWN0LiBUaGUgaW5uZXIgc3RydWN0L3VuaW9uIGlzIG5vdyB0cmVhdGVkIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBtYWtpbmcgdGhlCiAgICAgICAgICAgIGJlaGF2aW91ciB0aGUgc2FtZSBhcyBhbiBpbm5lciBjbGFzcy4gKEMrKyBjb2RlKSwgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeyBpbnQgeDsgfTsKICAgICAgICAgICAgICAgIElubmVyU3RydWN0KiBnZXRJbm5lclN0cnVjdCgpOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTA4OiB3c2Z1bHRvbgoJICAgIElnbm9yZWQgbmVzdGVkIGNsYXNzL3N0cnVjdCB3YXJuaW5ncyBub3cgZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgaWdub3JlZCBjbGFzcy9zdHJ1Y3QuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMTUxNDY4MSAtIEZpeCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gYSBuYW1lc3BhY2UgZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIGFuZCBpbnRyb2R1Y2VkIHN0cmFuZ2Ugc2lkZSBlZmZlY3RzIHRvIG90aGVyIHdyYXBwZXIgY29kZSBlc3BlY2lhbGx5IGNvZGUKICAgICAgICAgICAgYWZ0ZXIgdGhlIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzcy4gTm90ZSB0aGF0IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIGFyZSBzdGlsbCBpZ25vcmVkLgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBBZGQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnLXN5bXRhYnMgICAgLSBEaXNwbGF5IHN5bWJvbCB0YWJsZXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAtZGVidWctc3ltYm9scyAgICAtIERpc3BsYXkgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKICAgICAgICAgICAgICAtZGVidWctY3N5bWJvbHMgICAtIERpc3BsYXkgQyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCgoyMDA5LTExLTAzOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHVzYWdlIG9mIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIEFBIHsgLyogLi4uICovIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjpBQTsKCiAgICAgICAgICAgIGFuZCBidWcgIzE4MTY4MDIgLSBTd2lnVmFsdWVXcmFwcGVyIHNob3VsZCBiZSB1c2VkOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0MgewogICAgICAgICAgICAgICAgQ0MoaW50KTsgLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgOjpDQyB4KCk7CgogICAgICAgICAgICBhbmQgaW4gdGVtcGxhdGUgcGFyYW1ldGVyIHNwZWNpYWxpemF0aW9uczoKCiAgICAgICAgICAgICAgc3RydWN0IFMge307CiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgWDxTPiB7IHZvaWQgYigpIHt9IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKE15VENvbmNyZXRlKSBYPCA6OlMgPjsKCiAgICAgICAgICAgIHBsdXMgcHJvYmFibHkgc29tZSBvdGhlciBjb3JuZXIgY2FzZSB1c2FnZSBvZiA6Oi4KCjIwMDktMTEtMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrIGluIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHRoZQoJICAgIGdlbmVyYXRlZCBtb2R1bGUuCgoyMDA5LTEwLTIzOiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBhIG5hbWVkIG5lc3RlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHVzaW5nICV0ZW1wbGF0ZShuYW1lKSAKICAgICAgICAgICAgd2l0aGluIGEgY2xhc3MuIEEgd2FybmluZyB0aGF0IHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGlzIG5vdyBpc3N1ZWQgcGx1cyBwcm9jZXNzaW5nIAogICAgICAgICAgICBjb250aW51ZXMgYXMgaWYgbm8gbmFtZSB3YXMgZ2l2ZW4uCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBzdGQ6OnZlY3Rvcjxjb25zdCBUKj4uIFRoaXMgd291bGQgcHJldmlvdXNseSBjb21waWxlLCBidXQgbm90IHJ1biBjb3JyZWN0bHkuCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIEZpeGVkIHByZXZpb3VzbHkgZmFpcmx5IHBvb3IgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbmQgZXhwbGljaXQgCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIE51bWVyb3VzIGJ1Z3MgaW4gdGhpcyBhcmVhIGhhdmUgYmVlbiBmaXhlZCBpbmNsdWRpbmc6CgogICAgICAgICAgICAtIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbXBsZW1lbnRlZCBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMsIGVnIHRoaXMgbm93CiAgICAgICAgICAgICAgd29ya3M6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYICAgICAge307CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYPFQgKj4ge307CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoWDEpIFg8Y29uc3QgaW50ICo+OyAvLyBDaG9vc2VzIFQgKiBzcGVjaWFsaXphdGlvbgoKICAgICAgICAgICAgICBhbmQgbW9yZSBjb21wbGV4IGNhc2VzIHdpdGggbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgYSBtaXggb2YgdGVtcGxhdGUgYXJndW1lbnQKICAgICAgICAgICAgICBkZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgc3BlY2lhbGlzZWQgcGFyYW1ldGVycywgZWc6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgVHdvUGFybSAgICAgICAgICAgICAgIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4gICAgICAgICAgICAgIHN0cnVjdCBUd29QYXJtPFQxICosIGludCAqPiAgeyB2b2lkIGUoKSB7fSB9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEUpIFR3b1Bhcm08aW50ICoqLCBpbnQgKj47CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHByaW1hcnkgdGVtcGxhdGUgbXVzdCBub3cgYmUgaW4gc2NvcGUsIGxpa2UgaW4gQysrLCB3aGVuCiAgICAgICAgICAgIGFuIGV4cGxpY2l0IG9yIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIHdpdGggJXRlbXBsYXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA5LTE0OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICVjc2F0dHJpYnV0ZXMgZm9yIGFkZGluZyBDIyBhdHRyaWJ1dGVzIHRvIGVudW0gdmFsdWVzLCBzZWUgZG9jcyBmb3IgZXhhbXBsZS4KCjIwMDktMDktMTE6IHdzZnVsdG9uCgkgICAgRml4IG1lbW1vdmUgcmVncmVzc2lvbiBpbiBjZGF0YS5pIGFzIHJlcG9ydGVkIGJ5IEFkcmlhYW4gUmVudGluZy4KCjIwMDktMDktMDc6IHdzZnVsdG9uCgkgICAgRml4IGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPD0gb3IgPj0uCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gdHlwZSBib29sIGZvciBDKysgCiAgICAgICAgICAgIHdyYXBwZXJzIGFuZCByZW1haW4gYXMgdHlwZSBpbnQgZm9yIEMgd3JhcHBlcnMsIGFzIHBlciBlYWNoIHN0YW5kYXJkOiAKCiAgICAgICAgICAgICAgJiYgfHwgPT0gIT0gPCA+IDw9ID49IChBY3R1YWxseSB0aGUgbGFzdCA0IGFyZSBzdGlsbCBicm9rZW4pLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBBIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBCIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBBX0VRX0IgIEEgPT0gQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwogICAgICAgICAgICAgICNkZWZpbmUgQV9BTkRfQiBBICYmIEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgRml4ICMyODQ1NzQ2LiB0cnVlIGFuZCBmYWxzZSBhcmUgbm93IHJlY29nbmlzZWQga2V5d29yZHMgKG9ubHkgd2hlbiB3cmFwcGluZyBDKyspLgogICAgICAgICAgICBDb25zdGFudHMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub3cgd3JhcHBlZCAoYXMgdHlwZSBib29sKToKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyB0cnVlCiAgICAgICAgICAgICAgI2RlZmluZSBCQVIgRk9PICYmIGZhbHNlCgpWZXJzaW9uIDEuMy40MCAoMTggQXVndXN0IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUGVybF0gQWRkICIjdW5kZWYgZG9fZXhlYyIgdG8gb3VyIGNsZWFuIHVwIG9mIFBlcmwgZ2xvYmFsCgkgICAgbmFtZXNwYWNlIHBvbGx1dGlvbi4KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd3JhcCBhIHJlc291cmNlIHJldHVybmVkIGJ5IF9fZ2V0KCkgaW4gYSBQSFAgb2JqZWN0IChTRiMyNTQ5MjE3KS4KCjIwMDktMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjc5NzQ4NSBBZnRlciBkb2luZyBhICdtYWtlIGNsZWFuJywgaW5zdGFsbCBmYWlscyBpZiB5b2RsMm1hbiBvciB5b2RsMmh0bWwgCiAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBDYXVnaHQgZXhjZXB0aW9ucyBkaXNwbGF5IHRoZSB0eXBlIG9mIHRoZSBDKysgZXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgIGdlbmVyaWMgImMrKy1zaWRlIHRocmV3IGFuIGV4Y2VwdGlvbiIgbWVzc2FnZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBXaGVuICVjYXRjaGVzIGlzIHVzZWQsIGZpeCBzbyB0aGF0IGFueSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgInRocm93cyIKICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSAidGhyb3dzIiB0eXBlbWFwIGFyZSBnZW5lcmF0ZWQgaW50byB0aGUgSmF2YSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZXhjZXB0aW9uIGhhbmRsaW5nIHdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgcmVwb3J0ZWQgYnkgSnVhbiBNYW51ZWwgQWx2YXJlei4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAldGVtcGxhdGUgc2VnIGZhdWx0IG9uIHNvbWUgY2FzZXMgb2Ygb3ZlcmxvYWRpbmcgdGhlIHRlbXBsYXRlZCBtZXRob2QuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBKYW4gS3VwZWMuCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBBZGQgbnVtZXJvdXMgbWlzc2luZyB3cmFwcGVkIG1ldGhvZHMgZm9yIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIGJ5IFlvdXNzZWYgSm9uZXMuCgoyMDA5LTA4LTE0OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBBZGQgU1dJR19Db252ZXJ0UHRyQW5kT3duKCkgbWV0aG9kIGludG8gdGhlIHJ1bnRpbWUgZm9yIHNtYXJ0IHBvaW50ZXIgCiAgICAgICAgICAgIG1lbW9yeSBvd25lcnNoaXAgY29udHJvbC4gc2hhcmVkX3B0ciBzdXBwb3J0IHN0aWxsIHRvIGJlIGFkZGVkLiBQYXRjaCBmcm9tIAogICAgICAgICAgICBEYXZpZCBGbGV0Y2hlci4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBQSFA1IG5vdyB3cmFwcyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcyBkb2N1bWVudGVkLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgUEhQICJjbGFzcyIgZXhhbXBsZSB0byB3b3JrIHdpdGggUEhQNSBhbmQgdXNlCgkgICAgbW9kZXJuIHdyYXBwaW5nIGZlYXR1cmVzLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBzdGQ6OnZlY3RvciB3cmFwcGVycyBvdmVyaGF1bC4gVGhleSBubyBsb25nZXIgcmVxdWlyZSB0aGUgCiAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX3ZlY3RvcigpIG1hY3JvLiBBZGRlZCB3cmFwcGVycyBmb3IgY2FwYWNpdHkoKSBhbmQgcmVzZXJ2ZSgpLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgY29uc3QgcmVmZXJlbmNlIHR5cGVtYXBzLiBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIGFyZQogICAgICAgICAgICBub3cgcGFzc2VkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHBvaW50ZXIgbGlrZSB0aGUgb3RoZXIgdGFyZ2V0IGxhbmd1YWdlcy4KCSAgICBGaXhlcyBTRiMyNTI0MDI5LgoKMjAwOS0wOC0wODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBNb3JlIHVzZXIgZnJpZW5kbHkgQXR0cmlidXRlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgYXJlCiAgICAgICAgICAgIG5vIGNvbnN0cnVjdG9ycyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm94eSBjbGFzcyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUKICAgICAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3QgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIC0gY2xhc3MgaXMgYWJzdHJhY3QiIHdoZXJlYXMgaWYgdGhlcmUgYXJlIG5vCiAgICAgICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIGFueSBvdGhlciByZWFzb24gYW5kIHRoZSBjbGFzcyBpcyBub3QgYWJzdHJhY3QsCiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiLgogICAgICAgICAgICBbdGNsXSBTaW1pbGFybHkgZm9yIHRjbCB3aGVuIHVzaW5nIC1pdGNsLgoKMjAwOS0wOC0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggUEhQIDUuMy4KCjIwMDktMDgtMDQ6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVmFyaW91cyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zICh3aGljaCB3b3VsZCBjb25mbGljdAogICAgICAgICAgICB3aXRoIHRoZSBidWlsdC1pbiBQSFAgb25lcykgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnkKICAgICAgICAgICAgYWRkaW5nIGEgJ2NfJyBwcmVmaXguCgoyMDA5LTA4LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBzdGQ6OnZlY3RvcjxUPiBpbXBsZW1lbnRhdGlvbiBpcyBpbXByb3ZlZCBhbmQgbm93IHVzZXMgJHR5cGVtYXAgc3VjaAogICAgICAgICAgICB0aGF0IHRoZSBwcm94eSBjbGFzcyBmb3IgVCBubyBsb25nZXIgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiBzb21lIG1hY3JvcwogICAgICAgICAgICBmb3IgY29ycmVjdCBDIyBjb21waWxhdGlvbjsgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQsIHdoZXJlCiAgICAgICAgICAgIENTVFlQRSB3YXMgdGhlIEMjIHR5cGUgZm9yIHRoZSBDKysgY2xhc3MgQ1RZUEU6CgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgdXNhZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlcgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkUoQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aDoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKENUWVBFKQoKICAgICAgICAgICAgU29tZSBtb3JlIGRldGFpbHMgaW4gY3NoYXJwL3N0ZF92ZWN0b3IuaQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA3LTMxOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGluZGVudGF0aW9uIHNvIHRoYXQgd2UgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiB0aGUKCSAgICBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkLiAgUGF0Y2ggZnJvbSBHYWV0YW4gTGVobWFubiBpbiBTRiMyODI5ODUzLgoKMjAwOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgQWRkICR0eXBlbWFwKG1ldGhvZCwgdHlwZWxpc3QpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8uIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhIHR5cGVtYXAgdG8gYmUgaW5zZXJ0ZWQgd2l0aGluIGFub3RoZXIgdHlwZW1hcC4KICAgICAgICAgICAgRnVsbHkgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0wNy0yOTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBTdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbm93IHByZWZpeGVkIHdpdGggdGhlCiAgICAgICAgICAgIGNsYXNzIG5hbWUuIFRoaXMgYWxsb3dzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgY2xhc3Nlcy4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBsb2NrcyB0byBzdGQ6Om1hcCB3cmFwcGVycy4gIFBhdGNoIGZyb20gCgkgICAgUGF1bCBIYW1wc29uIGluIFNGIzI4MTM4MzYuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCBPVVRQVVQgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBIaXRvc2hpCgkgICAgQW1hbm8gaW4gU0YjMjgyNjMyMi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIHJlc291cmNlIGRlc3RydWN0b3IgZm9yIGNsYXNzZXMKCSAgICB3aXRob3V0IGEgZGVzdHJ1Y3RvciBhbmQgbm9uLWNsYXNzIHR5cGVzLiAgUGF0Y2ggZnJvbSBIaXRvc2hpIEFtYW5vCgkgICAgaW4gU0YjMjgyNTMwMy4KCjIwMDktMDctMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgd2FybmluZ3MgYWJvdXQgY2xhc2hlcyBiZXR3ZWVuIGlkZW50aWZpZXJzIGFuZCBQSFAKCSAgICBrZXl3b3JkcyBhbmQgYXV0b21hdGljIHJlbmFtaW5nIHRvIHdvcmsgd2l0aCB0aGUgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXJzLiAgRml4ZXMgU0YjMTYxMzY3OS4KCjIwMDktMDctMjg6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gSWYgYSBtZW1iZXIgZnVuY3Rpb24gaXMgbm90IHB1YmxpYyBidXQgaXQgaGFzIGEgYmFzZQogICAgICAgICAgICB3aGljaCBpcyBwdWJsaWMsIHRoZW4gbm93IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kIHRoZSBtZW1iZXIKICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBwdWJsaWMsIGFzIFBIUCByZXF1aXJlcyB0aGlzLgoKMjAwOS0wNy0yMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkLgoKMjAwOS0wNy0xNTogb2xseQoJICAgIFtQZXJsXSBEb24ndCBzcGVjaWZ5IFBlcmwgcHJvdG90eXBlICIoKSIgZm9yIGEgY29uc3RydWN0b3Igd2l0aCBhCgkgICAgZGlmZmVyZW50IG5hbWUgdG8gdGhlIGNsYXNzLCBhcyBzdWNoIGNvbnN0cnVjdG9ycyBjYW4gc3RpbGwgdGFrZQoJICAgIHBhcmFtZXRlcnMuCgoyMDA5LTA3LTEyOiB4YXZpZXI5OAoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgMy4yIEFQSQoKMjAwOS0wNy0wNTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdCBvZiBQSFAga2V5d29yZHMgLSAiY2Z1bmN0aW9uIiBpcyBubyBsb25nZXIgYQoJICAgIGtleXdvcmQgaW4gUEhQNSBhbmQgUEhQIDUuMyBhZGRlZCAiZ290byIsICJuYW1lc3BhY2UiLCAiX19ESVJfXyIsCgkgICAgYW5kICJfX05BTUVTUEFDRV9fIi4KCjIwMDktMDctMDM6IG9sbHkKCSAgICBbVGNsXSBUbyBjb21wbGVtZW50IFVTRV9UQ0xfU1RVQlMsIGFkZCBzdXBwb3J0IGZvciBVU0VfVEtfU1RVQlMKCSAgICBhbmQgU1dJR19UQ0xfU1RVQlNfVkVSU0lPTi4gIERvY3VtZW50IGFsbCB0aHJlZSBpbiB0aGUgVGNsIGNoYXB0ZXIKCSAgICBvZiB0aGUgbWFudWFsLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBTRiMyODEwMzgwIGJ5IENocmlzdGlhbgoJICAgIEdvbGx3aXR6ZXIuCgoyMDA5LTA3LTAyOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZGVkIGZhY3RvcnkuaSBmb3IgUEhQLCBzZWUgdGhlIGxpX2ZhY3RvcnkgdGVzdGNhc2UKICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIGl0LgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1XYWxsa3cgb3B0aW9uIGFzIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gYSBuZXN0ZWQgc3RydWN0IGNvbnRhaW5zIGEgY29tbWVudCBjb250YWluaW5nIGEgKiBmb2xsb3dlZCAKICAgICAgICAgICAgZXZlbnR1YWxseSBieSBhIC8uIFJlZ3Jlc3Npb24gZnJvbSAxLjMuMzcsIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFVua25vd24gcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgaW4gcHJveHkKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRml4ZWQgJW5ld29iamVjdCBiZWhhdmlvdXIsIHByZXZpb3VzbHkgYW55IG1ldGhvZAogICAgICAgICAgICBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IHdhcyBoYW5kbGVkIGFzIGEgY29uc3RydWN0b3IuCgoyMDA5LTA2LTMwOiBvbGx5CgkgICAgW1J1YnldIFVuZGVmaW5lIGNsb3NlIGFuZCBjb25uZWN0IG1hY3JvcyBkZWZpbmVkIGJ5IFJ1YnkgQVBJCgkgICAgaGVhZGVycyBhcyB3ZSBkb24ndCBuZWVkIHRoZW0gYW5kIHRoZXkgY2FuIGNsYXNoIHdpdGggQysrIG1ldGhvZHMKCSAgICBiZWluZyB3cmFwcGVkLiAgUGF0Y2ggZnJvbSBWaXQgT25kcnVjaCBpbiBTRiMyODE0NDMwLgoKMjAwOS0wNi0yNjogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gaGFuZGxlIEZJWE5VTSB2YWx1ZXMgZ3JlYXRlciB0aGFuIE1BWElOVCBwYXNzZWQgZm9yIGEKCSAgICBkb3VibGUgcGFyYW1ldGVyLgoKMjAwOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgdGhlIGNvbXBhY3RkZWZhdWx0YXJncyBmZWF0dXJlIAogICAgICAgICAgICB3aGVyZSBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhbmQgaXMgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLiBUaGUgU3dpZ1ZhbHVlV3JhcHBlcgogICAgICAgICAgICB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBhIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSAKICAgICAgICAgICAgZ2VuZXJhdGVkIGRvZXMgbm90IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDA5LTA2LTE2OiB3c2Z1bHRvbgoJICAgIFtKYXZhLEMjXSBGaXggZW51bSBtYXJzaGFsbGluZyB3aGVuICVpZ25vcmUgaXMgdXNlZCBvbiBvbmUgb2YgdGhlIGVudW0gaXRlbXMuCiAgICAgICAgICAgIEluY29ycmVjdCBlbnVtIHZhbHVlcyB3ZXJlIGJlaW5nIHBhc3NlZCB0byB0aGUgQysrIGxheWVyIG9yIGNvbXBpbGF0aW9uIGVycm9ycyByZXN1bHRlZC4KCjIwMDktMDYtMDI6IHRhbGJ5CgkgICAgW1BlcmxdIFJlc29sdmVkIHJlZmVyZW5jZS5pIG92ZXJsb2FkIHN1cHBvcnQgcHJvYmxlbQoJICAgIGlkZW50aWZpZWQgYnkgSm9obiBQb3Rvd3NreS4KCjIwMDktMDUtMjY6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6Om1hcCB3cmFwcGVycyBiYXNlZCBvbiBwYXRjaCBmcm9tIFl1dmFsIEJhcm9yLiBUaGUgQyMgcHJveHkKICAgICAgICAgICAgbm93IGltcGxlbWVudHMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCgkgICAgVGhlc2Ugc3RkOm1hcCB3cmFwcGVycyBoYXZlIGEgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG92ZXJoYXVsIHRvIG1ha2UgdGhlbQogICAgICAgICAgICBsaWtlIGEgLk5FVCBJRGljdGlvbmFyeS4gU29tZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIGFzIGZvbGxvd2luZzoKICAgICAgICAgICAgICBzZXQgLT4gc2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgZ2V0IC0+IGdldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGhhc19rZXkgLT4gQ29udGFpbnNLZXkKICAgICAgICAgICAgICBkZWwgLT4gUmVtb3ZlCiAgICAgICAgICAgICAgY2xlYXIgLT4gQ2xlYXIKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHVzZWQgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciB3b3JrOgogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9rZXkKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fdmFsdWUKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA1LTIwOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZCB0aGUgJ3RoaXNvd24nIG1lbWJlciB0byBjbGFzc2VzLiBUaGUgdXNhZ2Ugb2YgaXQKICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIFB5dGhvbiB0aGlzb3duIG9uZTogaXQncyAxIGJ5IGRlZmF1bHQgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gc2V0IGl0IHRvIDAgaWYgeW91IHdhbnQgdG8gcHJldmVudCBmcmVlaW5nIGl0LiAoRm9yCiAgICAgICAgICAgIGV4YW1wbGUgdG8gcHJldmVudCBhIGRvdWJsZSBmcmVlLikKCjIwMDktMDUtMTQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHdyb25nIHBvaW50ZXIgdmFsdWUgcmV0dXJuZWQgYnkgU3dpZ1B5T2JqZWN0X3JlcHIoKS4KCjIwMDktMDUtMTM6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBNaW5vciB0d2VhayB3aGVuIHdyYXBwaW5nIGluIC1ub2N3cmFwIG1vZGUuCgoyMDA5LTA1LTExOiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb24gdGhlIEMjIHByb3h5IHNpZGUgZnJvbSBZdXZhbCBCYXJvci4gVGhlc2UKCSAgICBpbXBsZW1lbnQgSUxpc3Q8PiBpbnN0ZWFkIG9mIElFbnVtZXJhYmxlPD4gd2hlcmUgcG9zc2libGUuCgoyMDA5LTA0LTI5OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gQWRkIHRoZSAnbm90ZGVyaXZlZCcgYXR0cmlidXRlIHRvIHRoZSBqYXZhYmFzZSBhbmQgY3NiYXNlIHR5cGVtYXBzLgoJICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgdHlwZW1hcCB3aWxsIG5vdCBhcHBseSB0byBjbGFzc2VzIHRoYXQgYXJlIGRlcml2ZWQKCSAgICBmcm9tIGEgQysrIGJhc2UgY2xhc3MsIGVnIAoJICAgICAgJXR5cGVtYXAoY3NiYXNlLCBub3RkZXJpdmVkPSIxIikgU1dJR1RZUEUgIkNvbW1vbkJhc2UiCgoyMDA5LTA0LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBHSUwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZQoJICAgIGtub3cgdGhhdCBpdCB3aWxsIGFscmVhZHkgYmUgbG9ja2VkLiAgVGhpcyBhdm9pZHMgc29tZSBkZWFkLWxvY2tzCgkgICAgd2l0aCBtb2RfcHl0aG9uIChkdWUgdG8gbW9kX3B5dGhvbiBidWdzIHdoaWNoIGFyZSBhcHBhcmVudGx5CgkgICAgdW5saWtlbHkgdG8gZXZlciBiZSBmaXhlZCksIGFuZCByZXN1bHRzIGluIHNtYWxsZXIgd3JhcHBlcnMgd2hpY2gKCSAgICBydW4gYSBsaXR0bGUgZmFzdGVyIChpbiB0ZXN0cyB3aXRoIFhhcGlhbiBvbiB4ODYtNjQgVWJ1bnR1IDkuMDQsCgkgICAgdGhlIHN0cmlwcGVkIHdyYXBwZXIgbGlicmFyeSB3YXMgMTElIHNtYWxsZXIgYW5kIHJhbiAyLjclIGZhc3RlcikuCgoyMDA5LTA0LTIxOiB3c2Z1bHRvbgoJICAgIFtDI10gRml4ICMyNzUzNDY5IC0gYm9vbCAmT1VUUFVUIGFuZCBib29sICpPVVRQVVQgdHlwZW1hcHMgaW5pdGlhbGlzYXRpb24uCgoyMDA5LTA0LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCAjMjc0Njg1OCAtIEMgbWFjcm8gZXhwcmVzc2lvbiB1c2luZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCgoyMDA5LTAzLTMwOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlZmF1bHQgb3V0IHR5cGVtYXAgZm9yIGNoYXJbQU5ZXSBub3cgcmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGEKCSAgICB6ZXJvIGJ5dGUsIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlmIHRoZXJlIGlzIG5vIHplcm8gYnl0ZS4gIFRoaXMKCSAgICBpcyB0aGUgc2FtZSBhcyBQeXRob24gZG9lcywgYW5kIHNlZW1zIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0aGFuCgkgICAgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgdGhlIHdob2xlIGNvbnRlbnRzIG9mIHRoZSBhcnJheQoJICAgIGluY2x1ZGluZyBhbnkgemVybyBieXRlcy4gIElmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UgY2FuIHByb3ZpZGUKCSAgICB5b3VyIG93biB0eXBlbWFwIHRvIGRvIHRoaXM6CgoJICAgICV0eXBlbWFwKG91dCkgY2hhciBbQU5ZXQoJICAgICV7CgkJUkVUVkFMX1NUUklOR0woJDEsICQxX2RpbTAsIDEpOwoJICAgICV9CgpWZXJzaW9uIDEuMy4zOSAoMjEgTWFyY2ggMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAzLTE5OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSBtZW1vcnkgbGVhayByZWxhdGVkIHRvIFB5dGhvbiAzIHVuaWNvZGUgYW5kIEMgY2hhciogY29udmVyc2lvbiwKICAgICAgICAgICAgd2hpY2ggY2FuIGJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiZWZvcmUgdGhpcyBmaXg6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmcm9tIGxpX2NzdHJpbmcgaW1wb3J0ICoKICAgICAgICAgICAgICAgICAgaT0wCiAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdHIoaSkqMTAKICAgICAgICAgICAgICAgICAgICAgIHRlc3QzKG4pCgogICAgICAgICAgICBUaGlzIGZpeCBhZmZlY3RlZCBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBzbyB5b3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgIGEgbnVsbCBhbGxvYyBhbmQgbm9uLW51bGwgY3B0ciBhcmd1bWVudCBpbiBQeXRob24gMywgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvcgogICAgICAgICAgICB3aWxsIGJlIHJhaXNlZC4KCjIwMDktMDMtMTg6IHdzZnVsdG9uCgkgICAgW0MjXSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGltcHJvdmVtZW50cyBmb3IgLk5FVCAyIGFuZCBhbHNvIHByb3ZpZGluZyB0aGUKCSAgICBuZWNlc3NhcnkgbWFjaGluZXJ5IHRvIHVzZSB0aGUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlcnMgd2l0aCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2gKCSAgICBhcyBMSU5RIC0gdGhlIEMjIHByb3h5IGNsYXNzIG5vdyBkZXJpdmVzIGZyb20gSUVudW1lcmFibGU8Pi4gVGhlIGRlZmF1bHQgaXMgbm93IHRvIAoJICAgIGdlbmVyYXRlIGNvZGUgcmVxdWlyaW5nIC5ORVQgMiBhcyBhIG1pbmltdW0sIGFsdGhvdWdoIHRoZSBDIyBjb2RlIGNhbiBiZSBjb21waWxlZCAKCSAgICBmb3IgLk5FVCAxIGJ5IGRlZmluaW5nIHRoZSBTV0lHX0RPVE5FVF8xIEMjIHByZXByb2Nlc3NvciBjb25zdGFudC4gU2VlIHRoZSAKCSAgICBzdGRfdmVjdG9yLmkgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggIzI2NzY3MzggU1dJRyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBTb21lIGZpeGVzIGZvciBQeXRob24gMy4wLjEgYW5kIGhpZ2hlciBzdXBwb3J0LiBJbiAzLjAuMSwgdGhlIEMgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgIFB5T2JqZWN0X0NvbXBhcmUgaXMgcmVtb3ZlZCwgc28gUHlPYmplY3RfUmljaENvbXBhcmVCb29sIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgICBTdHJ1Y3QgaW5pdGlsaXphdGlvbiBvZiBTd2lnUHlPYmplY3QgYW5kIFN3aWdQeU9iamVjdF9hc19udW1iZXIgY2hhbmdlZCB0byByZWZsZWN0CiAgICAgICAgICAgIHRoZSBkcm9wIG9mIHRwX2NvbXBhcmUgYW5kIG5iX2xvbmcuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1ODMxNjAuIE5vdyB0aGUgaW1wb3J0ZXIgaW4gUHl0aG9uIHNoYWRvdyB3cmFwcGVyIHRha2UgY2FyZSBvZiB0aGUKICAgICAgICAgICAgY2FzZSB0aGF0IG1vZHVsZSBhbHJlYWR5IGltcG9ydGVkIGF0IG90aGVyIHBsYWNlLgoKMjAwOS0wMi0yODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNjM3MzUyLiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiBvZiBTV0lHX21vZHVsZSBpbiBweWluaXQuc3dnIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIGNhbGxzLCBzaW5jZSBzb21lIEMgY29tcGlsZXIgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb24gaW4gbWlkZGxlIG9mIGZ1bmN0aW9uCiAgICAgICAgICAgIGJvZHkuCgoyMDA5LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc29tZSBjb25zdGFudCB2YXJpYWJsZSAoJWNvbnN0YW50KSB0eXBlcy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgW0NGRkldIEZpeCBzZWcgZmF1bHRzIHdoZW4gZm9yICVleHRlbmQgYW5kIHVzaW5nIHN0YXRlbWVudHMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIEZpeCBTRiAjMjYwNTk1NTogLWNvIG9wdGlvbiB3aGljaCBicm9rZSBpbiAxLjMuMzcuIAoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBOZXcgJWluc2VydCgiYmVnaW4iKSBzZWN0aW9uIGFkZGVkLiBBbHNvIGNhbiBiZSB1c2VkIGFzICViZWdpbi4gVGhpcyBpcyBhIG5ldwoJICAgIGNvZGUgc2VjdGlvbiByZXNlcnZlZCBlbnRpcmVseSBmb3IgdXNlcnMgYW5kIHRoZSBjb2RlIHdpdGhpbiB0aGUgc2VjdGlvbiBpcyBnZW5lcmF0ZWQKCSAgICBhdCB0aGUgdG9wIG9mIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUgYW5kIHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gcHV0IGN1c3RvbSBjb2RlCgkgICAgaW50byB0aGUgd3JhcHBlciBmaWxlIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCgoyMDA5LTAyLTE3OiB3c2Z1bHRvbgoJICAgICdtYWtlIGNsZWFuLXRlc3Qtc3VpdGUnIHdpbGwgbm93IHJ1biBjbGVhbiBvbiBBTEwgbGFuZ3VhZ2VzLiBQcmV2aW91c2x5IGl0IG9ubHkKCSAgICByYW4gdGhlIGNvcnJlY3RseSBjb25maWd1cmVkIGxhbmd1YWdlcy4gVGhpcyB3YXkgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNsZWFuIHVwCgkgICAgcHJvcGVybHkgYWZ0ZXIgcnVubmluZyAnbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZScuCgoyMDA5LTAyLTE0OiB3c2Z1bHRvbgoJICAgIEV4dGVuZCBhdHRyaWJ1dGUgbGlicmFyeSBzdXBwb3J0IGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgdXNlCgkgICAgcGFzcy9yZXR1cm4gYnkgdmFsdWUgc2VtYW50aWNzLiBUd28gbmV3IG1hY3JvcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2FnZSBpcyBpZGVudGljYWwKCSAgICB0byAlYXR0cmlidXRlLiBUaGVzZSBhcmUgJWF0dHJpYnV0ZXZhbCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCAlYXR0cmlidXRlc3RyaW5nIGZvcgoJICAgIHN0cmluZyBjbGFzc2VzLCBsaWtlIHN0ZDo6c3RyaW5nLiBTZWUgYXR0cmlidXRlLnN3ZyBmb3IgbW9yZSBkZXRhaWxzLgoKMjAwOS0wMi0xMzogd3NmdWx0b24KCSAgICBBZGQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMuIFByZXZpb3VzbHkgdGhlIG1lbWJlcmluIHR5cGVtYXBzIHdlcmUKCSAgICBpZ25vcmVkIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCgoyMDA5LTAyLTEyOiB3c2Z1bHRvbgoJICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZW1wb3JhcnkgdmFyaWFibGUgd2hlbiB3cmFwcGluZyByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZXMuIAoJICAgIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGNvZGUgZm9yIHdyYXBwaW5nOgoKCSAgICAgIHN0cnVjdCBYWVogewoJCXN0ZDo6c3RyaW5nJiByZWZSZXR1cm4oKTsKCSAgICAgIH07CgoJICAgIHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmX3Jlc3VsdF9yZWYgPSAoYXJnMSktPnJlZlJldHVybigpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICZfcmVzdWx0X3JlZjsKICAgICAgICAgICAgICB9CgoJICAgICBOb3cgaXQgaXM6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJihhcmcxKS0+cmVmUmV0dXJuKCk7CgoyMDA5LTAyLTA4OiBiaHkKICAgICAgICAgICAgQ2hhbmdlIHRoZSBTSVpFIG1hcHBlZCBieSAlcHlidWZmZXJfbXV0YWJsZV9iaW5hcnkgYW5kICVweWJ1ZmZlcl9iaW5hcnkgaW4gcHlidWZmZXIuaSBmcm9tCiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIuCgoyMDA5LTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWZlYXR1cmUgbm90IHdvcmtpbmcgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCByZXBvcnRlZCBieSBNYXR0IFNwcmFndWUsIGZvciBleGFtcGxlOgoJICAgICAgJWZlYXR1cmUoImNzOm1ldGhvZG1vZGlmaWVycyIpIG9wZXJhdG9yIGJvb2wgInByb3RlY3RlZCI7CgoyMDA5LTAyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIEFwcGx5ICMyMDgxOTY3IGNvbmZpZ3VyZSBjaGFuZ2VzIGZvciBleGFtcGxlcyB0byBidWlsZCB3aXRoIHJlY2VudCBQTFQgdmVyc2lvbnMuCgkgICAgQWxzbyBmaXhlcyBNYWtlZmlsZSBlcnJvcnMgYnVpbGRpbmcgU1dJRyBleGVjdXRhYmxlIHdoZW4gbXpzY2hlbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQgCgkgICAgKHZlcnNpb24gMy43MiBhcHByb3ggYW5kIGxhdGVyKS4KCjIwMDktMDItMDQ6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBGaXggU0YjMjU2NDE5MiByZXBvcnRlZCBieSBEYXZpZCBLb2xvdnJhdG5rLgogICAgICAgICAgICBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBub3cgaGFuZGxlcyAiZ2V0IiBtYWdpYy4KClZlcnNpb24gMS4zLjM4ICgzMSBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTI0ODggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIE5vdyAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICBhbmQgJXB5dGhvbmFwcGVuZCBoYXZlIGNvcnJlY3QgaW5kZW50YXRpb24uCgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTIwNDggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIFRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICBvZiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm94eSBjb2RlIHNob3VsZCBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgJ3NlbGYnIHBhcmFtZXRlci4KCjIwMDktMDEtMjk6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAxLjMuMzcgd2hlcmUgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeQoJICAgIGZvciB0YXJnZXQgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgKGluIHRoZSBhYnNlbmNlIG9mIC1vdXRkaXIpIHdhcyBubwoJICAgIGxvbmdlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdlbmVyYXRlZCBjL2MrKyBmaWxlLgoKMjAwOS0wMS0yODogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEZpeCBwcm94eSBjbGFzcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBnbG9iYWwgc2NvcGUgb3BlcmF0b3IKCSAgICB3YXMgdXNlZCBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUuIFJlcG9ydGVkIGJ5IERhdmlkIFBpZXBncmFzcy4KCjIwMDktMDEtMTU6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBzZWcgZmF1bHQgd2hlbiBydW5uaW5nIHdpdGggLXYgb3B0aW9uLCByZXBvcnRlZCBieSBKb2huIEt5LgoKVmVyc2lvbiAxLjMuMzcgKDEzIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMTM6IG1nb3NzYWdlCgkgICAgW0x1YV0gQWRkZWQgY29udHJhY3Qgc3VwcG9ydCBmb3IgcmVxdWlyaW5nIHRoYXQgdW5zaWduZWQgbnVtYmVycyBhcmUgPj0wCgkgICAgUmV3cm90ZSBtdWNoIG9mIEV4YW1wbGVzL0x1YS9lbWJlZDMuIAoJICAgIEFkZGVkIGEgbG90IHRvIHRoZSBMdWEgZG9jdW1lbnRhdGlvbi4KCjIwMDktMDEtMTM6IHdzZnVsdG9uCgkgICAgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgZGlyZWN0b3JzIG9uIHByb3RlY3RlZCB2aXJ0dWFsIG92ZXJsb2FkZWQgCgkgICAgbWV0aG9kcyByZXBvcnRlZCBieSBTYW0gSGVuZGxleS4KCjIwMDktMDEtMTI6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBoYW5kbGluZyBvZiBpbnRlZ2VyIGFycmF5cwoKMjAwOS0wMS0xMDogZHJqb2UKCSAgICBbUl0gRml4IGludGVnZXIgaGFuZGxpbmcgaW4gciB0byBkZWFsIGNvcnJlY3RseSB3aXRoIHNpZ25lZAoJICAgIGFuZCB1bnNpZ25lZCBpc3N1ZXMKCjIwMDktMDEtMTA6IHdzZnVsdG9uCgkgICAgUGF0Y2ggICMxOTkyNzU2IGZyb20gQ29saW4gTWNEb25hbGQgLSAlY29udHJhY3Qgbm90IHdvcmtpbmcgZm9yIGNsYXNzZXMgCgkgICAgaW4gbmFtZXNwYWNlCgoyMDA5LTAxLTA1OiBvbGx5CgkgICAgTWFyayBTV0lHUEVSTDUsIFNXSUdQSFA1LCBhbmQgU1dJR1RDTDggYXMgZGVwcmVjYXRlZCBpbiB0aGUgc291cmNlCgkgICAgY29kZSBhbmQgcmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgdGhlbS4KCjIwMDgtMTItMzA6IHdzZnVsdG9uCgkgICAgQnVnICMyNDMwNzU2LiBBbGwgdGhlIGxhbmd1YWdlcyBub3cgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgZmlsZSBpbmRpY2F0aW5nIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHdyYXBwZWQuIFRoZSBtYWNybyBuYW1lIGlzIHRoZQoJICAgIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcnVuLCBlZyBTV0lHSkFWQSwgU1dJR09DVEFWRSwgU1dJR0NTSEFSUCBldGMKCSAgICBhbmQgYXJlIGxpc3RlZCBpbiB0aGUgIkNvbmRpdGlvbmFsIENvbXBpbGF0aW9uIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAwOC0xMi0yMzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMyMTUzNzczIC0gJW5vamF2YWV4Y2VwdGlvbiB3YXMgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgIGluc3RlYWQgb2YgZGlzYWJsaW5nIGl0LiBDbGVhcmluZyBjaGVja2VkIEphdmEgZXhjZXB0aW9ucyBhbHNvIGRpZG4ndCB3b3JrLiAKCSAgICBUaGUgbmV3ICVjbGVhcmphdmFleGNlcHRpb24gY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZS4KCjIwMDgtMTItMjI6IHdzZnVsdG9uCgkgICAgRml4ICMyNDMyODAxIC0gTWFrZSBTd2lnVmFsdWVXcmFwcGVyIGV4Y2VwdGlvbiBzYWZlIGZvciB3aGVuIGNvcHkgY29uc3RydWN0b3JzCgkgICAgdGhyb3cgZXhjZXB0aW9ucy4KCjIwMDgtMTItMjE6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzI0NDAwNDYgd2hpY2ggZml4ZXMgcG9zc2libGUgc2VnIGZhdWx0cyBmb3IgbWVtYmVyIGFuZCBnbG9iYWwKCSAgICB2YXJpYWJsZSBjaGFyIGFycmF5cyB3aGVuIHRoZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIGFycmF5IHNpemUuCgoyMDA4LTEyLTIwOiB3c2Z1bHRvbgoJICAgIFRoZSBjY2FjaGUgY29tcGlsZXIgY2FjaGUgaGFzIGJlZW4gYWRhcHRlZCB0byB3b3JrIHdpdGggU1dJRyBhbmQKCSAgICBuYW1lZCBjY2FjaGUtc3dpZy4gSXQgbm93IHdvcmtzIHdpdGggQy9DKysgY29tcGlsZXJzIGFzIHdlbGwgYXMgU1dJRwoJICAgIGFuZCBjYW4gcmVzdWx0IGluIGltcHJlc3NpdmUgc3BlZWR1cHMgd2hlbiB1c2VkIHRvIHJlY29tcGlsZSB1bmNoYW5nZWQKCSAgICBjb2RlIHdpdGggZWl0aGVyIGEgQy9DKysgY29tcGlsZXIgb3IgU1dJRy4gRG9jdW1lbnRhdGlvbiBpcyBpbiBDQ2FjaGUuaHRtbAoJICAgIG9yIHRoZSBpbnN0YWxsZWQgY2NhY2hlLXN3aWcgbWFuIHBhZ2UuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoIGZyb20gS2FseWFub3YgRG1pdHJ5IHdoaWNoIGZpeGVzIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHMKCSAgICBjb250YWluaW5nIGNvbW1lbnRzLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBGaXggZXJyb3IgbWVzc2FnZSBpbiBzb21lIG5lc3RlZCBzdHJ1Y3QgYW5kICVpbmxpbmUgcGFyc2luZyBlcnJvciBzaXR1YXRpb25zCgkgICAgc3VjaCBhcyB1bnRlcm1pbmF0ZWQgc3RyaW5ncyBhbmQgY29tbWVudHMuCgoyMDA4LTEyLTA3OiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVyIHdpdGggR0NDIDQuMy4KCjIwMDgtMTItMDY6IHdzZnVsdG9uCgkgICAgW1BIUF0gRGVwcmVjYXRlICVwcmFnbWEocGhwNCkuIFBsZWFzZSB1c2UgJXByYWdtYShwaHApIGluc3RlYWQuCgkgICAgVGhlIGZvbGxvd2luZyB0d28gd2FybmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQ6CgkgICAgV0FSTl9QSFA0X01VTFRJUExFX0lOSEVSSVRBTkNFIC0+IFdBUk5fUEhQX01VTFRJUExFX0lOSEVSSVRBTkNFCgkgICAgV0FSTl9QSFA0X1VOS05PV05fUFJBR01BICAgICAgIC0+IFdBUk5fUEhQX1VOS05PV05fUFJBR01BCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoIFNGIzIxNTg5Mzg6IGFsbCB0aGUgU1dJRyBzeW1ib2wgbmFtZXMgc3RhcnRlZCB3aXRoIFB5CiAgICAgICAgICAgIGFyZSBjaGFuZ2VkLCBzaW5jZSB0aGV5IGFyZSBpbmFwcHJvcHJpYXRlIGFuZCBkaXNjb3VyYWdlZCBpbiBQeXRob24KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiAoZnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNS4yL2FwaS9pbmNsdWRlcy5odG1sKToKCiAgICAgICAgICAgICJBbGwgdXNlciB2aXNpYmxlIG5hbWVzIGRlZmluZWQgYnkgUHl0aG9uLmggKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGJ5CiAgICAgICAgICAgIHRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgTmFtZXMgYmVnaW5uaW5nIHdpdGggIl9QeSIgYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLiBTdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIGRvCiAgICAgICAgICAgIG5vdCBoYXZlIGEgcmVzZXJ2ZWQgcHJlZml4LgoKICAgICAgICAgICAgSW1wb3J0YW50OiB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQgamVvcGFyZGl6ZXMgdGhlIHBvcnRhYmlsaXR5IG9mIHRoZSB1c2VyCiAgICAgICAgICAgIGNvZGUgdG8gZnV0dXJlIFB5dGhvbiB2ZXJzaW9ucywgd2hpY2ggbWF5IGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGJlZ2lubmluZwogICAgICAgICAgICB3aXRoIG9uZSBvZiB0aGVzZSBwcmVmaXhlcy4iCgogICAgICAgICAgICBIZXJlIGlzIGEgYnJpZWYgbGlzdCBvZiB3aGF0IGNoYW5nZWQ6CgogICAgICAgICAgICAgICAgUHlTd2lnKiAtPiBTd2lnUHkqCiAgICAgICAgICAgICAgICBQeU9iamVjdF9wdHIgLT4gU3dpZ1B0cl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlPYmplY3RfdmFyIC0+IFN3aWdWYXJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQmFzZSwgUHlTZXF1ZW5jZV9Db250LCBQeVNlcXVlbmNlX1JlZiAtPgogICAgICAgICAgICAgICAgICAgICAgICBTd2lnUHlTZXF1ZW5jZV9CYXNlLCBTd2lnUHlTZXF1ZW5jZV9Db250LCBTd2lnUHlTZXF1ZW5jZV9SZWYKICAgICAgICAgICAgICAgIFB5TWFwKiAtPiBTd2lnUHlNYXAqCgogICAgICAgICAgICBXZSBwcm92aWRlZCBhIHB5bmFtZV9jb21wYXQuaSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlcnMgd2hvc2UgY29kZSBoYXZpbmcKICAgICAgICAgICAgdGhlc2Ugc3ltYm9scyBhbmQgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IGNvdWxkIHNpbXBseSBpbmNsdWRlIHRoaXMgZmlsZQogICAgICAgICAgICBhdCBmcm9udCBvZiB5b3VyIGNvZGUuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJ1biB0aGUgY29udmVydGluZyB0b29sIG9uCiAgICAgICAgICAgIHlvdXIgY29kZSwgd2hpY2ggaGFzIGJlZW4gcHV0IGluIFNXSUcncyBTVk4gdHJ1bmsgKFRvb2xzL3B5bmFtZV9wYXRjaC5weSkgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gZG93bmxvYWQgaXQgaGVyZToKICAgICAgICAgICAgaHR0cHM6Ly9zd2lnLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9zd2lnL3RydW5rL1Rvb2xzL3B5bmFtZV9wYXRjaC5weSAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjE0MzcyNyBmcm9tIFNlcmdlIE1vbmtld2l0eiB0byBmaXggaW1wb3J0aW5nIGJhc2UgY2xhc3NlcyAKCSAgICB3aGVuIHRoZSBwYWNrYWdlIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gJW1vZHVsZSBhbmQgdGhhdCBtb2R1bGUgaXMgJWltcG9ydCdlZC4KCjIwMDgtMTEtMjg6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4ICMyMDgwNDk3LiBTb21lIGluY29ycmVjdCBhY2NlcHRhbmNlIG9mIHR5cGVzIGluIHRoZSBTVEwsIGVnIGEgZG91YmxlICogZWxlbWVudAoJICAgIHBhc3NlZCBpbnRvIGEgdmVjdG9yPGludCAqPiBjb25zdHJ1Y3RvciB3b3VsZCBiZSBhY2NlcHRlZCwgYnV0IHRoZSBlbnN1aW5nIGJlaGF2aW91cgoJICAgIHdhcyB1bmRlZmluZWQuIE5vdyB0aGUgdHlwZSBjb252ZXJzaW9uIGNvcnJlY3RseSByYWlzZXMgYW4gZXhjZXB0aW9uLgoKMjAwOC0xMS0yNDogd3NmdWx0b24KCSAgICBBZGQgLW91dGN1cnJlbnRkaXIgb3B0aW9uLiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY3VycmVudCAKCSAgICBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGVuYWJsZXMKCSAgICBiZWhhdmlvdXIgc2ltaWxhciB0byBjL2MrKyBjb21waWxlcnMuIE5vdGUgdGhhdCB0aGlzIGNvbnRyb2xzIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAoJICAgIGJ1dCBvbmx5IGluIHRoZSBhYnNlbmNlIG9mIHRoZSAtbyBhbmQvb3IgLW91dGRpciBvcHRpb25zLgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBbcnVieV0gQXBwbHkgcGF0Y2ggIzIyNjM4NTAgdG8gZml4IHJ1YnkvZmlsZS5pIC4uLiBydWJ5aW8uaCBmaWxlbmFtZSBjaGFuZ2UgaW4gCgkgICAgcnVieSAxLjkuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyMzE5NzkwIGZyb20gSm9oYW4gSGFrZSB0byBmaXggc2hhcmVkX3B0ciB1c2FnZSBpbiBzdGQ6OnRyMSBuYW1lc3BhY2UuCgoyMDA4LTExLTIxOiB3c2Z1bHRvbgoJICAgIFRoZSB1c2Ugb2YgdGhlIGluY2x1ZGUgcGF0aCB0byBmaW5kIHRoZSBpbnB1dCBmaWxlIGlzIG5vdyBkZXByZWNhdGVkLgoJICAgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW91ciBvZiBTV0lHIHRoZSBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBpbiBwcmVwYXJhdGlvbgoJICAgIGZvciB1c2Ugd2l0aCBjY2FjaGUuCgoyMDA4LTExLTE2OiB3c2Z1bHRvbgoJICAgIEZpeCAtbm9wcmVwcm9jZXNzIG9wdGlvbiB0bzoKCSAgICAtIGNvcnJlY3RseSByZXBvcnQgZmlsZSBuYW1lcyBpbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KCSAgICAtIHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgZmlsZW5hbWUgdGhhdCBjcmVhdGVkIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdoZW4gCgkgICAgICBkZXRlcm1pbmluZyB0aGUgQysrIHdyYXBwZXIgZmlsZSBuYW1lIChpbiB0aGUgYWJzZW5jZSBvZiAtbykuIFByZXZpb3VzbHkgCgkgICAgICB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdhcyB1c2VkLgoKMjAwOC0xMS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHBhdGNoICMyMTUyNjkxIGZyb20gTUFUU1VVUkEgVGFrYW5vcmkgd2hpY2ggZml4ZXMgY29tcGlsZXMgdXNpbmcgdGhlCgkgICAgSW50ZWwgY29tcGlsZXIKCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBwYXRjaCAjMjEyODI0OSBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrIHdoaWNoIGNvcnJlY3RzIHRoZSBDL0MrKyBwcm94eQogICAgICAgICAgICBjbGFzcyBiZWluZyByZXBvcnRlZCBmb3IgUHl0aG9uIGRvY3N0cmluZ3Mgd2hlbiAlcmVuYW1lIGlzIHVzZWQuCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIHN0cmlwIGVuY29kZXIgcGF0Y2ggZnJvbSBBbmF0b2x5IFRlY2h0b25payAjMjEzMDAxNi4gVGhpcyBlbmFibGVzIGFuIAogICAgICAgICAgICBlYXN5IHdheSB0byByZW5hbWUgc3ltYm9scyBieSBzdHJpcHBpbmcgYSBjb21tb25seSB1c2VkIHByZWZpeCBpbiBhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uL3N0cnVjdCBuYW1lcy4gSXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvdGhlciBlbmNvZGVycywgc3VjaCBhcwogICAgICAgICAgICB0aXRsZSwgbG93ZXIsIGNvbW1hbmQgZXRjIG91dGxpbmVkIGluIENIQU5HRVMgZmlsZSBkYXRlZCAxMi8zMC8yMDA1LiBFeGFtcGxlCiAgICAgICAgICAgIGJlbG93IHdpbGwgcmVuYW1lIHd4QW5vdGhlcldpZGdldCB0byBBbm90aGVyV2lkZ2V0IGFuZCB3eERvU29tZXRoaW5nIHRvIAogICAgICAgICAgICBEb1NvbWV0aGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShzdHJpcDpbd3hdKXMiKSAiIjsgCgogICAgICAgICAgICAgIHN0cnVjdCB3eEFub3RoZXJXaWRnZXQgewogICAgICAgICAgICAgICAgICB2b2lkIHd4RG9Tb21ldGhpbmcoKTsKICAgICAgICAgICAgICB9OwoKMjAwOC0wOS0yNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIExvdHMgb2YgdGVzdC1zdWl0ZSB3b3JrLgoJICAgIC0gRml4IG9yZGVyaW5nIG9mIHdyYXBwZXIgb3V0cHV0IGFuZCAleyAlfSBoZWFkZXIgb3V0cHV0LgoJICAgIC0gRml4IGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgZGVmaW5lZCBjb25zdGFudHMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBFbnVtVmFsdWVzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBhZGQgc29tZSBjb25zdCB0eXBlbWFwcyB0byBhbGxlZ3JvY2wuc3dnCgkgICAgLSBhZGQgcmVuYW1lIGZvciBvcGVyYXRvciBib29sKCkgb3ZlcmxvYWRzLgoJCjIwMDgtMDktMjU6IG9sbHkKCSAgICBbUEhQNV0gRmlsbCBpbiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgYW5kIHZvaWQgKiAoU0YjMjA5NTE4NikuCgoyMDA4LTA5LTIyOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIFN1cHBvcnQgd3JhcHBpbmcgb2YgdHlwZXMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZWVuIGJ5CgkgICAgU1dJRy4gVGhleSBhcmUgdHJlYXRlZCBhcyBmb3J3YXJkLXJlZmVyZW5jZWQgY2xhc3NlcyBhbmQgaWYgYQoJICAgIGRlZmluaXRpb24gaXMgbm90IHNlZW4gYXJlIHRyZWF0ZWQgYXMgKCogOnZvaWQpLgoJICAgIC0gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgb2YgdW5uYW1lZCBuYW1lc3BhY2VzLgoJICAgIC0gTW9yZSBjb2RlIGNsZWFudXAuIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzIHdhcm5pbmdzLgoJICAgIC0gc3RhcnQgd29yayBvbiBoYXZpbmcgdGhlIGFsbGVncm9jbCBtb2QgcGFzcyB0aGUgY3BwIHRlc3Qtc3VpdGUuCgoyMDA4LTA5LTE5OiBvbGx5CgkgICAgW1BIUDVdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIEMjIGFycmF5IHR5cGVtYXBzIHByb3ZpZGVkIGJ5IEFudHRpIEthcmFudGEuCiAgICAgICAgICAgIFRoZSBhcnJheXMgcHJvdmlkZSBhIHdheSB0byB1c2UgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSkKICAgICAgICAgICAgYW5kIHBpbm5pbmcgdGhlIGFycmF5IHVzaW5nICdmaXhlZCcuIFNlZSBhcnJheXNfY3NoYXJwLmkgbGlicmFyeSBmaWxlCiAgICAgICAgICAgIGZvciBkZXRhaWxzLgoKMjAwOC0wOS0xODogd3NmdWx0b24KCSAgICBEb2N1bWVudCB0aGUgb3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSBpbiB0aGUgJWltcG9ydCBkaXJlY3RpdmUsCiAgICAgICAgICAgIHNlZSBNb2R1bGVzLmh0bWwuIEFkZCBhIHdhcm5pbmcgZm9yIFB5dGhvbiB3cmFwcGVycyB3aGVuIHRoZQogICAgICAgICAgICBtb2R1bGUgbmFtZSBmb3IgYW4gaW1wb3J0ZWQgYmFzZSBjbGFzcyBpcyBtaXNzaW5nLCByZXF1aXJpbmcgdGhlCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gJWltcG9ydCwgZWcgCgogICAgICAgICAgICAgICVpbXBvcnQobW9kdWxlPSJGb29Nb2R1bGUiKSBmb28uaAoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZW1hcCBmb3IgY2hhciAqIHRvIHR1cm4gUEhQCgkgICAgTnVsbCBpbnRvIEMgTlVMTCAocHJldmlvdXNseSBpdCB3YXMgY29udmVydGVkIHRvIGFuIGVtcHR5IHN0cmluZykuCgkgICAgVGhlIG5ldyBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKCSAgICB0eXBlbWFwIHdvcmtzIChTRiMyMDI1NzE5KS4KCgkgICAgSWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIHRoZSBmb2xsb3dpbmcgdHlwZW1hcAoJICAgIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgKFBIUCdzIGNvbnZlcnRfdG9fc3RyaW5nX2V4KCkgZnVuY3Rpb24gZG9lcwoJICAgIHRoZSBjb252ZXJ0aW5nIGZyb20gUEhQIE51bGwgdG8gYW4gZW1wdHkgc3RyaW5nKToKCgkgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7CgkJY29udmVydF90b19zdHJpbmdfZXgoJGlucHV0KTsKCQkkMSA9IFpfU1RSVkFMX1BQKCRpbnB1dCk7CgkgICAgfQoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggZXh0cmEgY29kZSBhZGRlZCB0byBwcm94eSBjbGFzcyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGNhc2UKCSAgICB3aGVyZSB0aGUgb25seSBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMuCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCB3cmFwcGluZyBvZiBhIHJlbmFtZWQgZW51bWVyYXRlZCB2YWx1ZSBvZiBhbiBlbnVtIGNsYXNzCgkgICAgbWVtYmVyIChTRiMyMDk1MjczKS4KCjIwMDgtMDktMTc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gRml4IGhvdyBmb3J3YXJkIHJlZmVyZW5jZSB0eXBlZGVmcyBhcmUgaGFuZGxlZCwgc28gYXMgbm90IHRvIGNvbmZsaWN0CgkgICAgd2l0aCBvdGhlciBsZWdpdCB0eXBlZGVmcy4KCSAgICAtIERvbid0IChmb3Igbm93KSBwZXJmb3JtIGFuIGZmaXR5cGUgdHlwZW1hcCBsb29rdXAgd2hlbiB0cnlpbmcgdG8KCSAgICB3aGVuIGNhbGxpbmcgY29tcG9zZV9mb3JlaWduX3R5cGUoKS4gVGhpcyBpcyBhY3R1YWxseSBhIHVzZWZ1bCB0aGluZwoJICAgIHRvIGRvIGluIGNlcnRhaW4gY2FzZXMsIHRoZSB0ZXN0IGNhc2VzIGZvciB3aGljaCBJIGNhbid0IGN1cnJlbnRseQoJICAgIGxvY2F0ZSA6Ly4gSXQncyBicmVha2luZyBzb21lIHdyYXBwaW5nIGJlaGF2aW9yIHRoYXQgaXMgbW9yZSBjb21tb25seQoJICAgIHNlZW4sIGhvd2V2ZXIuIEknbGwgcmVhZGQgaW4gYSBtb3JlIGFwcHJvcHJpYXRlIHdheSB3aGVuIEkgY2FuCgkgICAgcmVjcmVhdGUgdGhlIG5lZWRlZCB0ZXN0IGNhc2UsIG9yIGEgdXNlciBjb21wbGFpbnMgKHdoaWNoIG1lYW5zCgkgICAgdGhleSBwcm9iYWJseSBoYXZlIGEgdGVzdCBjYXNlKS4KCSAgICAtIGRvY3VtZW50IHRoZSAtaXNvbGF0ZSBjb21tYW5kLWxpbmUgYXJnIGluIHRoZSAnc3dpZyAtaGVscCcgb3V0cHV0LgoJICAgIEl0IHdhcyBpbiB0aGUgaHRtbCBkb2NzLCBidXQgbm90IHRoZXJlLgoJICAgIC0gc21hbGwgYW1vdW50IG9mIGNvZGUgY2xlYW51cCwgcmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgoJICAgIC0gc29tZSBtaW5vciBhZXN0aGV0aWMgY2hhbmdlcy4KCjIwMDgtMDktMTI6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy4wIHN1cHBvcnQgYnJhbmNoIG1lcmdlZCBpbnRvIFNXSUcgdHJ1bmsuIFRoYW5rcyB0bwogICAgICAgICAgICBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwOCBmb3Igc3VwcG9ydGluZyB0aGlzIHByb2plY3QhIEJ5IGRlZmF1bHQKICAgICAgICAgICAgU1dJRyB3aWxsIGdlbmVyYXRlIGludGVyZmFjZSBmaWxlcyBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMi54CiAgICAgICAgICAgIGFuZCAzLjAuIEFuZCB0aGVyZSdzIGFsc28gc29tZSBQeXRob24gMyBuZXcgZmVhdHVyZXMgdGhhdCBjYW4gYmUKICAgICAgICAgICAgZW5hYmxlZCBieSBwYXNzaW5nIGEgIi1weTMiIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gU1dJRy4gVGhlc2UKICAgICAgICAgICAgZmVhdHVyZXMgYXJlOgoKICAgICAgICAgICAgICAtIEZ1bmN0aW9uIGFubm90YXRpb24gc3VwcG9ydAogICAgICAgICAgICAgICAgICBBbHNvLCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgcHJveHkgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgIGV2ZW4gd2l0aG91dCB0aGUgIi1weTMiIG9wdGlvbi4gSG93ZXZlciwgdGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgICAgICAgIHdpbGwgZmFsbGJhY2sgdG8gKmFyZ3MgaWYgdGhlIGZ1bmN0aW9uIChvciBtZXRob2QpIGlzIG92ZXJsb2FkZWQuCiAgICAgICAgICAgICAgLSBCdWZmZXIgaW50ZXJmYWNlIHN1cHBvcnQKICAgICAgICAgICAgICAtIEFic3RyYWN0IGJhc2UgY2xhc3Mgc3VwcG9ydAoKICAgICAgICAgICAgRm9yIGRldGFpbHMgb2YgUHl0aG9uIDMgc3VwcG9ydCBhbmQgdGhlc2UgZmVhdHVyZXMsIHBsZWFzZSBzZWUgdGhlCiAgICAgICAgICAgICJQeXRob24gMyBTdXBwb3J0IiBzZWN0aW9uIGluIHRoZSAiU1dJRyBhbmQgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZSBTV0lHCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgIi1hcHBseSIgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgc3VwcG9ydCBvZiBnZW5lcmF0aW5nIGNvZGVzCiAgICAgICAgICAgIHVzaW5nIGFwcGx5KCkgaXMgcmVtb3ZlZC4gU2luY2UgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJ5IHZlcnkgb2xkCiAgICAgICAgICAgIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgbWVyZ2UgYWxzbyBwYXRjaGVkIFNXSUcncyBwYXJzZXIgdG8gc29sdmUgYSBidWcuIEJ5IHRoaXMgcGF0Y2gsCiAgICAgICAgICAgIFNXSUcgZmVhdHVyZXMgYWJsZSB0byBiZSBjb3JyZWN0bHkgYXBwbGllZCBvbiBDKysgY29udmVyc2lvbiBvcGVyYXRvciwKICAgICAgICAgICAgc3VjaCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpICAqOjpvcGVyYXRvciBib29sICV7IC4uLiAlfQoKMjAwOC0wOS0wMjogcmljaGFyZGIKCSAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzIwODkxNDk6IERpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBtYW5nbGVzCgkgICAgcmV0dXJuZWQgZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyByYWlzZWQgYnkgUHl0aG9uIGNvZGUgaW4gZGlyZWN0b3JzCgkgICAgYXJlIG5vdyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY2FsbGVyIHdpdGhvdXQgY2hhbmdlLiAgQWxzbywgcmVtb3ZlCgkgICAgdGhlICI6ICIgcHJlZml4IHdoaWNoIHVzZWQgdG8gYmUgYWRkZWQgdG8gb3RoZXIgZGlyZWN0b3IgZXhjZXB0aW9ucwoJICAgIChlZywgdGhvc2UgZHVlIHRvIGluY29ycmVjdCByZXR1cm4gdHlwZXMpLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMxOTg4Mjk2IEdDSXRlbSBtdWx0aXBsZSBtb2R1bGUgbGlua2luZyBpc3N1ZSB3aGVuIHVzaW5nIAogICAgICAgICAgICBkaXJlY3RvcnMuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yICd1c2luZycgYW5kICdmaXhlZCcgYmxvY2tzIGluIHRoZSAnY3NpbicgdHlwZW1hcCBpcyBub3cKICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBwcmUgYXR0cmlidXRlIGFuZCB0aGUgbmV3IHRlcm1pbmF0b3IgYXR0cmlidXRlLCBlZwoKICAgICAgICAgICAgICAldHlwZW1hcChjc2luLCAKICAgICAgICAgICAgICAgICAgICAgICBwcmU9IiAgICB1c2luZyAoQ0RhdGUgdGVtcCRjc2lucHV0ID0gbmV3IENEYXRlKCRjc2lucHV0KSkgeyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcj0iICAgIH0gLy8gdGVybWluYXRlIHRlbXAkY3NpbnB1dCB1c2luZyBibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IENEYXRlICYKICAgICAgICAgICAgICAgICAgICAgICAiJGNzY2xhc3NuYW1lLmdldENQdHIodGVtcCRjc2lucHV0KSIKCiAgICAgICAgICAgIFNlZSBDU2hhcnAuaHRtbCBmb3IgbW9yZSBpbmZvLgoKMjAwOC0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIENvbW1pdCBwYXRjaCAjMjA3OTM4MSBzdWJtaXR0ZWQgYnkgQm9yaXMgU21pbGdhIC0gY29uc3RhbnQgZXhwcnMgcHV0IGludG8gCiAgICAgICAgICAgIG5vLWV2YWwgY29udGV4dCBpbiBERUZDRU5VTQoKMjAwOC0wOC0wMjogd3V6emViCiAgICAgICAgICAgIFtDaGlja2VuLEFsbGVncm9dIENvbW1pdCBQYXRjaCAyMDE5MzE0CiAgICAgICAgICAgIEZpeGVzIGEgYnVpbGQgZXJyb3IgaW4gY2hpY2tlbiwgYW5kIHNldmVyYWwgYnVpbGQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMKICAgICAgICAgICAgaW4gQWxsZWdybyBDTAoKMjAwOC0wNy0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1aWxkaW5nIG9mIFRjbCBleGFtcGxlcy90ZXN0LXN1aXRlIG9uIE1hYyBPUyBYIHJlcG9ydGVkIGJ5IEdpZGVvbiBTaW1wc29uLgoKMjAwOC0wNy0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMyMDE5MTU2IENvbmZpZ3VyaW5nIHdpdGggLS13aXRob3V0LW9jdGF2ZSBvciAtLXdpdGhvdXQtYWxsbGFuZwogICAgICAgICAgICBkaWQgbm90IGRpc2FibGUgb2N0YXZlLgoKMjAwOC0wNy0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZGlyZWN0b3IgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgY29ycmVjdGx5IAogICAgICAgICAgICBtYXJzaGFsbGVkIHRvIEMjL0phdmEgbnVsbCBpbiBkaXJlY3RvciBtZXRob2RzLgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIEZvciBzdGRfdmVjdG9yLmkgYW5kIHN0ZF9tYXAuaSwgcmVuYW1lIGVtcHR5KCkgdG8gaXNfZW1wdHkoKQoJICAgIHNpbmNlICJlbXB0eSIgaXMgYSBQSFAgcmVzZXJ2ZWQgd29yZC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gTWFyayBLbGVpbgoJICAgIGluIFNGIzE5NDM0MTcuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLW1ha2UiIGhhcyBiZWVuIHJlbW92ZWQuICAKCSAgICBTZWFyY2hlcyBvbiBHb29nbGUgY29kZXNlYXJjaCBzdWdnZXN0IHRoYXQgbm9ib2R5IGlzIHVzaW5nIGl0IG5vdwoJICAgIGFueXdheS4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgU1dJRyBjZGF0YS5pIGxpYnJhcnkgbW9kdWxlIGlzIG5vdyBzdXBwb3J0ZWQuCgoyMDA4LTA3LTAzOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlcHJlY2F0ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXBocGZ1bGwiIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFdlIHJlY29tbWVuZCBidWlsZGluZyB5b3VyIGV4dGVuc2lvbiBhcyBhIGR5bmFtaWNhbGx5CgkgICAgbG9hZGFibGUgbW9kdWxlLgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQSFA0XSBTdXBwb3J0IGZvciBQSFA0IGhhcyBiZWVuIHJlbW92ZWQuICBUaGUgUEhQIGRldmVsb3BlcnMgYXJlCgkgICAgbm8gbG9uZ2VyIG1ha2luZyBuZXcgUEhQNCByZWxlYXNlcywgYW5kIHdvbid0IGV2ZW4gYmUgcHJvdmlkaW5nCgkgICAgcGF0Y2hlcyBmb3IgY3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGFmdGVyIDIwMDgtMDgtMDguCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wb3J0IHRoZSBDIGV4dGVuc2lvbiBkaWZmZXJlbnRseSBmb3IgUHl0aG9uIDIuNiBhbmQKCSAgICBsYXRlciBzbyB0aGF0IGFuIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydCBkb2Vzbid0IHByb2R1Y2UgYQoJICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIDIuNiBhbmQgYSBmYWlsdXJlIGZvciAyLjcgYW5kIGxhdGVyLgoJICAgIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIFNGIzIwMDgyMjksIHBsdXMgZm9sbG93LXVwIHBhdGNoZXMKCSAgICBmcm9tIFJpY2hhcmQgYW5kIEhhb3l1IEJhaS4KClZlcnNpb24gMS4zLjM2ICgyNCBKdW5lIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8yNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZGVwcmVjYXRlZCAtYyBjb21tYW5kbGluZSBvcHRpb24gKHJ1bnRpbWUgbGlicmFyeSBnZW5lcmF0aW9uKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiBoYW5kbGluZyAldHlwZW1hcChpbixudW1pbnB1dHM9MCkKCSAgICAodGVzdGNhc2UgaWdub3JlX3BhcmFtZXRlcikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IHdoZW4gd3JhcHBpbmcgYSBub24tY2xhc3MgZnVuY3Rpb24gbWFya2VkIHdpdGgKCSAgICAlbmV3b2JqZWN0ICh0ZXN0Y2FzZSBjaGFyX3N0cmluZ3MpLgoKMDYvMjIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBhIHdheSB0byB1c2UgQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uIGluc3RlYWQgb2YgQXR0YWNoQ3VycmVudFRocmVhZAogICAgICAgICAgICBpbiBkaXJlY3RvciBjb2RlLiBEZWZpbmUgdGhlIFNXSUdfSkFWQV9BVFRBQ0hfQ1VSUkVOVF9USFJFQURfQVNfREFFTU9OIG1hY3JvLCBzZWUKICAgICAgICAgICAgTGliL2phdmEvZGlyZWN0b3Iuc3dnLgoKMDYvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBjcmFzaGluZyBpbiB0aGUgU1RMIHdyYXBwZXJzIChyZWplY3QhIGFuZCBkZWxldGVfaWYgbWV0aG9kcykKCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQyMgYW5kIEphdmEga2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGluc3RlYWQgb2YganVzdCBpc3N1aW5nIGEgd2FybmluZwogICAgICAgICAgICBhbmQgdGhlbiBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlLiBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIAogICAgICAgICAgICBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEtleXdvcmQgaGFuZGxpbmcgYWRkZWQuIFIgS2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICAgV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBib29sJiBhbmQgYm9vbCouIEFkZGVkIHJ1bnRlc3QgZm9yIGxpX3R5cGVtYXBzIHRlc3RjYXNlLgogICAgICAgICAgICAoQnVnICMxOTM4MTQyKQoKMDYvMDcvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHRlc3QgY2FzZSBrZXl3b3JkX3JlbmFtZSwgdGhlbiBtYWRlIHRoZSBrZXl3b3JkIHJlbmFtaW5nIHdvcmtzIHByb3Blcmx5CiAgICAgICAgICAgIGJ5IGZpeGluZyBTd2lnX25hbWVfbWFrZSgpIGZvciBhIGluY29tcGxldGUgY29uZGl0aW9uIGNoZWNraW5nLgoKMDYvMDIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZW51bSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMzAvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHN0ZDo6d3N0cmluZyBpbnRvIExpYi90eXBlbWFwcy9wcmltdHlwZXMuc3dnLCBzaW5jZSBpdCBpcyBhbHNvIGEgcHJpbWl0aXZlIAogICAgICAgICAgICB0eXBlIGluIFNXSUcgLSBmaXhlZCBTRiAjMTk3Njk3OC4KCjA1LzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHZhcmlhYmxlIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8yOS8yMDA4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgYSB0eXBvIG9mICUjaWZkZWYgaW4gTGliL3B5dGhvbi9weWNvbnRhaW5lci5zd2csIHdoaWNoIGlzIHJlbGF0ZWQgCiAgICAgICAgICAgIHRvIC1leHRyYW5hdGl2ZSBTV0lHIG9wdGlvbiAtIFNGICMxOTcxOTc3LgoKMDUvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHBhcnRpYWxjaGVjayBtYWtlZmlsZSB0YXJnZXRzIGZvciBwYXJ0aWFsIHRlc3Rpbmcgb2YgdGhlIHRlc3Qtc3VpdGUuIFRoZXNlCiAgICAgICAgICAgIGp1c3QgaW52b2tlIFNXSUcsIGllIG5vIGNvbXBpbGF0aW9uIGFuZCBubyBydW50aW1lIHRlc3RpbmcuIEl0IGNhbiBiZSBmYXN0ZXIKICAgICAgICAgICAgd2hlbiBkZXZlbG9waW5nIGJ5IGp1c3QgZG9pbmcgYSBkaXJlY3RvcnkgZGlmZiBvZiB0aGUgZmlsZXMgU1dJRyBnZW5lcmF0ZXMKICAgICAgICAgICAgYWdhaW5zdCB0aG9zZSBmcm9tIGEgcHJldmlvdXMgcnVuLiBFeGFtcGxlIHVzYWdlIGZyb20gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnk6CgogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay1qYXZhLXRlc3Qtc3VpdGUKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5jb21wYXNzZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBydW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBlZwogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBwcmVmaXggdGhlIGNvbW1hbmQgbGluZSB3aGljaCBydW5zIGFueSB0YXJnZXQgbGFuZ3VhZ2UgdGVzdAogICAgICAgICAgICB3aXRoIGEgdG9vbC4gU2VlIHRoZSBSVU5UT09MLCBDT01QSUxFVE9PTCBhbmQgU1dJR1RPT0wgdGFyZ2V0cyBpbiB0aGUgY29tbW9uLm1rCiAgICAgICAgICAgIGZpbGUgYW5kIG1ha2VmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZSBkaXJlY3RvcnkuIEZvciBleGFtcGxlIGl0IGlzIHBvc3NpYmxlIHRvIAogICAgICAgICAgICBydW4gdGhlIHJ1bnRpbWUgdGVzdHMgdGhyb3VnaCB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBSVU5UT09MPSJ2YWxncmluZCAtLWxlYWstY2hlY2s9ZnVsbCIKCiAgICAgICAgICAgIG9yIGludm9rZSBTV0lHIHVuZGVyIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFNXSUdUT09MPSJ2YWxncmluZCAtLXRvb2w9bWVtY2hlY2siCgowNS8xOS8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgZGVmaW5lIHRoYXQgd2FzIGJyZWFraW5nIHByZS0yLjcuICBDaGVja2VkIGluCiAgICAgICAgICAgIHBhdGNoIGZyb20gU29yZW4gU29ubmVuYnVyZyB0aGF0IGNyZWF0ZXMgc3RyaW5ncyBpbiAgCgkgICAgdmVyc2lvbiBpbmRlcGVuZGVudCB3YXkKCjA1LzE1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdmFyaWFibGUgbmFtZSBjbGFzaCBpbiBkaXJlY3RvcnMgLSBTRiAjMTk2MzMxNiByZXBvcnRlZCBieSBUcmlzdGFuLgoKMDUvMTQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGFuIG9wdGltaXNhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYnkgdmFsdWUsIHJlZHVjaW5nCiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgbWFkZS4gSW1wbGVtZW50ZWQgdXNpbmcgYW4KICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIGluIHRoZSAib3V0IiB0eXBlbWFwIGNhbGxlZCAib3B0aW1hbCIuIERldGFpbHMgaW4gCiAgICAgICAgICAgIFR5cGVtYXBzLmh0bWwuCgowNS8xMS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gQ2hlY2sgZm9yICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIHdoZW4gZ2VuZXJhdGluZyBQSFA1IGNsYXNzCgkgICAgd3JhcHBlci4KCjA1LzExLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMTk0MzYwOCAtICRzZWxmIHN1YnN0aXR1dGlvbiBpbiAlY29udHJhY3QsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICAgICAgICBUb29uIFZlcnN0cmFlbGVuLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBjaGFyICogdHlwZW1hcHMgdG8gd29yayB3aGVuIGFwcGxpZWQgdG8gc2lnbmVkIGNoYXIgKiBhbmQKCSAgICB1bnNpZ25lZCBjaGFyICogKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcHBseV9zdHJpbmdzKS4KCjA1LzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjaGFyICogbWVtYmVyIHZhcmlhYmxlcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGJhZCBQSFAgY29kZSBnZW5lcmF0ZWQgd2hlbiB3cmFwcGluZyBhbiBlbnVtIGluIGEKCSAgICBuYW1lc3BhY2UgKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcnJheXNfc2NvcGUpLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIFNXSUcgbm93IHJ1bnMgdGhlIFBIUCB0ZXN0c3VpdGUgdXNpbmcgUEhQNSwgbm90IFBIUDQuICBQSFA0CgkgICAgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUgbm93LCBzbyB3ZSBjYXJlIG11Y2ggbW9yZSBhYm91dCBzb2xpZCBQSFA1CgkgICAgc3VwcG9ydC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNUTCBmaXhlcyB3aGVuIHVzaW5nICVpbXBvcnQgcmF0aGVyIHRoYW4gJWluY2x1ZGUgYW5kIHRoZSBTb2xhcmlzIFdvcmtzaG9wCiAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgUm9ndWV3YXZlIFNUTC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBvdmVybG9hZGVkIHByb3RlY3RlZCBtZXRob2RzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzAzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIENvbW1pdCBwYXRjaCAjMTk1NjYwNyB0byBhZGQgLU1UIHN1cHBvcnQgZnJvbSBSaWNoYXJkIEJvdWx0b24uCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWlycm9ycyB0aGUgZ2NjIC1NVCBvcHRpb24gd2hpY2ggYWxsb3dzIG9uZSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgICAgICAgTWFrZWZpbGUgdGFyZ2V0IGJlaW5nIGdlbmVyYXRlZCB3aGVuIGdlbmVyYXRpbmcgbWFrZWZpbGVzIHdpdGggdGhlIC1NIGZhbWlseQogICAgICAgICAgICBvZiBvcHRpb25zLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJCBzd2lnIC1qYXZhIC1NTSAtTVQgb3ZlcnJpZGRlbm5hbWUgLWMrKyAgZXhhbXBsZS5pCiAgICAgICAgICAgICAgb3ZlcnJpZGRlbm5hbWU6IFwKICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKMDQvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBbTHVhXSBSZW1vdmVkIGdlbmVyYXRpb24gb2YgX3dyYXBfZGVsZXRlX1hYWFhYICh3cmFwcGVyZWQgZGVzdHJ1Y3RvcikKCSAgICB3aGljaCB3YXMgdW51c2VkIGFuZCBjYXVzaW5nIHdhcm5pbmcgd2l0aCBnKysgLVdhbGwuCgkgICAgUmVtb3ZlZCBvdGhlciB1bnVzZWQgd2FybmluZyBpbiB0eXBlbWFwcy5pIGFuZCBvdGhlciBwbGFjZXMuCgkgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2VtYmVkMywgYW5kIHJ1biB0ZXN0cyBhIGZldyB0ZXN0IGNhc2VzLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgSUJNJ3MgQysrIGNvbXBpbGVyIG9uIEFJWCAocGF0Y2gKCSAgICBmcm9tIEdvZXJhbiBVZGRlYm9yZyBpbiBTRiMxOTI4MDQ4KS4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBSZW5hbWUgQlNJWkUgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9hcnJheXNfc2NvcGUuaSB0byBCQlNJWkUgdG8KCSAgICBhdm9pZCBhIGNsYXNoIHdpdGggQlNJWkUgZGVmaW5lZCBieSBoZWFkZXJzIG9uIEFJWCB3aXRoIFBlcmwKCSAgICAocmVwb3J0ZWQgaW4gU0YjMTkyODA0OCkuCgowNC8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgdG8gd3JhcCBhbGwgcHJvdGVjdGVkIG1lbWJlcnMgd2hlbiB1c2luZyBkaXJlY3RvcnMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgb25seSB0aGUgdmlydHVhbCBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgIE5vdyBhbGwgcHJvdGVjdGVkIG1lbWJlcnMsIChzdGF0aWMgYW5kIG5vbi1zdGF0aWMgdmFyaWFibGVzLCBub24tdmlydHVhbCBtZXRob2RzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWV0aG9kcykgYXJlIHdyYXBwZWQgd2hlbiB1c2luZyB0aGUgYWxscHJvdGVjdGVkIG1vZGUuIFRoZSBhbGxwcm90ZWN0ZWQKICAgICAgICAgICAgbW9kZSBpcyB0dXJuZWQgb24gaW4gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLCBhbGxwcm90ZWN0ZWQ9IjEiKSBtb2R1bGVuYW1lCgpWZXJzaW9uIDEuMy4zNSAoNyBBcHJpbCAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQWRkIG1pc3NpbmcgcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMKCjA0LzA2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzdGFjayBvdmVyZmxvdyB3aGVuIHVzaW5nIHR5cGVtYXAgd2FybmluZyBzdXBwcmVzc2lvbiwgZWcgCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fVFlQRU1BUF9DSEFSTEVBS19NU0cpCgowNC8wNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyBzbyB0aGF0ICVweXRob25ub25keW5hbWljIGNhbiBiZSB1c2VkLiBBbHNvIGNvcnJlY3RzCiAgICAgICAgICAgIGRpc3BsYXkgb2YgdGhlIHByb3h5IGNsYXNzIHR5cGUuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowNC8wNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkICVuZXdvYmplY3QgcmVmZXJlbmNlIHRvIHB5dGhvbiBtZW1vcnkgbWFuYWdlbWVudCBzdWJzZWN0aW9uIG9mIG1hbnVhbAoJICAgIChwYXRjaCBmcm9tIG1kYmVhY2h5IGluIFNGIzE4OTQ2MTApLgoKMDMvMjcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgd2hlcmUgdGhlIHBvaW50ZXIgdHlwZSBpcyBhIHRlbXBsYXRlZCB0eXBlIHdpdGgKICAgICAgICAgICAgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjAzLzI3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgdHlwZW1hcCBESVNPV04gZm9yIFNXSUdUWVBFKiBhbmQgU1dJR1RZUEVbXSwgYW5kIHN1cHBvcnQgZm9yICVkZWxvYmplY3QgZmVhdHVyZS4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL293bmVyIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTg0NDMwMSBmcm9tIE1vbnR5IFRheWxvciB0byBzdXBwcmVzcyBlbnVtIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHVudXNlZCB3YXJuaW5ncy4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI0NTI0IGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCBlbnN1cmVzIHRoZQogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbGwgYQogICAgICAgICAgICBjb25zdHJ1Y3RvciBvbiBhIGNsYXNzIHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igd3JhcHBlciwgZWcgaWYKICAgICAgICAgICAgdGhlIEMrKyBjbGFzcyBpcyBhYnN0cmFjdC4KCjAzLzI2LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMxOTI1NzAyIGZyb20gQ2FzZXkgUmF5bW9uZHNvbiB3aGljaCByZW1vdmVzIHdhcm5pbmcgNTEyCiAgICAgICAgICAgIGZvciBzdGQ6OnZlY3RvciB3cmFwcGVycy4KCjAzLzI2LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBcHBseSBHQ0MgNC4zIHdhcm5pbmdzIHBhdGNoIGZyb20gUGhpbGlwcCBUaG9tYXMKCSAgICAoU0YjMTkyNTEyMikuCgowMy8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaHJlYWQgc2FmZXR5IHBhdGNoIGZvciBTVEwgaXRlcmF0b3JzIGZyb20gQWJoaW5hbmRhbiBKYWluLgoKMDMvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgJWx1YWNvZGUgZmVhdHVyZSB0byBhZGQgc291cmNlIGNvZGUgaW50byB3cmFwcGVycy4KICAgICAgICAgICAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoaXMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9hcnJheXMgdG8gc2hvdyBpdHMgdXNlIChhbmQgdHlwZW1hcHMpCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG5vbnBvcnRhYmxlIHNlZCB1c2FnZSB3aGljaCBmYWlsZWQgb24gTWFjIE9TIFggKGFuZCBwcm9iYWJseQoJICAgIG90aGVyIHBsYXRmb3JtcykuICBGaXhlcyBTRiMxOTAzNjEyLgoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBtZW1vcnkgbGVhayBpbiBTV0lHJ3MgcGFyc2VyIChiYXNlZCBvbiBwYXRjaCBmcm9tIFJ1c3NlbGwKCSAgICBCcnlhbnQgaW4gU0YjMTkxNDAyMykuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxODc4Mjg1IC0gdW5uZWNlc3NhcnkgY2FzdCBmb3IgQyBzdHJ1Y3QgY3JlYXRpb24gd3JhcHBlcnMuCgowMy8xMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgZGVidWdnaW5nIGluZm8gd2hlbiB1c2luZyBzaGFyZWRfcHRyIHN1cHBvcnQKCjAzLzA2LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgTHVhIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9leGNlcHRpb24gYW5kIEV4YW1wbGVzL2x1YS9lbWJlZDIuCiAgICAgICAgICAgIFNtYWxsIHVwZGF0ZXMgdG8gdGhlIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBBZGQgY2hhciAqJiB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvY2Nhc2lvbmFsIHNlZyBmYXVsdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBhcyBiZWluZyBpZ25vcmVkLgoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCAjMTkwNDUzNyBTd2lnIGNhdXNlcyBhIFBlcmwgd2FybmluZyAieCB1c2VkIG9ubHkgb25jZSIgaW4gUGVybCA1LjEwCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEFyaSBKb2xtYQoKMDIvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHNoYXJlZF9wdHIgdmFyaW4vdmFyb3V0IHR5cGVtYXBzIGZvciB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGVzLgoKMDIvMjUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICR3cmFwbmFtZSB0byB3b3JrIGluICVleGNlcHRpb24gKGZpeGVzIHNvbWUgd3JhcDpuYW1lIGFzc2VydGlvbnMpCgpWZXJzaW9uIDEuMy4zNCAoMjcgRmVicnVhcnkgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCBmdW5jdGlvbiBwb2ludGVyIHZhcmlhYmxlcy4KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgZm9yIHVzZSB3aXRoaW4gJWV4Y2VwdGlvbjoKICAgICAgICAgICAgICAkd3JhcG5hbWUgLSBsYW5ndWFnZSBzcGVjaWZpYyB3cmFwcGVyIG5hbWUKICAgICAgICAgICAgICAkb3Zlcm5hbWUgLSBpZiBhIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgY29udGFpbnMgdGhlIGV4dHJhIG1hbmdsaW5nIHVzZWQgb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG92ZXJsb2FkZWQgbWV0aG9kCiAgICAgICAgICAgICAgJGRlY2wgICAgIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgICAgICAkZnVsbGRlY2wgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJldHVybiB0eXBlCgowMi8xMi8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gTm93IHNldHRpbmcgUzQgZmxhZyBpbiBTV0lHIGNyZWF0ZWQgb2JqZWN0cy4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgUi1TV0lHIGZvciAyLjYgYW5kIHdhcm5pbmcgZm9yIDIuNiBmYWlsdXJlIGhhcyBiZWVuIHJlbW92ZWQuCgowMi8xMS8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHBhdGNoIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZiB0byBmaXggdGhlIHVuYXJ5IG1pbnVzIGlzc3VlCiAgICAgICAgICAgIFJhbiAnYXN0eWxlIC0tc3R5bGU9a3IgLTInIGFjcm9zcyBsdWEuY3h4IHRvIG5lYXRlbiBpdCB1cAoKMDIvMTAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQnVtcCBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byA0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQVBJIAogICAgICAgICAgICBjaGFuZ2UgaW4gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBpZSBjaGFuZ2UgaW4gZGVmaW5pdGlvbiBvZiBzd2lnX2NvbnZlcnRlcl9mdW5jLgogICAgICAgICAgICBBbnlvbmUgY2FsbGluZyBTV0lHX1R5cGVDYXN0IG11c3QgcGFzcyBpbiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbmV3IGFkZGl0aW9uYWwKICAgICAgICAgICAgKHRoaXJkKSBwYXJhbWV0ZXIgYW5kIHRoZW4gaGFuZGxlIHRoZSBuZXdseSBjcmVhdGVkIG1lbW9yeSBpZiB0aGUgcmV0dXJuZWQgdmFsdWUKICAgICAgICAgICAgaXMgc2V0IHRvIFNXSUdfQ0FTVF9ORVdfTUVNT1JZIGVsc2UgYSBtZW1vcnkgbGVhayB3aWxsIGVuc3VlLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQuIFVzYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSByZWNlbnRseQogICAgICAgICAgICBhZGRlZCBKYXZhIGFuZCBDIyBzaGFyZWRfcHRyIHR5cGVtYXBzLiBUd28gbWFjcm9zIGFyZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZXNlCiAgICAgICAgICAgIG1heSB3ZWxsIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAgICAgICAgICAgRm9yIGJhc2UgY2xhc3NlcyBvciBjbGFzc2VzIG5vdCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbjoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgRm9yIGRlcml2ZWQgY2xhc3NlczoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQoKICAgICAgICAgICAgVGhlIFBST1hZQ0xBU1MgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzLCBidXQgaXMgb25seSByZXF1aXJlZCBmb3IgSmF2YS9DIy4KICAgICAgICAgICAgRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJvb3N0X3NoYXJlZF9wdHIuaSIKCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKEtsYXNzLCBTcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoS2xhc3NEZXJpdmVkLCBTcGFjZTo6S2xhc3MsIFNwYWNlOjpLbGFzc0Rlcml2ZWQpCgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzc0Rlcml2ZWQgOiBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZ1cnRoZXIgZGV0YWlscyB0byBmb2xsb3cgaW4gZnV0dXJlIGRvY3VtZW50YXRpb24sIGJ1dCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCiAgICAgICAgICAgIHNob3VsZCBiZSBub3RlZDoKCiAgICAgICAgICAgIC0gTm90IHJlc3RyaWN0ZWQgdG8gYm9vc3Q6OnNoYXJlZF9wdHIsIGVnIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlIHVzZWQuCiAgICAgICAgICAgIC0gQXZhaWxhYmxlIHR5cGVtYXAgZ3JvdXBzOgogICAgICAgICAgICAgIChhKSBUeXBlbWFwcyBmb3Igc2hhcmVkX3B0ciBwYXNzZWQgYnkgdmFsdWUsIHJlZmVyZW5jZSwgcG9pbnRlciBhbmQgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLgogICAgICAgICAgICAtIChiKSBUeXBlbWFwcyBmb3IgcGFzc2luZyBieSByYXcgdmFsdWUsIHJhdyBwb2ludGVyLCByYXcgcmVmZXJlbmNlLCByYXcgcG9pbnRlcgogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuIAogICAgICAgICAgICAtIFRoZSBjb2RlIGJlaW5nIHdyYXBwZWQgZG9lcyBub3QgZXZlbiBoYXZlIHRvIHVzZSBzaGFyZWRfcHRyLCBTV0lHIGNhbiB1c2UKICAgICAgICAgICAgICBzaGFyZWRfcHRyIGFzIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIGluc3RlYWQgb2YgYSByYXcgcG9pbnRlciBkdWUgdG8gCiAgICAgICAgICAgICAgdGhlIHR5cGVtYXBzIGluIGdyb3VwIChiKSBhYm92ZS4KICAgICAgICAgICAgLSBObyBhcnJheSBzdXBwb3J0IGFzIHNoYXJlZF9wdHIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheXMuCiAgICAgICAgICAgIC0gVGhpcyB3b3JrcyBxdWl0ZSBkaWZmZXJlbnRseSB0byB0aGUgdXN1YWwgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgd2hlbgogICAgICAgICAgICAgIG9wZXJhdG9yLT4gaXMgcGFyc2VkIGJ5IFNXSUc6CiAgICAgICAgICAgICAgLSBBbiBhZGRpdGlvbmFsIHNtYXJ0IHBvaW50ZXIgY2xhc3MgaXMgbm90IGdlbmVyYXRlZCByZWR1Y2luZyBjb2RlIGJsb2F0IGluCiAgICAgICAgICAgICAgICB0aGUgd3JhcHBlcnMuCiAgICAgICAgICAgICAgLSBVc2luZyBzbWFydCBwb2ludGVycyBhbmQgcmF3IHBvaW50ZXJzIGNhbiBiZSBtaXhlZCBzZWFtbGVzc2x5LgogICAgICAgICAgICAgIC0gTWlzc2luZyBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzbWFydCBwb2ludGVycyBpcyBubyBsb25nZXIgYSBwcm9ibGVtIGFuZCBzbwogICAgICAgICAgICAgICAgc2VwYXJhdGUgZmFjdG9yeSB0eXBlIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSB0byBiZSB3cml0dGVuIGFuZCB3cmFwcGVkLgogICAgICAgICAgICAgIC0gVGhlIGltcGxpY2l0IEMrKyBzaGFyZWRfcHRyPCBkZXJpdmVkIGNsYXNzID4gdG8gc2hhcmVkX3B0cjwgYmFzZSBjbGFzcyA+CiAgICAgICAgICAgICAgICBjYXN0IGFsc28gd29ya3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhpcyBuZWdhdGVzIHRoZSBuZWNlc3NpdHkgdG8gd3JpdGUKICAgICAgICAgICAgICAgIGFuIGV4cGxpY2l0IGhlbHBlciBjYXN0IGZ1bmN0aW9uIHByb3ZpZGluZyB0aGUgdXBjYXN0IHdoaWNoIHdvdWxkIG5lZWQKICAgICAgICAgICAgICAgIGNhbGxpbmcgcHJpb3IgdG8gcGFzc2luZyBhIGRlcml2ZWQgY2xhc3MgdG8gYSBtZXRob2QgdGFraW5nIGEgc2hhcmVkX3B0ciB0bwogICAgICAgICAgICAgICAgYSBiYXNlIGNsYXNzLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGNsYXNzIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB2aWEgYSBuZXcKICAgICAgICAgICAgInNtYXJ0cHRyIiBmZWF0dXJlLiBUaGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgb2YgY3VzdG9taXNhdGlvbiBtb3N0IHVzZXJzCiAgICAgICAgICAgIHdvdWxkIG5ldmVyIG5lZWQgdG8ga25vdy4gVGhlIGZlYXR1cmUgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgaW50cnVzaXZlIAogICAgICAgICAgICBzbWFydCBwb2ludGVycyBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgdHlwZW1hcHMuIEV4YW1wbGUgdXNhZ2Ugb2YgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9MSkgRm9vIHsgYm9vc3Q6OnNoYXJlZF9wdHI8IEZvbyA+IH0KICAgICAgICAgICAgICBjbGFzcyBGb28ge307CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIEZvb19zd2lncmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCB0aGVuIHJlZ2lzdGVyIGJvb3N0OjpzaGFyZWQgPCBGb28gPgogICAgICAgICAgICAoU1dJR1RZUEVfcF9ib29zdF9fc2hhcmVkX3B0clRGb29fdCBpbnN0ZWFkIG9mIFNXSUdUWVBFX3BfRm9vKSBhcyB0aGUgdW5kZXJseWluZwogICAgICAgICAgICB0eXBlIGZvciBpbnN0YW50aWF0aW9ucyBvZiBGb28uCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGZWF0dXJlcyBub3cgc3VwcG9ydHMgdGhlIG9wdGlvbmFsICdub2Jsb2NrJyBhdHRyaWJ1dGUgZm9yIGFsbCB1c2FnZSBvZiAlZmVhdHVyZS4gCiAgICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgeyB9IGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZWF0dXJlIGNvZGUuIFRoaXMgaXMgaWRlbnRpY2FsCiAgICAgICAgICAgIGluIGJlaGF2aW91ciB0byB1c2FnZSBvZiAnbm9ibG9jaycgaW4gdHlwZW1hcHMgYW5kIGlzIHVzZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgb24gdGhlIGNvZGUgaW4gdGhlIGZlYXR1cmUgYW5kIHRoZSBlbmNsb3NpbmcgeyB9IGJyYWNlcwogICAgICAgICAgICBhcmUgbm90IHJlcXVpcmVkLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBmb28KICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPSIxIikgeyBGT086OmJhciB9CgogICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHRoZW4gcmVkdWNlcyB0aGlzIGFzIGlmIHRoaXMgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiKSAiZm9vOjpiYXIiCgowMi8wMS8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGZvcm1hdCBzdHJpbmcgYnVnIChTRiMxODgyMjIwKS4KCjAxLzMxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9ucyB0byB0aGUgJXR5cGVzIGRpcmVjdGl2ZS4gTm93IHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGNhbiBiZQogICAgICAgICAgICBvdmVycmlkZGVuIHRvIHNvbWUgY3VzdG9tIGNvZGUgaW4gdGhlICV0eXBlcyBkaXJlY3RpdmUsIGxpa2Ugc286CgogICAgICAgICAgICAgICV0eXBlcyhmcm9tdHlwZSA9IHRvdHlwZSkgJXsKICAgICAgICAgICAgICAgIC4uLiBjb2RlIHRvIGNvbnZlcnQgZnJvbXR5cGUgdG8gdG90eXBlIGFuZCByZXR1cm4gLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhcmlhYmxlICRmcm9tIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBvZiB0aGUKICAgICAgICAgICAgdHlwZSBiZWluZyBjb252ZXJ0ZWQgZnJvbS4gVGhlIGNvZGUgbXVzdCByZXR1cm4gdGhlIHRvdHlwZSBjYXN0IHRvIHZvaWQgKi4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVGltZTsKICAgICAgICAgICAgICBjbGFzcyBEYXRlOwogICAgICAgICAgICAgIERhdGUgJlRpbWU6OmRhdGVGcm9tVGltZSgpOwoKICAgICAgICAgICAgICAldHlwZXMoVGltZSA9IERhdGUpICV7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKikkZnJvbTsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgcmVzdWx0aW5nIGluIHRoZSBjb252ZXJzaW9uIC8gY2FzdGluZyBjb2RlIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIHN0YXRpYyB2b2lkICpfcF9UaW1lVG9fcF9EYXRlKHZvaWQgKngpIHsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKXg7CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgcGxlYXNlIHVzZSBvbmx5IGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLgoKMDEvMzAvMjAwODogbWdvc3NhZ2UKCSAgICBTbWFsbCB1cGRhdGUgdG8gZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sLCB0byB3YXJuIGFib3V0IHVzZSBvZiBsb2NhbCAKCSAgICB2YXJpYWJsZXMgaW4gdHlwZW1hcHMgZm9yIG11bHRpcGxlIHR5cGVzLgoKMDEvMjUvMjAwODogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IGJ1ZyByZXBvcnRlZCBieSBLZXZpbiBNaWxscyBpbiBBUlJBWVNPRkNMQVNTRVMgdHlwZW1hcHMgd2hlcmUgYW55CiAgICAgICAgICAgIGNoYW5nZXMgbWFkZSB0byBhbiBhcnJheSBlbGVtZW50IHBhc3NlZCBmcm9tIEphdmEgdG8gQyBhcmUgbm90IHJlZmxlY3RlZCBiYWNrCiAgICAgICAgICAgIGludG8gSmF2YS4KCjAxLzI0LzIwMDg6IG1nb3NzYWdlCgkgICAgTW9yZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgIEFsc28gbG9va3MgaW4gL3Vzci9pbmNsdWRlL2x1YSoKCSAgICBBbHNvIGNoYW5nZWQgdHlwZW1hcHMuaSBub3QgdG8gY2hlY2sgZm9yIE5VTEwgYmVmb3JlIGZyZWVpbmcgYSBwb2ludGVyCgowMS8yMS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZvciBTVEwgY29udGFpbmVycywgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8gY29udmVydCBmcm9tIG9uZQogICAgICAgICAgICBTVEwgY29udGFpbmVyIHRvIGFub3RoZXIsIGVnIGZyb20gc3RkOjp2ZWN0b3I8aW50PiB0byBzdGQ6OnZlY3Rvcjxkb3VibGU+CiAgICAgICAgICAgIG9yIHN0ZDo6bGlzdDxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGludD4gb3IgZXZlbiBzdGQ6OnZlY3RvcjxGb28+IHRvCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJhcj4gYXMgaXQgcHJldmlvdXNseSBkaWQuIEluIGZhY3QgU1dJRyBubyBsb25nZXIgYXR0ZW1wdHMgdG8KICAgICAgICAgICAgY29udmVydCBhbnkgU1dJRyB3cmFwcGVkIEMrKyBwcm94eSBjbGFzcyB0aGF0IGlzIGFsc28gYSBQeXRob24gc2VxdWVuY2UsCiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZC4gQW55IG5vbi1TV0lHIFB5dGhvbiBzZXF1ZW5jZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICAgIGFjY2VwdGVkIHdoZXJldmVyIGFuIFNUTCBjb250YWluZXIgaXMgYWNjZXB0ZWQuIE92ZXJsb2FkZWQgbWV0aG9kcyB1c2luZwogICAgICAgICAgICBjb250YWluZXJzIHNob3VsZCBiZSBmYXN0ZXIuCgowMS8xOC8yMDA4OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICdkaXJlY3RvcmluYXR0cmlidXRlcycgYW5kICdkaXJlY3Rvcm91dGF0dHJpYnV0ZXMnIHR5cGVtYXAgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdGhlIGltdHlwZSB0eXBlbWFwLiBUaGVzZSBzaG91bGQgY29udGFpbiBDIyBhdHRyaWJ1dGVzIHdoaWNoIHdpbGwKICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIGludG8gdGhlIEMjIGRpcmVjdG9yIGRlbGVnYXRlIG1ldGhvZHMuCgowMS8xOC8yMDA4OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIGJ5dGUgdmFsdWUgMjU1IGluIGlucHV0IGZpbGVzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIGNoYXIgaXMgc2lnbmVkIChpdCB3YXMgZ2V0dGluZyBtYXBwZWQgdG8gRU9GKS4gIEZpeGVzIFNGIzE1MTgyMTkuCgowMS8xNi8yMDA4OiB3c2Z1bHRvbgoJICAgIEZpeCB0ZW1wbGF0ZSBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZWQgYnkgYSBzbWFydCBwb2ludGVyLiBCdWcgcmVwb3J0ZWQgCiAgICAgICAgICAgIGJ5IFJvYmVydCBMdXB0b24uCgowMS8xNC8yMDA4OiBtZ29zc2FnZQoJICAgIFN1YnN0YW50aWFsIGNoYW5nZXMgdG8gY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICAgIENvZGUgY2FuIG5vdyBsaW5rIHRvIGxpYmx1YS5hLCBsaWJsdWE1MC5hIG9yIGxpYmx1YTUxLmEKCSAgICAgIEl0J3MgYWxzbyBhIGxvdCBuZWF0ZXIgbm93LgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gQmFja2VkIG91dCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKgoKMTIvMTYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MzI2MTMgLSBUZW1wbGF0ZXMgYW5kIHNvbWUgdHlwZWRlZnMgaW52b2x2aW5nIHBvaW50ZXJzIG9yIGZ1bmN0aW9uIHBvaW50ZXJzCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzE2MzI2MjUgLSBDb21waWxhdGlvbiBlcnJvcnMgb24gVmlzdWFsIEMrKyA2IHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqLgoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE4MTk4NDcgJXRlbXBsYXRlIHdpdGgganVzdCBvbmUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IGNsYXNzIEZvbyB7Li4ufTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vRGVmYXVsdCkgRm9vPD47CgoxMi8xMi8yMDA3OiBtZ29zc2FnZQoJICAgIFtMdWFdIFNtYWxsIGNvcnJlY3Rpb24gb24gTHVhLmh0bWwKCjEyLzA5LzIwMDc6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzE4MzgyNDggZnJvbSBNb250eSBUYXlsb3IgZm9yIHZwYXRoIGJ1aWxkcyBvZiBTV0lHLgoKMTIvMDgvMjAwNzogd3NmdWx0b24KCSAgICBbTHVhXSBGaXhlcyB0byByZW1vdmUgZ2NjLTQuMiB3YXJuaW5ncwoKMTIvMDYvMjAwNzogd3NmdWx0b24KCSAgICBGaXggIzE3MzQ0MTUgLSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgdF9pdGVtLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgdF9hbGxvYyA9IHBmYzo6YWxsb2NfZmFzdCA+CiAgICAgICAgICAgICAgICBjbGFzcyBsaXN0X3QgOiBwdWJsaWMgbGlzdF9pbXBsX3Q8dF9pdGVtLHBmYzo6YXJyYXlfdDx0X2l0ZW0sdF9hbGxvYz4gPiB7IC4uLiB9OwoKMTIvMDQvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBGaXggYSBidWcgaW4gdGhlIGNsYXNzIGhpZXJhY2h5IGNvZGUsIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgbm90IHByb3BhZ2F0ZWQsIAoJICAgIGlmIHRoZSBuYW1lIG9yZGVyaW5nIHdhcyBpbiBhIGNlcnRhaW4gb3JkZXIuCgkgICAgQWRkZWQgbmV3IGV4YW1wbGUgcHJvZ3JhbXMgKGR1YWwsIGVtYmVkKSBhbmQgcnVudGltZSB0ZXN0cyBmb3IgdGVzdC1zdWl0ZS4KCjExLzMwLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4IHVzaW5nIHN0YXRlbWVudHMgdXNpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG92ZXJsb2FkZWQuCiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlIHVzaW5nIHN0YXRlbWVudHMgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMsIHRoZXNlCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSB3cmFwcGVycywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZnVuaygpOwogICAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6ZnVuazsKICAgICAgICAgICAgICB9OwoKVmVyc2lvbiAxLjMuMzMgKE5vdmVtYmVyIDIzLCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMS8yMDA3OiBtaWtlbAoJICAgIFthbGxlZ3JvY2xdIG9taXQgcHJpdmF0ZSBzbG90IHR5cGUgaW5mbyBpbiB0aGUgY2xhc3Nlcy90eXBlcwoJICAgIGRlZmluZWQgb24gdGhlIGxpc3Agc2lkZS4gRml4IGJ1ZyBpbiBtYXBwaW5nIG9mIEMvKysgdHlwZXMKCSAgICB0byBsaXNwIHR5cGVzLiBGaXggdHlwbyBpbiBtb2R1bGVzIGdlbmVyYXRlZCBkZWZwYWNrYWdlIGZvcm0uCgkgICAgSGF2ZSBzdGQ6OnN0cmluZyAqJ3MgYXV0b21hdGljYWxseSBtYXJzaGFsbGVkIGJldHdlZW4gZm9yZWlnbgoJICAgIGFuZCBsaXNwIHN0cmluZ3MuCgkKMTEvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpbGwgaW4gUHl0aG9uIERpY3Rpb25hcnkgZnVuY3Rpb25zIGxpc3QgKHBhdGNoIGZyb20KCSAgICBKZWxtZXIgVmVybm9vaWogcG9zdGVkIHRvIHN3aWctZGV2ZWwpLgoKMTEvMjAvMjAwNzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgQyBzY2FubmVyIHJlbGF0ZWQgdG8gYmFja3NsYXNoIGNoYXJhY3RlcnMuCgoxMS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggYnJva2VuIGNvbXBpbGF0aW9uIG9mIEMrKyB3cmFwcGVycyBvbiBzb21lIGNvbXBpbGVycy4KCjExLzE2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBEb24ndCBwYXNzIFB5X3NzaXplX3QgZm9yIGEgJWQgcHJpbnRmLWxpa2UgZm9ybWF0IGFzCgkgICAgdGhhdCdzIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBzaXplb2YoUHlfc3NpemVfdCkgIT0gc2l6ZW9mKGludCkuCgpWZXJzaW9uIDEuMy4zMiAoTm92ZW1iZXIgMTUsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBQYWNrYWdlIG5hbWUgYW5kIGRsbCBuYW1lIGlzIG5vdyB0aGUgc2FtZSBhcyB0aGUgU1dJRyBtb2R1bGUKICAgICAgICAgICAgbmFtZS4gSXQgdXNlZCB0byBiZSB0aGUgbW9kdWxlIG5hbWUgd2l0aCBfd3JhcCBhcyBhIHN1ZmZpeC4gVGhlIHBhY2thZ2UKICAgICAgICAgICAgYW5kIGRsbCBuYW1lcyBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgdGhlIC1wYWNrYWdlIGFuZCAtZGxsIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzExLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBZGQgc3VwcG9ydCBmb3IgV2luZG93cyAoVmlzdWFsIEMrKyA4IHRlc3RlZCkKCjExLzEwLzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbWFrZWZpbGUgZ2VuZXJhdGVkIGJ5IC1tYWtlIChTRiMxNjMzNjc5KS4gIFVwZGF0ZQoJICAgIGRvY3VtZW50YXRpb24gdG8gbWFyayAiLW1ha2UiIGFzIGRlcHJlY2F0ZWQgKG5vbmUgb2YgdGhlIG90aGVyCgkgICAgU1dJRyBiYWNrZW5kcyBzZWVtIHRvIG9mZmVyIHN1Y2ggYSBmZWF0dXJlLCBpdCBjYW4ndCByZWFsaXN0aWNhbGx5CgkgICAgZ2VuZXJhdGUgYSBmdWxseSBwb3J0YWJsZSBtYWtlZmlsZSwgYW5kIHRoZSBjb21tYW5kcyB0byBidWlsZCBhbgoJICAgIGV4dGVuc2lvbiBhcmUgZWFzeSBlbm91Z2ggdG8gd3JpdGUgZm9yIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGJ1aWxkCgkgICAgdG9vbCkuICBBbHNvIHJlY29tbWVuZCBhZ2FpbnN0IHRoZSB1c2Ugb2YgIi1waHBmdWxsIiAoaXQncyBvbmx5CgkgICAgcmVhbGx5IHVzZWZ1bCB3aGVuIHN0YXRpYyBsaW5raW5nLCBhbmQgYSBkeW5hbWljYWxseSBsb2FkYWJsZQoJICAgIG1vZHVsZSBpcyB2aXJ0dWFsbHkgYWx3YXlzIHRoZSBiZXR0ZXIgYXBwcm9hY2gpLgoKMTEvMDkvMjAwNzogb2xseQoJICAgIEZpeCAtLWhlbHAgb3V0cHV0IHRvIG5vdGUgdGhhdCBgZXhwb3J0IFNXSUdfRkVBVFVSRVMnIGlzIHJlcXVpcmVkLgoKMTAvMjkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBzZWcgZmF1bHQgb24gV2luZG93cwogICAgICAgICAgICBbUl0gRXhhbXBsZXMgUiBzY3JpcHRzIGFyZSBub3cgcGxhdGZvcm0gaW5kZXBlbmRlbnQKCjEwLzMwLzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gZml4ZWQgYnVnIGluIHRlbXBsYXRlIGNsYXNzZXMgd2hpY2ggY2FzZXMgdGVtcGxhdGVfZGVmYXVsdDIKCSAgICBhbmQgdGVtcGxhdGVfc3BlY2lhbGl6YXRpb25fZGVmYXJnIHRvIGZhaWwuCgkgICAgQWRkZWQgc2V2ZXJhbCB3YXJuaW5nIGZpbHRlcnMgaW50byB0aGUgb3ZlcmxvYWQncyB0ZXN0IGNhc2VzLgoJICAgIEFkZGVkIHJ1bnRpbWUgdGVzdHMgZm9yIHNldmVyYWwgY29kZXMuCgkgICAgWW91IGNhbiBub3cgbWFrZSBjaGVjay1sdWEtdGVzdC1zdWl0ZSB3aXRoIG5vIGVycm9ycyBhbmQgb25seSBhIGZldyB3YXJuaW5ncy4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgY29uZmlndXJlIHRlc3QgdG8gcHV0IEdVSUxFTElOSyBpbiBMSUJTIG5vdCBMREZMQUdTCgkgICAgKFNGIzE4MjI0MzApLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBndWlsZSBleGFtcGxlcyBvbiA2NC1iaXQgcGxhdGZvcm1zLgoKMTAvMjkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoxMC8yOC8yMDA3OiBvbGx5CgkgICAgW2x1YV0gRml4IHN3aWdfbHVhX2NsYXNzIGluc3RhbmNlcyB0byBiZSBzdGF0aWMgdG8gYWxsb3cgbXVsdGlwbGUKCSAgICBTV0lHIHdyYXBwZXJzIHRvIGJlIGNvbXBpbGVkIGludG8gdGhlIHNhbWUgZXhlY3V0YWJsZSBzdGF0aWNhbGx5LgoJICAgIFBhdGNoIGZyb20gQW5kcmVhcyBGcmVkcmlrc3NvbiAocG9zdGVkIHRvIHRoZSBzd2lnIG1haWxpbmcgbGlzdCkuCgoxMC8yOC8yMDA3OiBvbGx5CgkgICAgW2x1YV0gRml4IEV4YW1wbGVzL2x1YSB0byBwYXNzIFNSQ1MgZm9yIEMgdGVzdHMgcmF0aGVyIHRoYW4gQ1hYU1JDUy4KCSAgICBUaGUgY29kZSBhcyBpdCB3YXMgaGFwcGVuZWQgdG8gd29yayBvbiB4ODYsIGJ1dCBicm9rZSBvbiB4ODZfNjQgKGFuZAoJICAgIHByb2JhYmx5IGFueSBvdGhlciBwbGF0Zm9ybXMgd2hpY2ggcmVxdWlyZSAtZlBJQykuCgoxMC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBhcHByb2FjaCBmb3IgZml4aW5nIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IKICAgICAgICAgICAgbWV0aG9kcyB1c2luZyB0aGUgbmV3IHRlbXBsYXRlZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBTd2lnVmFsdWVJbml0KCkuCgoxMC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gVXNlIG1vcmUgZWZmaWNpZW50IFN2UFZfbm9sZW4oeCkgaW5zdGVhZCBvZiBTdlBWKHgsUExfbmEpIGlmIFN2UFZfbm9sZW4gaXMKICAgICAgICAgICAgc3VwcG9ydGVkLgoKMTAvMjYvMjAwNzogd3V6emViCgkgICAgW0NoaWNrZW5dIEZpeCBnbG9iYWwgdmFyaWFibGVzIG9mIGNsYXNzIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCSAgICBPdGhlciBtaW5vciBmaXhlcywgc28gYWxsIHRlc3RzIGluIHRoZSBjaGlja2VuIHRlc3Qgc3VpdGUgbm93IHBhc3MKCjEwLzI1LzIwMDc6IG9sbHkKCSAgICBGaXggVVRMIHR5cGVjaGVjayBtYWNybyBmb3IgYSBmdW5jdGlvbiB0YWtpbmcgY2hhcltdIG9yIGNvbnN0CgkgICAgY2hhcltdIChTRiMxODIwMTMyKS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpbHRlciBvdXQgLWFuc2kgLXBlZGFudGljIGZyb20gQ0ZMQUdTIHdoaWxlIGNvbXBpbGluZyB0ZXN0IHByb2dyYW1zIGZvciBHdWlsZQoJICAgIGluIGNvbmZpZ3VyZS4gIFRoaXMgZW5hYmxlcyBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlIGZvciBHdWlsZSBpZiBpdCBpcyBpbnN0YWxsZWQgYW5kCgkgICAgdXNhYmxlLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSBGaXggdGVzdGNhc2VzIGFwcGx5X3NpZ25lZF9jaGFyIGFuZCBhcHBseV9zdHJpbmdzCgkgICAgYnkgYWRkaW5nIGV4cGxpY2l0IGNhc3RzIHRvIHRoZSBhcHByb3ByaWF0ZSAkbHR5cGUuCgoxMC8yMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEJ1ZyAjMTc5NDI0NyAtIGZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgZGVyaXZlZCBjbGFzc2VzIHdoZW4gY3NiYXNlIG9yIGphdmFiYXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGFyZSB1c2VkIHdpdGggdGhlIHJlcGxhY2U9IjEiIGF0dHJpYnV0ZS4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIERvY3MgdXBkYXRlZCB0byBzdWdnZXN0IHVzaW5nIGRpc3R1dGlscy4gUGF0Y2ggIzE3OTY2ODEgZnJvbSBDaHJpc3RvcGhlciBCYXJrZXIuCgoxMC8xOS8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBDbGVhciBlcnJubyBiZWZvcmUgY2FsbHMgdG8gc3RydG9sKCksIHN0cnRvdWwoKSwgc3RydG9sbCgpCgkgICAgYW5kIHN0cnRvdWxsKCkgd2hpY2ggd2UgY2hlY2sgZXJybm8gYWZ0ZXIgdG8gYXZvaWQgc2VlaW5nIGEganVuawoJICAgIHZhbHVlIG9mIGVycm5vIGlmIHRoZXJlIGlzbid0IGFuIGVycm9yIGluIHRoZSBjYWxsLgoKMTAvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlICVhdHRyaWJ1dGVfcmVmIGFuZCByZXBsYWNlIHdpdGggJWF0dHJpYnV0ZXJlZi4gVGhlcmUgaXMganVzdCBhbiBhcmd1bWVudAogICAgICAgICAgICBvcmRlciBjaGFuZ2UgaW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCAlYXR0cmlidXRlLCBmcm9tOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihDbGFzcywgQXR0cmlidXRlVHlwZSwgQWNjZXNzb3JNZXRob2QsIEF0dHJpYnV0ZU5hbWUpCiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZXJlZihDbGFzcywgQXR0cmlidXRlVHlwZSwgQXR0cmlidXRlTmFtZSwgQWNjZXNzb3JNZXRob2QpCgoxMC8xNi8yMDA3OiBvbGx5CgkgICAgW1RjbF0gRml4IHNldmVyYWwgb2NjdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiBOb3RlIHRoYXQgJG93bmVyIGhhcyBhbHdheXMgYmVlbiBzdXBwb3J0ZWQgaW4gdGhlICJqYXZhb3V0IiAvICJjc291dCIKICAgICAgICAgICAgdHlwZW1hcHMuCgowOC8wMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc21hcnQgcG9pbnRlciBoYW5kbGluZyBmb3IgY2xhc3NlcyB0aGF0IGhhdmUgdGVtcGxhdGVkIG1ldGhvZHMgd2l0aGluIHRoZSBzbWFydAogICAgICAgICAgICBwb2ludGVyIHR5cGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgY3JhaWdkbyBhdCBlZS53YXNoaW5ndG9uLmVkdS4KCjA3LzMxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gZml4ZWQgbWVtb3J5IGFjY2VzcyBhZnRlciBiZWluZyBmcmVlZCBidWcuIHRoYW5rcyB0byBNYXJ0aW4gUGVyY29zc2kuCiAgICAgICAgICAgIHBhY2thZ2UgbmFtZSBjbG9zIGNoYW5nZWQgdG8gY2wuIHRoYW5rcyB0byBSYWxmIE1hdHRlcwoKMDcvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGFyYWxsZWwgbWFrZSBzdXBwb3J0IGFkZGVkIGZvciB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgZm9yIGRldmVsb3BlcnMgd2hvIGhhdmUKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBDUFUuIE5vdyBwYXJhbGxlbCBtYWtlIGNhbiBiZSB1c2VkIGZvciBjaGVja2luZyBpbiBhZGRpdGlvbiB0byBidWlsZGluZwogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlLiBTb21lIHR5cGljYWwgY2hlY2tpbmcgZXhhbXBsZXM6CgogICAgICAgICAgICAgIG1ha2UgLWo4IC1rIGNoZWNrCiAgICAgICAgICAgICAgbWFrZSAtajQgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSAtajIgY2hlY2stamF2YS1leGFtcGxlcwoKMDcvMTkvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgRml4ZWQgYnVnIHRoYXQgc3RvcHBlZCBjb25maWd1cmUgd29ya2luZyBvbiBtaW5ndyAoYXBwbGllZCBkb3MydW5peCB0byBjb25maWd1cmUuaW4pCgowNy8xMC8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBFeHRyYSBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMSAodXBkYXRlZCBTV0lHX2luaXQsIGRvY3MsIGV4YW1wbGVzLCB0ZXN0IHN1aXRlKQoJICAgIFJlbW92ZWQgbmFtZSBjbGFzaCBmb3Igc3RhdGljIGxpbmsgb2YgbXVsdGlwbGUgbW9kdWxlcwoKMDcvMDUvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRml4IGEgYnVnIGluIFNXSUdfQUxMT0NfQVJSQVkoKQogICAgICAgICAgICBpbXByb3ZlZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCBhcmd1bWVudHMuCiAgICAgICAgICAgIENoYW5nZWQgdGhlIG91dHB1dCBvZiBzd2lnX3R5cGUoKSB0byB1c2UgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHR5cGUsCgkgICAgcmF0aGVyIHRoYW4gdGhlIHJhdyBzd2lnIHR5cGUuCgowNy8wMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvcnMgZm9yIHNvbWUgb3ZlcmxvYWRlZCBtZXRob2RzIHdoZXJlIHRoZSBpbXR5cGUgcmVzdWx0ZWQgaW4gaWRlbnRpY2FsCiAgICAgICAgICAgIG1ldGhvZHMgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBDIyBkaXJlY3RvciBjbGFzcywgZWcgdm9pZCBmb28oaW50ICopIGFuZCB2b2lkIGZvbyhkb3VibGUgKikKICAgICAgICAgICAgdXNlZCB0byBnZW5lcmF0ZWQgdHdvIG9mIHRoZXNlOgoKICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgU3dpZ0RpcmVjdG9yZm9vKEludFB0ciBwKSB7IC4uLiB9CgowNi8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgcGFyYW1ldGVyIG5hbWUgY2hhbmdlcyBpbiBzdGRfdmVjdG9yLmkgYWxsb3dpbmcgYmV0dGVyIHRhcmdldGluZwogICAgICAgICAgICBvZiB0eXBlbWFwcyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgKGZvciBtZW1vcnkgbWFuYWdlbWVudCBvZiBjb250YWluZXJzIG9mIHBvaW50ZXJzKS4KCjA2LzA3LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCBmb3JlaWduLXR5cGUgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgbG9vayBmb3IgZmZpdHlwZSB0eXBlbWFwCgkgICAgYmluZGluZ3MuIGZpeCBpbm91dF90eXBlbWFwcy5pIGZvciBzdHJpbmdzLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtSdWJ5XQoJICAgIFVzZSB3aGljaGV2ZXIgb2YgImxvbmciIG9yICJsb25nIGxvbmciIGlzIHRoZSBzYW1lIHNpemUgYXMgInZvaWQqIgoJICAgIHRvIGhvbGQgcG9pbnRlcnMgYXMgaW50ZWdlcnMsIHJhdGhlciB0aGFuIHdoaWNoZXZlciBtYXRjaGVzIG9mZl90LgoJICAgIEZpeGVzIGNvbXBpbGF0aW9uIG9uIE9TIFggYW5kIEdDQyB3YXJuaW5ncyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBzaXplb2Yodm9pZCopIDwgc2l6ZW9mKG9mZl90KSAoU0YgcGF0Y2ggIzE3MzE5NzkpLgoKMDYvMDYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCBoYW5kbGluZyBvZiBhIHBhcnRpY3VsYXIgY2FzZSBpbnZvbHZpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KCjA2LzA1LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBjYXNlIHdoZXJlIHdlJ2QgcGFzcyBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllcnMKCSAgICAoaS5lLiBOUzE6Ok5TMjo6Rk9PKSB0byBzd2lnLWluc2VydC1pZC4gQWxsIG5hbWVzcGFjZXMKCSAgICBzaG91bGQgYmUgc3RyaXBwZWQuCgoJICAgIEZpeCBidWcgaW4gVHlwZWRlZkhhbmRsZXIgaW50cm9kdWNlZCBieSBsYXN0IGZpeC4KCjA2LzA1LzIwMDc6IG9sbHkKCSAgICBGaXggcmVwb3J0aW5nIG9mIGZpbGVuYW1lcyBpbiBlcnJvcnMgYWZ0ZXIgJWluY2x1ZGUgKHBhdGNoIGZyb20KCSAgICBMZWlnaCBTbWl0aCBpbiAjMTczMTA0MDsgYWxzbyByZXBvcnRlZCBhcyAjMTY5OTk0MCkuCgowNS8zMS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggIm1pc3NpbmcgaW5pdGlhbGlzZXIiIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBjb2RlIHdpdGggUHl0aG9uIDIuNSB3aXRoIHdhcm5pbmdzIGVuYWJsZWQgKHBhdGNoIGZyb20KCSAgICBidWcjMTcyNzY2OCBmcm9tIEx1a2UgTW9vcmUpLgoKMDUvMjkvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgU3BsaXQgZG9jc3RyaW5ncyBpbnRvIHNlcGFyYXRlIHN0cmluZyBsaXRlcmFscyBhdCBlYWNoIG5ld2xpbmUgd2hlbgoJICAgIGdlbmVyYXRpbmcgQy9DKysgd3JhcHBlciBjb2RlICh0aGUgQy9DKysgY29tcGlsZXIgd2lsbCBqdXN0IGNvbWJpbmUKCSAgICB0aGVtIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCkuICBUaGlzIGF2b2lkcyBNU1ZDCgkgICAgY29tcGxhaW5pbmcgdGhhdCB0aGUgc3RyaW5ncyBhcmUgdG9vIGxvbmcgKHByb2JsZW0gcmVwb3J0ZWQgYnkKCSAgICBCbyBQZW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QpLgoKMDUvMjgvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRXNjYXBlIGJhY2tzbGFzaGVzIGluIGRvY3N0cmluZ3MuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBGaXggYXV0b2RvYyBnZW5lcmF0aW9uIG9mIGVudW1zIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUKCSAgICBlbnVtcyBhcmUgd3JhcHBlZCAtIHBhdGNoICMxNjk3MjI2IGZyb20gSm9zaCBDaGVycnkuCgowNS8yNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IHdyYXBwaW5nIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHRvIGEKCSAgICBjbGFzcyAoYnVnIzE3MDA3ODgpIGFuZCB0aG9zZSB3aGljaCBoYXZlIG92ZXJsb2FkZWQgZm9ybXMgcmV0dXJuaW5nCgkgICAgYm90aCBjbGFzc2VzIGFuZCBub24tY2xhc3NlcyAoYnVnIzE3MTI3MTcsIHRoYW5rcyB0byBTaW1vbgoJICAgIEJlcnRoaWF1bWUgZm9yIHRoZSBwYXRjaCkuCgowNS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAlcmVuYW1lIGluY29uc2lzdGVuY3kgaW4gY29udmVyc2lvbiBvcGVyYXRvcnMgYXMgcmVwb3J0ZWQgYnkgWmhvbmcgUmVuLiBUaGUgbWF0Y2hpbmcKICAgICAgICAgICAgaXMgbm93IGRvbmUgb24gdGhlIG9wZXJhdG9yIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IGlzIGRvbmUgZm9yIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBBQkMoKSBjb25zdDsKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKEFCQyBhKSBjb25zdDsKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgQUJDIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKEFCQyBhKSBjb25zdCB7fQogICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEFCQygpIGNvbnN0IHsgQUJDIGE7IHJldHVybiBhOyB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBxdWFsaWZ5aW5nIHRoZSBjb252ZXJzaW9uIG9wZXJhdG9yIHByZXZpb3VzbHkgbWF5IG9yIG1heSBub3QgaGF2ZSBtYXRjaGVkLgogICAgICAgICAgICBOb3cgaXQgZGVmaW5pdGVseSB3b24ndCwgc28gdGhpcyB3aWxsIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgU3BhY2U6OkFCQygpIGNvbnN0OwoKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhpcyBkb2VzIG5vdCBtYXRjaDoKCiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChTcGFjZTo6QUJDIGEpIGNvbnN0OwoKICAgICAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgd2l0aCByZXNwZWN0IHRvICVyZW5hbWUsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcy4KICAgICAgICAgICAgQ29udmVyc2lvbiBvcGVyYXRvcnMgZG9jdW1lbnRhdGlvbiB0b28uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA1LzE2LzIwMDc6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggYmFkIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyIGx0eXBlJ3MgaW4gZnVuY3Rpb25XcmFwcGVyKCkuCgkgICAgVHJ5IHRvIHdvcmsgYmV0dGVyIHdpdGggdGhlIGJhY2t3YXJkIG9yZGVyIGluIHdoaWNoIHN3aWcKCSAgICB1bnJvbGxzIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucy4KCSAgICBjbGVhbmVkIHVwIGEgbGl0dGxlIHVubmVjZXNzYXJ5IGNvZGUvZGVidWcgcHJpbnRmJ3MuCgkgICAgUmVtb3ZlIHdhcm5pbmcgd2hlbiByZXBsYWNpbmcgJGxkZXN0cnVjdG9yIGZvciBmZjpmb3JlaWduLXBvaW50ZXIKCjA1LzEyLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIHN3aWcgLXB5dGhvbiAtdGhyZWFkcyBub3cgZ2VuZXJhdGVzIEMvQysrIGNvZGUgd2hpY2ggdXNlcyBQeXRob24ncwoJICAgIG93biB0aHJlYWRpbmcgYWJzdHJhY3Rpb24gKGZyb20gcHl0aHJlYWQuaCkgcmF0aGVyIHRoYW4gT1Mgc3BlY2lmaWMKCSAgICBjb2RlLiAgVGhlIG9sZCBjb2RlIGZhaWxlZCB0byBjb21waWxlIG9uIE1TIFdpbmRvd3MuICAoU2VlIFNGIHBhdGNoCgkgICAgdHJhY2tlciAjMTcxMDM0MSkuCgowNS8wNC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIFNUTCByZW5hbWVzIHRvIGJlIGdsb2JhbCByZW5hbWVzLiAgVGhpcyBmaXhlcwoJICAgIFNUTCBmdW5jdGlvbnMgbm90IGJlaW5nIHJlbmFtZWQgd2hlbiBhdXRvcmVuYW1lIGlzIG9uLgogICAgICAgICAgICBUaGlzIGlzIGEgbm90IGEgdG90YWxseSBwZXJmZWN0IHdvcmstYXJvdW5kLCBidXQgYmV0dGVyLgoJICAgIFNvbWVvbmUgcmVhbGx5IG5lZWRzIHRvIGZpeCB0aGUgdGVtcGxhdGUgcmVuYW1pbmcgY29kZS4KCSAgICAoU2VlIGJ1ZyAjMTU0NTYzNCkKCjA1LzA0LzIwMDcgIGdnYQoJICAgIFtBbGxdCiAgICAgICAgICAgIENoYW5nZWQgJXJlbmFtZSgiJSh1bmRlcmNhc2UpcyIpIGEgbGl0dGxlIHNvIHRoYXQgc2luZ2xlCgkgICAgbnVtYmVycyBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYXJlIG5vdCB1bmRlcmNhc2VkLiAgVGhhdCBpczoKCQlnZXRTb21ldGhpbmcgLT4gZ2V0X3NvbWV0aGluZwoJCWdldDJECSAgICAgLT4gZ2V0XzJkCgkJZ2V0MjM0CSAgICAgLT4gZ2V0XzIzNAoJICAgIEJVVDoKCQlhc0Zsb2F0MiAgICAgLT4gYXNfZmxvYXQyCgkgICAgKEJ1ZyAjMTY5OTcxNCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgX19zd2lndHlwZV9fID0+IEBfX3N3aWd0eXBlX18gc28gaXQgY2FuIGJlIGFjY2Vzc2VkCgkgICAgZnJvbSB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIChhbmQgZm9sbG93cyBSdWJ5J3Mgb2ZmaWNpYWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwganVzdCBpbiBjYXNlKS4KCSAgICBNYWRlIHRyYWNraW5nID0+IEBfX3RyYWNraW5nc19fIGZvciBzYW1lIHJlYXNvbi4KCSAgICBDdXJyZW50bHkgc3RvcmluZyBpdmFycyB3aXRob3V0IHRoZSBAIHNlZW1zIHZhbGlkLCBidXQKCSAgICB0aGUgUGlja0F4ZSBzYXlzIHRoaXMgaXMgbm90IGNvcnJlY3QsIHNvIGp1c3QgaW4gY2FzZS4uLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQXBwbGllZCBwYXRjaCBmb3IgLW1pbmhlcml0IGJ1ZyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMuCgkgICAgVGhpcyBpc3N1ZSBzaG91bGQgYmUgcmV2aXNpdGVkIG1vcmUgY2xvc2VseSwgYXMgTXVsdGlwbGUKCSAgICBJbmhlcml0YW5jZSBpbiBSdWJ5IGlzIHN0aWxsIHByb2JsZW1hdGljLgoJICAgIChwYXRjaC9idWcgIzE2MDQ4NzgpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucyBpbiBydWJ5IHdpbGwgbm93IHJlcG9ydCB0byB0aGUgdXNlcgogICAgICAgICAgICB0aGUgcG9zc2libGUgcHJvdG90eXBlcyB3aGVuIHRoZSB1c2VyIG1pc3R5cGVzIHRoZSBudW1iZXIgb3IKICAgICAgICAgICAgdHlwZSBvZiBhIHBhcmFtZXRlci4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZvcmdvdCB0byBkb2N1bWVudCB0aGUgYnVnIGZpeGluZyBvZiBhbiBvbGQgYnVnIHJlZ2FyZGluZwoJICAgIGV4Y2VwdGlvbnMuCgkgICAgKGJ1ZyAjMTQ1ODI0NykKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byB1c2UgdGhlIHByb3BlciBjc3Mgc3R5bGVzIGZvcgoJICAgIGVhY2ggc2VjdGlvbi4gQWRkZWQgYXV0b2RvYyBzZWN0aW9uIHRvIFJ1YnkncyBkb2NzIHRvCgkgICAgZG9jdW1lbnQgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSBSdWJ5IGluIGRvY3VtZW50aW5nIGl0cyBtb2R1bGVzLgoJICAgIE1hZGUgcmRvYyBkb2N1bWVudGF0aW9uIHNwaXQgb3V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzICsKCSAgICBtZXRob2QgbmFtZS4gIEFsYmVpdCB0aGlzIHdpbGwgbWFrZSB0aGUgY3VycmVudCByZG9jIG5vdCByZWNvZ25pemUKICAgICAgICAgICAgdGhlIG1ldGhvZCwgdGhpcyBpcyBzdGlsbCBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gZGlmZmVyZW50CiAgICAgICAgICAgIGNsYXNzZXMgd2l0aCBzaW1pbGFyIG1ldGhvZHMgKHJkb2Mgd2FzIGNyZWF0ZWQgdG8gZG9jdW1lbnQgdGhlCgkgICAgcnVieSBzb3VyY2Ugd2hpY2ggb25seSBjb250YWlucyBvbmUgY2xhc3MgcGVyIGMgZmlsZSwgdW5saWtlIHN3aWcpCiAgICAgICAgICAgIEkgaGF2ZSBwYXRjaGVkIHJkb2MgdG8gbWFrZSBpdCBtb3JlIGZyaWVuZGx5IHRvIHN3aWcuICBUaGlzCiAgICAgICAgICAgIHBhdGNoIG5lZWRzIHRvIGJlIG1lcmdlZCBpbiB0aGUgcnVieSBzdGQgbGlicmFyeSBub3cuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIGZsYWcgLWZlYXR1cmUgdG8gYmUgLWluaXRfbmFtZSB0byBiZXR0ZXIgcmVmbGVjdCBpdHMKCSAgICBwdXJwb3NlIGFuZCBhdm9pZCBjb25mdXNpb24gd2l0aCAtZmVhdHVyZXMuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCBhdXRvZG9jIGdlbmVyYXRpb24uCgkgICAgQWRkZWQgYXV0b2RvYyAuc3dnIGZpbGVzIHRvIFJ1YnkgbGlicmFyeSBmb3IgZWFzaWx5IGFkZGluZwoJICAgIGRvY3VtZW50YXRpb24gdG8gY29tbW9uIFJ1YnkgbWV0aG9kcyBhbmQgU1RMIG1ldGhvZHMuCgkgICAgRml4ZWQgYXV0b2RvYyBkb2N1bWVudGluZyBvZiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFuZCBtb2R1bGUuCgkgICAgTWFkZSB0ZXN0IHN1aXRlIGFsd2F5cyBnZW5lcmF0ZSBhdXRvZG9jcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgc29tZSB3YXJuaW5ncyBmcm9tIFNUTCBhbmQgdGVzdCBzdWl0ZS4KCjA1LzAyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGlzc3VlcyB3aXRoIEMrKyBjbGFzc2VzIGFuZCBoaWVyYWNoaWVzIGFjcm9zcyBtdWx0aXBsZQoJICAgIHNvdXJjZSBmaWxlcy4gRml4ZWQgaW1wb3J0cyB0ZXN0IGNhc2UgJiBhZGRlZCBydW4gdGVzdC4KCSAgICBBZGRlZCBFeGFtcGxlcy9pbXBvcnRzLgoJICAgIEFkZGVkIHR5cGVuYW1lIGZvciByYXcgbHVhX1N0YXRlKgoJICAgIEFkZGVkIGRvY3VtZW50YXRpb24gb24gbmF0aXZlIGZ1bmN0aW9ucy4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIERvY3N0cmluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuCgkgICAgJWZlYXR1cmUoImF1dG9kb2MiKSBhbmQgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cKCSAgICBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gUnVieS4gIFRoZXNlIGZlYXR1cmVzIHdpbGwgZ2VuZXJhdGUKCSAgICBhIF93cmFwLmN4eCBmaWxlIHdpdGggcmRvYyBjb21tZW50cyBpbiB0aGVtLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgU1RMIGZpbGVzIGhhdmUgYmVlbiB1cGdyYWRlZCB0byBmb2xsb3cgdGhlIG5ldyBzd2lnL3B5dGhvbgoJICAgIExpYi9zdGQgY29udmVudGlvbnMuCgkgICAgVGhpcyBtZWFucyBzdGQ6OnZlY3Rvciwgc3RkOjpzZXQsIHN0ZDo6bWFwLCBzZXQ6Om11bHRpbWFwLAoJICAgIHN0ZDo6bXVsdGlzZXQsIHN0ZDo6ZGVxdWUgYW5kIHN0ZDo6c3RyaW5nIGFyZSBub3cgcHJvcGVybHkKCSAgICBzdXBwb3J0ZWQsIGluY2x1ZGluZyB0aGVpciBpdGVyYXRvcnMsIHN1cHBvcnQgZm9yIGNvbnRhaW5pbmcKCSAgICBydWJ5IG9iamVjdHMgKHN3aWc6OkdDX1ZBTFVFKSBhbmQgc2V2ZXJhbCBvdGhlciBydWJ5CgkgICAgZW5oYW5jZW1lbnRzLgoJICAgIHN0ZDo6Y29tcGxleCwgc3RkOjppb3MsIHN0ZDo6aW9zdHJlYW0sIHN0ZDo6aW9zdHJlYW1idWYgYW5kCgkgICAgc3RkOjpzc3RyZWFtIGFyZSBub3cgYWxzbyBzdXBwb3J0ZWQuCgkgICAgc3RkOjp3c3RyaW5nLCBzdGQ6Ondpb3MsIHN0ZDo6d2lvc3RyZWFtLCBzdGQ6Ondpb3N0cmVhbWJ1ZgoJICAgIGFuZCBzdGQ6Ondzc3RyZWFtIGFyZSBzdXBwb3J0ZWQgdmVyYmF0aW0gd2l0aCBubyB1bmljb2RlCgkgICAgY29udmVyc2lvbi4KCgkgICAgc3RkX3ZlY3Rvci5pIG5vdyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIFJ1YnkgQXJyYXlzIG11Y2ggbW9yZQoJICAgIGNsb3NlbHksIHN1cHBvcnRpbmcgc2xpY2luZywgc2hpZnRpbmcsIHVuc2hpZnRpbmcsCiAgICAgICAgICAgIG11bHRpcGxlIGluZGV4aW5nIGFuZCBwcm9wZXIgcmV0dXJuIHZhbHVlcyBvbiBhc3NpZ25tZW50LgoKCSAgICBDT01QQVRBQklMSVRZIE5PVEU6IHRoaXMgY2hhbmdlcyB0aGUgb2xkZXIgYXBpIGEgbGl0dGxlIGJpdCBpbgoJICAgIHRoYXQgaW1wcm9wZXIgaW5kZXhpbmcgd291bGQgcHJldmlvdXNseSAoaW5jb3JyZWN0bHkpIHJhaXNlCgkgICAgZXhjZXB0aW9ucy4gIE5vdywgbmlsIGlzIHJldHVybmVkIGluc3RlYWQsIGZvbGxvd2luZyBydWJ5J3MKCSAgICBzdGFuZGFyZCBBcnJheSBiZWhhdmlvci4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgdGhlIHZhbHVlIG9mIFNXSUdfVFlQRUNIRUNLX0JPT0wgdG8gYmUgMTAwMDAgKGllLiBoaWdoZXIKCSAgICB0aGFuIHRoYXQgb2YgYWxsIGludGVnZXJzKS4KCSAgICBUaGlzIGlzIGJlY2F1c2UgUnVieSBhbGxvd3MgdHlwZWNhc3RpbmcKCSAgICBpbnRlZ2VycyBkb3duIHRvIGJvb2xlYW5zIHdoaWNoIGNhbiBtYWtlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9uCgkgICAgYm9vbHMgYW5kIGludGVnZXJzIHRvIGZhaWwuCgkgICAgKGJ1ZyMgMTQ4ODE0MikKCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIGEgc3VidGxlIGJ1ZyBpbiBtdWx0aXBsZSBhcmdvdXRzIHRoYXQgY291bGQgZ2V0IHRyaWdnZXJlZCBpZgoJICAgIHRoZSB1c2VyIHJldHVybmVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyBhbmQgdGhlIGZpcnN0IG9uZSB3YXMgYW4KCSAgICBhcnJheS4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIGRvY3VtZW50IHRoZSBuZXcgZmVhdHVyZXMKICAgICAgICAgICAgYWRkZWQsIGFkZCBkaXJlY3RvcmluL291dC9hcmdvdXQgdHlwZW1hcHMsIGV0Yy4KCjA1LzAxLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFkZGVkICVpbml0c3RhY2sgYW5kICVpZ25vcmVzdGFjayBkaXJlY3RpdmVzIGZvciBkaXJlY3RvcgoJICAgIGZ1bmN0aW9ucy4gIFRoZXNlIGFsbG93IHlvdSB0byBjb250cm9sIHdoZXRoZXIgYSBkaXJlY3RvcgoJICAgIGZ1bmN0aW9uIHNob3VsZCByZS1pbml0IHRoZSBSdWJ5IHN0YWNrLgoJICAgIFRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCBmb3IgYW4gZW1iZWRkZWQgUnVieSB3aGVyZSB0aGUKCSAgICBkaXJlY3RvciBtZXRob2QgaXMgdXNlZCBhcyBhIEMrKyBjYWxsYmFjayBhbmQgbm90IGNhbGxlZAogICAgICAgICAgICBieSB0aGUgdXNlciBmcm9tIHJ1YnkgY29kZS4KCSAgICBFeHBsYW5hdGlvbjoKCSAgICBSdWJ5J3MgR0MgbmVlZHMgdG8gYmUgYXdhcmUgb2YgdGhlIHJ1bm5pbmcgT1Mgc3RhY2sgaW4gb3JkZXIgdG8KCSAgICBtYXJrIGFueSBWQUxVRSAoUnVieSBvYmplY3RzKSBpdCBmaW5kcyB0aGVyZSB0byBhdm9pZCBjb2xsZWN0aW9uCgkgICAgb2YgdGhlbS4gIFRoaXMgYWxsb3dzIHRoZSBydWJ5IEFQSSB0byBiZSB2ZXJ5IHNpbXBsZSBhbmQgYWxsb3dzCgkgICAgeW91IHRvIHdyaXRlIGNvZGUgbGlrZSAiVkFMVUUgYSA9IHN0aCIgYW55d2hlcmUgd2l0aG91dCBuZWVkaW5nCgkgICAgdG8gZG8gdGhpbmdzIGxpa2UgcmVmY291bnRpbmcgbGlrZSBweXRob24uCgkgICAgQnkgZGVmYXVsdCwgdGhlIHN0YXJ0IG9mIHRoZSBzdGFjayBpcyBzZXQgd2hlbiBydWJ5X2luaXQoKSBpcwoJICAgIGNhbGxlZC4gICBJZiBydWJ5IGlzIGluaXRlZCB3aXRoaW4gbWFpbigpLCBhcyBpdCB1c3VhbGx5IGlzIHRoZQoJICAgIGNhc2Ugd2l0aCB0aGUgbWFpbiBydWJ5IGV4ZWN1dGFibGUsIHJ1Ynkgd2lsbCBiZSBhYmxlIHRvIGNhbGN1bGF0ZQoJICAgIGl0cyBzdGFjayBwcm9wZXJseS4gIEhvd2V2ZXIsIHdoZW4gdGhpcyBpcyBub3QgcG9zc2libGUsIGFzIHdoZW4KCSAgICBydWJ5IGlzIGVtYmVkZGVkIGFzIGEgcGx1Z2luIHRvIGFuIGFwcGxpY2F0aW9uIHdoZXJlIG1haW4gaXMgbm90CgkgICAgYXZhaWxhYmxlLCBydWJ5X2luaXQoKSB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UsIGFuZAoJICAgIHJ1Ynkgd2lsbCBiZSBpbmNvcnJlY3RseSB0cmFja2luZyB0aGUgc3RhY2sgZnJvbSB0aGUgZnVuY3Rpb24KCSAgICB0aGF0IGNhbGxlZCBydWJ5X2luaXQoKSBmb3J3YXJkcyBvbmx5LCB3aGljaCBjYW4gbGVhZCB0bwoJICAgIGFsbCBzb3J0cyBvZiB3ZWlyZCBjcmFzaGVzIG9yIHRvIHJ1YnkgdGhpbmtpbmcgaXQgaGFzIHJ1biBvdXQgb2YKCSAgICBzdGFjayBzcGFjZSBpbmNvcnJlY3RseS4KCSAgICBUbyBhdm9pZCB0aGlzLCBkaXJlY3RvciAoY2FsbGJhY2spIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHRhZ2dlZAoJICAgIHRvIHRyeSB0byByZXNldCB0aGUgcnVieSBzdGFjaywgd2hpY2ggd2lsbCBzb2x2ZSB0aGUgaXNzdWVzLgoJICAgIE5PVEU6IHJ1YnkxLjguNiBzdGlsbCBjb250YWlucyBhIGJ1ZyBpbiBpdCBpbiB0aGF0IGl0cyBmdW5jdGlvbgoJICAgIHRvIHJlc2V0IHRoZSBzdGFjayB3aWxsIG5vdCBhbHdheXMgZG8gc28uICBUaGlzIGJ1ZyBpcyB0cmlnZ2VyZWQKCSAgICB2ZXJ5IHJhcmVseSwgd2hlbiBydWJ5IGlzIGNhbGxlZCBmcm9tIHR3byB2ZXJ5IGRpc3RpbmN0IHBsYWNlcwoJICAgIGluIG1lbW9yeSwgbGlrZSBhIGJyYW5jaCBvZiBtYWluKCkgYW5kIGFub3RoZXIgZHNvLiAgVGhpcyBidWcKCSAgICBoYXMgbm93IGJlZW4gcmVwb3J0ZWQgdG8gcnVieS1jb3JlIGFuZCBpcyBwZW5kaW5nIGZ1cnRoZXIKCSAgICBpbnZlc3RpZ2F0aW9uLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMzAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNzA3NTgyIC0gUmVzdG9yZSBidWlsZGluZyBmcm9tIHJlYWQtb25seSBzb3VyY2UgZGlyZWN0b3JpZXMuCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IHdpbGwgbm93IHJlcG9ydCB0aGUgcGFyYW1ldGVyIGluZGV4IHByb3Blcmx5IG9uIHR5cGUKCSAgICBlcnJvcnMgYXMgd2VsbCBhcyB0aGUgY2xhc3MgYW5kIHZhbHVlIG9mIHRoZSBpbmNvcnJlY3QKCSAgICBhcmd1bWVudCBwYXNzZWQuCgkgICAgKGZlYXR1cmUgcmVxdWVzdCAjMTY5OTY3MCkKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgbm8gbG9uZ2VyIGNyZWF0ZXMgdGhlIGZyZWVfQ2xhc3MgZnVuY3Rpb24gaWYgdGhlIGNsYXNzCgkgICAgY29udGFpbnMgaXRzIG93biB1c2VyIGRlZmluZWQgZnJlZSBmdW5jdGlvbiAoJWZyZWVmdW5jKS4KCSAgICAoYnVnICMxNzAyODgyKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBkaXJlY3RvcnMgcmFpc2UgYSBydWJ5IGV4Y2VwdGlvbiBmb3IgaW5jb3JyZWN0IGFyZ291dAoJICAgIHJldHVybmVkIHZhbHVlcyBpZiBSVUJZX0VNQkVEREVEIGlzIHNldCwgaW5zdGVhZCBvZiB0aHJvd2luZwoJICAgIGFuIGFjdHVhbCBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoJICAgIFRoaXMgd2lsbCBwcmV2ZW50IGNyYXNoZXMgd2hlbiBydWJ5IGlzIGVtYmVkZGVkIGFuZCB1bmF3YXJlCgkgICAgb2YgdGhlIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHRoZSBuZWVkIGZvciAtRFNXSUdFWFRFUk4uCgkgICAgQ2hhbmdlZCBzd2lnX3J1YnlfdHJhY2tpbmdzIHRvIGJlIGEgc3RhdGljIHZhcmlhYmxlLCBidXQgYWxzbwoJICAgIGJlIGtlcHQgd2l0aGluIGEgaGlkZGVuIGluc3RhbmNlIHZhcmlhYmxlIGluIHRoZSBTV0lHIG1vZHVsZS4KCSAgICBUaGlzIGFsbG93cyBwcm9wZXJseSBkZWFsaW5nIHdpdGggdHJhY2tpbmdzIGFjcm9zcyBtdWx0aXBsZQoJICAgIERTT3MsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGJyb2tlbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBpbXByb3ZlbWVudCB0byBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XSBGaXhlZCBHQyBtZW1vcnkgaXNzdWVzIHdpdGggdHJhY2tpbmdzIHRoYXQgY291bGQgbGVhZAoJICAgIHRvIHNlZ2ZhdWx0cyB3aGVuIGRlYWxpbmcsIG1haW5seSwgd2l0aCBzdGF0aWMgdmFyaWFibGVzLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgU3RyaW5nIGNvbnZlcnNpb24gdXNpbmcgb2xkIHJ1YnkxLjYgbWFjcm9zLiAgTm93CgkgICAgU3RyaW5nVmFsdWVQdHIoKSBpcyB1c2VkIGlmIGF2YWlsYWJsZS4gIFRoaXMgcmVtb3ZlcyB3YXJuaW5ncwoJICAgIHdoZW4gY29udmVydGluZyBzdHJpbmdzIHdpdGggXDAgaW4gdGhlbS4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIHRoZSBhcmdvdXQgY291bnQgaW4gZGlyZWN0b3JzIGZvciBSdWJ5LiAgUHJldmlvdXNseSwKCSAgICBpZ25vcmVkIG9yICJudW1pbnB1dHM9MCIgdHlwZW1hcHMgd291bGQgaW5jb3JyZWN0bHkgbm90IGdldAoJICAgIGNvdW50ZWQgdG93YXJkcyB0aGUgYXJnb3V0IGNvdW50LgoJICAgIChidWcvcGF0Y2ggIzE1NDU1ODUpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBVcGdyYWRlZCBSdWJ5IGNvbnZlcnRlciB0byByZWNvZ25pemUgIm51bWlucHV0cz0wIi4gIFByZXZpb3VzbHksCgkgICAgb25seSB0aGUgb2xkICJpZ25vcmUiIGZsYWcgd2FzIGNoZWNrZWQgKHdoaWNoIHdvdWxkIGN1cnJlbnRseQoJICAgIHN0aWxsIHdvcmsgcHJvcGVybHksIGJ1dCBpcyBkZXByZWNhdGVkKS4KCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5IC0gYnV0IHNob3VsZCBiZSBtYWRlIGdlbmVyaWNdCgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIGFkZGVkLgoKCSAgICBUaGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBpZ25vcmUgdGhlIG91dHB1dCBvZiBhIGZ1bmN0aW9uIHNvCgkgICAgdGhhdCBpdCBpcyBub3QgYWRkZWQgdG8gYSBsaXN0IG9mIG91dHB1dCB2YWx1ZXMKCSAgICAoIGllLiBhcmdvdXRzICkuCgkgICAgVGhpcyBzaG91bGQgYWxzbyBiZWNvbWUgYSBmZWF0dXJlIG9mICV0eXBlbWFwKGRpcmVjdG9yb3V0KQoJICAgIGFzICJudW1vdXRwdXRzIj0wLCBqdXN0IGxpa2UgIm51bWlucHV0cyI9MCBleGlzdHMuCgoJICAgICVmZWF0dXJlKCJkaXJlY3RvcnMiPTEpCgoJICAgICVpbmNsdWRlIDx0eXBlbWFwcy5pPgoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSB7IENsYXNzOjptZW1iZXJfZnVuY3Rpb24xIH07CgkgICAgJXR5cGVtYXAob3V0KSBNU3RhdHVzIHsgLy8gc29tZSBjb2RlLCBsaWtlIGNoZWNrIG1zdGF0dXMKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmFpc2UgZXhjZXB0aW9uIGlmIHdyb25nIH07CgoJICAgICVpbmxpbmUgJXsKCSAgICAgIHR5cGVkZWYgaW50IE1TdGF0dXM7CgkgICAgICBjbGFzcyBDbGFzcyB7CgoJICAgICAgLy8gb25lIGFyZ3VtZW50IHJldHVybmVkLCBidXQgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgZGlzY2FyZGVkIGFzIGEgcmV0dXJuIChvdXQpIHBhcmFtZXRlci4KCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24xKCBpbnQmIE9VVFBVVCApOwoKCSAgICAgIC8vIHR3byBhcmd1bWVudHMgcmV0dXJuZWQsIGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIG5vdCBkaXNjYXJkZWQKCSAgICAgIHZpcnR1YWwgTVN0YXR1cyBtZW1iZXJfZnVuY3Rpb24yKCBpbnQmIE9VVFBVVCApOwoJICAgICAgfTsKICAgICAgICAgICAgJX0KCgowNC8yMS8yMDA3OiBvbGx5CgkgICAgRml4IHBhcnNpbmcgb2YgZmxvYXQgY29uc3RhbnRzIHdpdGggYW4gZXhwb25lbnQgKGUuZy4gMWUtMDJmKQoJICAgIChidWcgIzE2OTk2NDYpLgoKMDQvMjAvMjAwNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBsYWNrIG9mIGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyB3aGVuIC1PIGlzIHVzZWQuCgkgICAgQWxzbywgZml4IGdlbmVyYXRpb24gb2YgZG9jc3RyaW5ncyBjb250YWluaW5nIGEgZG91YmxlIHF1b3RlCgkgICAgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gYnVnIzE3MDAxNDYuCgowNC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFN1cHBvcnQgZm9yIGFkZGluZyBpbiBKYXZhL0MjIGNvZGUgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW50ZXJtZWRpYXJ5IGNhbGwsCiAgICAgICAgICAgIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHRoZSBtYXJzaGFsbGluZyBvZiB0aGUgcHJveHkgdHlwZSB0byB0aGUgaW50ZXJtZWRpYXJ5IHR5cGUuCiAgICAgICAgICAgIFRoZSBqYXZhaW4vY3NpbiB0eXBlbWFwIG5vdyBzdXBwb3J0cyB0aGUgJ3ByZScgYW5kICdwb3N0JyBhdHRyaWJ1dGVzIHRvIGFjaGlldmUgdGhpcy4KICAgICAgICAgICAgVGhlIGphdmFpbiB0eXBlbWFwIGFsc28gc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ3BnY3BwbmFtZScgYXR0cmlidXRlIGZvciBwcmVtYXR1cmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIG5hbWluZyBhbmQgdGhlIGNzaW4gdHlwZW1hcCBzdXBwb3J0cyBhbiBvcHRpb25hbCAnY3NoaW4nCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBoZWxwZXIgZ2VuZXJhdGVkIHdoZW4gdGhlIHR5cGUgaXMgdXNlZAogICAgICAgICAgICBpbiBhIGNvbnN0cnVjdG9yLiBEZXRhaWxzIGluIHRoZSBKYXZhLmh0bWwgYW5kIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24uCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgRG9uJ3QgdHJlYXQgYHJlc3RyaWN0JyBhcyBhIHJlc2VydmVkIGlkZW50aWZpZXIgaW4gQysrIG1vZGUKCSAgICAoYnVnIzE2ODU1MzQpLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaG93IHplbmRfdGhyb3dfZXhjZXB0aW9uKCkgaXMgY2FsbGVkIChidWcgIzE3MDA3ODUpLgoKMDQvMTAvMjAwNzogb2xseQoJICAgIERlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRvIHRlbXBsYXRlIGZvciBhQ0MgKHJlcG9ydGVkIG9uCgkgICAgc3dpZy11c2VyIHRoYXQgdGhpcyBpcyBuZWVkZWQpLgoKMDQvMDQvMjAwNzogb2xseQoJICAgIFtQSFA1XSBJZiBaVFMgaXMgZW5hYmxlZCwgcmVsZWFzZSA8bW9kdWxlPl9nbG9iYWxzX2lkIGluIE1TSFVURE9XTgoJICAgIHRvIGF2b2lkIFBIUCBpbnRlcnByZXRlciBjcmFzaCBvbiBzaHV0ZG93bi4gIFRoaXMgc29sdXRpb24gd2FzCgkgICAgc3VnZ2VzdGVkIGhlcmU6IGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD00MDk4NQoKMDQvMDMvMjAwNzogb2xseQoJICAgIFtQSFA0XSBBZGQgbWlzc2luZyBaVFMgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEMrKyB3cmFwcGVyIGNvZGUKCSAgICB0byBmaXggY29tcGlsYXRpb24gZmFpbHVyZXMgd2hlbiB1c2luZyBaVFMgZW5hYmxlZCBTV0lHIChMaW51eAoJICAgIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBkaXNhYmxlIFpUUywgYnV0IG5vdGFibHkgdGhlIFdpbmRvd3MgYnVpbGQKCSAgICB1c2VzIGl0IGJ5IGRlZmF1bHQpLgoKMDQvMDEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY4NDI2MTogZml4ZXMgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50IGxpdGVyYWxzLCB0aGFua3MgTGVpZ2ggU21pdGguCiAgICAgICAgICAgIEFsc28sIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCgowMy8zMC8yMDA3OiBvbGx5CgkgICAgQXZvaWQgZ2VuZXJhdGluZyAnPDonIHRva2VuIHdoZW4gdXNpbmcgU3dpZ1ZhbHVlV3JhcHBlcjw+IG9uIGEgdHlwZQoJICAgIHdoaWNoIHN0YXJ0cyB3aXRoICc6OicgKHBhdGNoICMxNjkwOTQ4KS4KCjAzLzI1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtwZXJsNV0gQWRkIFNXSUdfZmFpbCB0byB0aGUgU1dJR19leGNlcHRpb24gbWFjcm8uICBGaXhlcyBhIGZldyBwcm9ibGVtcyByZXBvcnRlZAoJICAgIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgowMy8yMy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTdHJpbmcgY29weWluZyBwYXRjaCBmcm9tIEpvc2ggQ2hlcnJ5IHJlZHVjaW5nIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhYm91dCAyNSUuCgowMy8yMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE2MzE5ODcgZnJvbSBVbHJpayBQZXRlcnNvbiAtIGJvb2wgSU5PVVQgdHlwZW1hcHMKICAgICAgICAgICAgZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCBnaXZlbiBkb2RneSBDKysgY29kZTogbmFtZXNwYWNlIGFiYzo6ZGVmIHsgfQoKMDMvMTYvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHNvIHRoYXQgQVJSQVlTT0ZDTEFTU0VTIGFuZCBBUlJBWVNPRkVOVU1TIGluIGFycmF5c19qYXZhLmkgY2FuIGJlIGFwcGxpZWQKICAgICAgICAgICAgdG8gcG9pbnRlciB0eXBlcy4KCjAzLzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gV2hlbiB3ZSBrbm93IHRoZSBsaXRlcmFsIG51bWVyaWMgdmFsdWUgZm9yIGEgY29uc3RhbnQsIHVzZQoJICAgIHRoYXQgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3QgbWVtYmVyIGluIHRoZSBQSFAgd3JhcHBlciBjbGFzcy4KCjAzLzAyLzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IFBIUCB3cmFwcGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIGNhc2VzIG9mCgkgICAgb3ZlcmxvYWRlZCBmb3JtcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLgoKMDIvMjYvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBQYXRjaCAjMTY1NjM5NTogZml4ZWQgaGV4IGFuZCBvY3RhbCB2YWx1ZXMgYnVnLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4KCjAyLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeGVkIGJ1ZyBpbiB0eXBlbWFwcyB3aGljaCBjYXVzZWQgZGVyaXZlZF9ieXZhbHVlIGFuZCBybmFtZSB0ZXN0IGNhc2VzIHRvIGZhaWwuCgkgICAgVXBkYXRlZCBkZXJpdmVkX2J5dmFsdWUuaSB0byBleHBsYWluIGhvdyB0byBmaW5kIGFuZCBmaXggdGhlIHByb2JsZW0KCjAxLzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUzODUyMiBhbmQgIzEzMzg1MjcsIGZvcndhcmQgdGVtcGxhdGVkIGNsYXNzIGRlY2xhcmF0aW9ucyB3aXRob3V0IGEKICAgICAgICAgICAgbmFtZSBmb3IgdGhlIHRlbXBsYXRlZCBjbGFzcyBwYXJhbWV0ZXJzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIGNsYXNzPiBjbGFzcyBYOwoKMDEvMjMvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzE2NDA4NjI6IDxtYWxsb2MuaD4gcmVwbGFjZWQgYnkgPHN0ZGxpYi5oPgoJICAgIFBhdGNoICMxNTk4MDYzIFR5cG8gaW4gdHlwZW1hcHMuaQoKMDEvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBsdWEgc3BlY2lmaWMgY2FycmF5cy5pIHdoaWNoIGFkZHMgdGhlIG9wZXJhdG9yW10gc3VwcG9ydC4KCSAgICBtb2RpZmllZCB0aGUgbWFpbiBjb2RlIHRvIG1ha2UgaXQgbm90IGVtaXQgYWxsIHRoZSBjbGFzcyBtZW1iZXIgZnVuY3Rpb25zICYgYWNjZXNzb3JzCgkgICAgTm90ZTogQyBzdHJ1Y3RzIGFyZSBjcmVhdGVkIHVzaW5nIG5ld19YWFgoKSB3aGlsZSBDKysgY2xhc3NlcyB1c2UgWFhYKCkgKHNob3VsZCBiZSBzdGFuZGFyZGlzZWQpCgkgICAgVXBkYXRlZCB0ZXN0IGNhc2U6IGxpX2NhcnJheXMKCSAgICBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uLgoKMDEvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkIHN1cHBvcnQgZm9yIG5ld2ZyZWUgdHlwZW1hcHMgKHNvbWV0aW1lcyB1c2VkIGJ5ICVuZXdvYmplY3QpCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1tYWNyb2Vycm9ycy4gICBXaGVuIHN1cHBsaWVkLCB0aGlzIHdpbGwgZm9yY2UKICAgICAgICAgICAgdGhlIEMgc2Nhbm5lci9wYXJzZXIgdG8gcmVwb3J0IHByb3BlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgY29kZSBjb250YWluZWQKICAgICAgICAgICAgaW5zaWRlIFNXSUcgbWFjcm9zIChkZWZpbmVkIHdpdGggJWRlZmluZSkuICBCeSBkZWZhdWx0LCBTV0lHIG1lcmVseSByZXBvcnRzCiAgICAgICAgICAgIGVycm9ycyBvbiB0aGUgbGluZSBhdCB3aGljaCBhIG1hY3JvIGlzIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCB5b3UKICAgICAgICAgICAgY2FuIGV4cGFuZCB0aGUgZXJyb3IgYmFjayB0byBpdHMgc291cmNlLS0tc29tZXRoaW5nIHdoaWNoIG1heSBzaW1wbGlmeQogICAgICAgICAgICBkZWJ1Z2dpbmcuCgowMS8xMi8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdIE1ham9yIG92ZXJoYXVsIG9mIEMvQysrIHNjYW5uaW5nIGltcGxlbWVudGF0aW9uLiAgRm9yIHF1aXRlCiAgICAgICAgICAgIHNvbWUgdGltZSwgU1dJRyBjb250YWluZWQgdHdvIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgQy9DKysgdG9rZW5pemVycy0tCiAgICAgICAgICAgIHRoZSBsZWdhY3kgc2Nhbm5lciBpbiBDUGFyc2UvY3NjYW5uZXIuYyBhbmQgYSBnZW5lcmFsIHB1cnBvc2Ugc2Nhbm5lcgogICAgICAgICAgICBpbiBTd2lnL3NjYW5uZXIuYy4gU1dJRyBzdGlsbCBoYXMgdHdvIHNjYW5uaW5nIG1vZHVsZXMsIGJ1dCB0aGUgQyBwYXJzZXIKICAgICAgICAgICAgc2Nhbm5lciAoQ1BhcnNlL2NzY2FubmVyLmMpIG5vdyByZWxpZXMgdXBvbiB0aGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgICAgICAgIHNjYW5uZXIgZm91bmQgaW4gU3dpZy9zY2FubmVyLmMuICBBcyBhIHJlc3VsdCwgaXQgaXMgbXVjaCBzbWFsbGVyIGFuZAogICAgICAgICAgICBsZXNzIGNvbXBsaWNhdGVkLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWludGFpbiBhbGwKICAgICAgICAgICAgb2YgdGhlIGxvdy1sZXZlbCBDIHRva2VuaXppbmcgaW4gb25lIGNlbnRyYWwgbG9jYXRpb24gaW5zdGVhZCBvZiB0d28KICAgICAgICAgICAgcGxhY2VzIGFzIGJlZm9yZS4KCiAgICAgICAgICAgICoqKlBPVEVOVElBTCBGTEFLSU5FU1MqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggYWNjdXJhdGUgbGluZSBudW1iZXIgcmVwb3J0aW5nCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZXJyb3IgcmVwb3J0aW5nIG1vcmUgZ2VuZXJhbGx5LiBJIGhhdmUgdHJpZWQgdG8gcmVzb2x2ZSB0aGlzCiAgICAgICAgICAgIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIGNvcm5lciBjYXNlcy4KCjAxLzEyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIHR5cGVtYXAgdGhyb3dzIGZvciBzdGQ6OnN0cmluZyosIHR5cGVtYXAgZm9yIFNXSUdUWVBFIERZTkFNSUMsCgkgICAgY2hhbmdlZCB0aGUgZXhpc3RpbmcgdGhyb3dzIHR5cGVtYXAgdG8gdGhyb3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IG9mCgkgICAgdGhlIG9iamVjdCAodXBkYXRpbmcgYSBmZXcgdGVzdCBjYXNlcyB0byBkZWFsIHdpdGggdGhlIGNoYW5nZSkuCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBkeW5hbWljX2Nhc3RzLCBleGNlcHRpb25fcGFydGlhbF9pbmZvLCBsaV9zdGRfc3RyaW5nLCBzaXplX3QKCjAxLzAzLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10uICBVc2Ugb2Ygc3dpZ2tleXMuYy8uaCB2YXJpYWJsZXMgaXMgcmV2b2tlZC4gIFBsZWFzZSB1c2UKICAgICAgICAgICAgc2ltcGxlIHN0cmluZ3MgZm9yIGF0dHJpYnV0ZSBuYW1lcy4KCjEyLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgQVBJIGZ1bmN0aW9ucyBIYXNoR2V0QXR0cigpIGFuZCBIYXNoQ2hlY2tBdHRyKCkgaGF2ZSBiZWVuIHJldm9rZWQuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgR2V0YXR0cigpIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMuICBUaGUgZnVuY3Rpb24gQ2hlY2thdHRyKCkgY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gY2hlY2sgYXR0cmlidXRlcy4gIE5vdGU6ICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJldm9rZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGV5IG9ubHkgYWRkZWQgYSBtYXJnaW5hbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhdCB0aGUgZXhwZW5zZQogICAgICAgICAgICBjb2RlIGNsYXJpdHkuCgoxMi8yNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtb3JlIFNUTCAobW9yZSBleGNlcHRpb25zLCBtYXAsIHNpemVfdCksCgkgICAgZml4ZWQgdGVzdCBjYXNlOiBjb252ZXJzaW9uX25zX3RlbXBsYXRlLgoKMTIvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlIHRvIHRocm93IGVycm9ycyB3aGVuIHNldHRpbmcgaW1tdXRhYmxlcywKCSAgICBhbmQgYWxsb3dpbmcgdXNlciBhZGRpdGlvbiBvZiBtb2R1bGUgdmFyaWFibGVzLgoKMTIvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVkZWYnZCB2YXJpYWJsZSB3cmFwcGVycyB0aGF0IHVzZSAlbmF0dXJhbHZhciwgZWcsIHN0ZDo6c3RyaW5nLgoKMTIvMTQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90IHR5cGVtYXBzCgoxMi8xNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IGJ1ZyAjMTYxMzY3MyAoYmFkIFBIUDUgY29kZSBnZW5lcmF0ZWQgZm9yIGdldHRlcnMgYW5kCgkgICAgc2V0dGVycykuCgoxMi8wMi8yMDA2OiB3c2Z1bHRvbiwgSm9obiBMZW56LCBEYXZlIEJlYXpsZXkKICAgICAgICAgICAgTW92ZSBmcm9tIGN2cyB0byBTdWJ2ZXJzaW9uIGZvciBzb3VyY2UgY29udHJvbAoKMTEvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBDbGVhbmVkIHVwIHN3aWd3YXJuaW5ncy5zd2cgZmlsZSBub3QgdG8gdXNlIG5lc3RlZCBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9ucy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGZvciAlZXh0ZW5kIHRvIHdvcmsgZm9yIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzLgoKVmVyc2lvbiAxLjMuMzEgKE5vdmVtYmVyIDIwLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiBMdWlnaSBCYWxsYWJpbwogICAgICAgICAgICBbUHl0aG9uXSBBbHRlcm5hdGUgZml4IGZvciBQeXRob24gZXhjZXB0aW9ucyBidWcgIzE1NzgzNDYgKHRoZSBwcmV2aW91cyBvbmUgYnJva2UgUHl0aG9uCiAgICAgICAgICAgIHByb3BlcnRpZXMgaW4gbW9kZXJuIGNsYXNzZXMpCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICAtZmFrZXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIG5vdyBnZW5lcmF0ZXMgdGhlIGZha2UgdmVyc2lvbiBpbnRvIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIGl0IHdoZW4gdGhlIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyB1c2VkLgoKMTQvMTEvMjAwNjogbWdvc3NhZ2UKCSAgICBbbHVhXSB1cGRhdGUgdG8gdHlwZW1hcCBmb3Igb2JqZWN0IGJ5IHZhbHVlLCB0byBtYWtlIGl0IGM4OSBjb21wbGlhbnQKClZlcnNpb24gMS4zLjMwIChOb3ZlbWJlciAxMywgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW2phdmFdIFJlbW92ZSBEZXRhY2hDdXJyZW50VGhyZWFkIHBhdGNoIGZyb20gIDA4LzExLzIwMDYgLSBpdCBjYXVzZXMgc2VnZmF1bHRzCiAgICAgICAgICAgIG9uIHNvbWUgc3lzdGVtcy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtweXRob25dIEZpeCAjMTU3ODM0NiAtIFB5dGhvbiBleGNlcHRpb25zIHdpdGggLW1vZGVybgoKMTEvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTkzMjkxIC0gU21hcnQgcG9pbnRlcnMgYW5kIGluaGVyaXRpbmcgZnJvbSB0ZW1wbGF0ZXMgCgoxMS8wOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3Igb3BlcmF0b3IgcG9pbnRlci9yZWZlcmVuY2UgY2FzdHMgLSAjMTU5MjE3My4KCjExLzA3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkc2VsZiBzcGVjaWFsIHZhcmlhYmxlIGZvciAlZXh0ZW5kIG1ldGhvZHMuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgJ3NlbGYnCiAgICAgICAgICAgIGFzIHRoZSBDKysgJ3RoaXMnIHBvaW50ZXIuCgoxMS8wNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdIAoJICAgIGFsbGVncm9jbC5zd2c6IHN3aWctZGVmdmFyIHVwZGF0ZWQgdG8gYWxsb3cgc3BlY2lmeWluZyBvZgoJICAgIAkJICAgbm9uLWRlZmF1bHQgZm9yZWlnbiB0eXBlICh2aWEgOmZ0eXBlIGtleXdvcmQgYXJnKS4KCSAgICBhbGxlZ3JvY2wuY3h4OiBTcGVjaWZ5IHByb3BlciBhY2Nlc3MgdHlwZSBmb3IgZW51bSB2YWx1ZXMuCgoxMS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YS9DI10gRml4IGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm4gdHlwZXMgZm9yIGRpcmVjdG9ycyBhcyByZXBvcnRlZCBieQogICAgICAgICAgICBNYXJrIERvbnNlbHptYW5uCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIERlbGV0ZUxvY2FsUmVmIGZyb20gZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgZm9yIG5vdyBhcyBpdCBpcyBjYXVzaW5nIGEKICAgICAgICAgICAgc2VnIGZhdWx0IHdoZW4gcnVuIG9uIFNvbGFyaXMgOC4KCjEwLzI5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gUGF0Y2ggZnJvbSBDaHJpcyBTaG9lbWFrZXIgdG8gY2xlYW4gdXAgc29tZSB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSW1wb3J0YW50IGZpeCB0byBwcmV2ZW50IGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGluIGEgbmF0aXZlIG1ldGhvZC4gVGhlIGZpbmFsaXplciBjb3VsZCBkZXN0cm95IHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIEMrKyBvYmplY3Qgd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQuIFRoZSBwcm9ibGVtIG9jY3VycyB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBubwogICAgICAgICAgICBsb25nZXIgc3Ryb25nbHkgcmVhY2hhYmxlIGFmdGVyIGEgbmF0aXZlIGNhbGwuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBvY2N1ciBpbgogICAgICAgICAgICBtZW1vcnkgc3RyZXNzIHNpdHVhdGlvbnMgb24gc29tZSBKVk1zLiBJdCBkb2VzIG5vdCBzZWVtIHRvIG9jY3VyIG9uIHRoZQogICAgICAgICAgICBTdW4gY2xpZW50IEpWTSB1cCB0byBqZGsgMS41LiBIb3dldmVyIHRoZSAxLjYgY2xpZW50IGpkayBoYXMgYSBtb3JlIGFnZ3Jlc3NpdmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0b3IgYW5kIHNvIHRoZSBwcm9ibGVtIGRvZXMgb2NjdXIuIEl0IGRvZXMgb2NjdXIgb24gdGhlIFN1biBzZXJ2ZXIKICAgICAgICAgICAgSlZNcyAoY2VydGFpbmx5IDEuNCBvbndhcmRzKS4gVGhlIGZpeCBlbnRhaWxzIHBhc3NpbmcgdGhlIHByb3h5IGNsYXNzIGludG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gYWRkaXRpb24gdG8gdGhlIEMrKyBwb2ludGVyIGluIHRoZSBsb25nIHBhcmFtZXRlciwgYXMgSmF2YSBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29sbGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGludG8gSk5JIG1ldGhvZHMuIFRoZSBleHRyYSBwYXJhbWV0ZXIgY2FuIGJlIHN1cHByZXNzZWQKICAgICAgICAgICAgYnkgc2V0dGluZyB0aGUgbm9wZ2NwcCBhdHRyaWJ1dGUgaW4gdGhlIGp0eXBlIHR5cGVtYXAgdG8gIjEiIG9yIHVzaW5nIHRoZSBuZXcgLW5vcGdjcHAKICAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgU2VlIEphdmEuaHRtbCNqYXZhX3BnY3BwIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KCjEwLzI0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMuIFRoZSB2aXJ0dWFsL292ZXJyaWRlL25ldyBrZXl3b3JkIGlzIG5vdCBnZW5lcmF0ZWQKICAgICAgICAgICAgZm9yIGVhY2ggbWV0aG9kIGFzIHRoZSBzbWFydCBwb2ludGVyIGNsYXNzIGRvZXMgbm90IG1pcnJvciB0aGUgdW5kZXJseWluZyBwb2ludGVyCiAgICAgICAgICAgIGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU0YgIzE0OTY1MzUKCjEwLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIG5hdGl2ZSBtZXRob2RzICYgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgogICAgICAgICAgICBmaXhlZCB0ZXN0IGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzICYgY3BwX2Jhc2ljLiBBZGRlZCBuZXcgZXhhbXBsZSAoZnVuY3RvcikuCiAgICAgICAgICAgIHRpZGllZCB1cCBhIGxpdHRsZSBvZiB0aGUgY29kZSAoYXJvdW5kIGNsYXNzSGFuZGxlcikuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIGRpcmVjdG9yb3V0IHR5cGVtYXAgY2hhbmdlcyB0byBmYWxsIGluIGxpbmUgd2l0aCB0aGUgb3RoZXIgZGlyZWN0b3IKICAgICAgICAgICAgbGFuZ3VhZ2VzLiAkcmVzdWx0IGlzIG5vdyB1c2VkIHdoZXJlICQxIHVzZWQgdG8gYmUgdXNlZC4gUGxlYXNlIGNoYW5nZSB5b3VyIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIHlvdSBoYXZlIGEgY3VzdG9tIGRpcmVjdG9yb3V0IHR5cGVtYXAuCgoxMC8xOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTb21lIGZpeGVzIGZvciBhcHBseWluZyB0aGUgY2hhciBhcnJheSB0eXBlbWFwcyB0byB1bnNpZ25lZCBjaGFyIGFycmF5cy4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIGluIGNvbnN0IHNpemVfdCYgYW5kIGNvbnN0IHN0ZDo6c2l6ZV90JiB0eXBlbWFwcy4KCjEwLzE1LzIwMDY6IGVmdXp6eW9uZSAKICAgICAgICAgICAgW0NGRkldIFN1cHByZXNzIGdlbmVyYXRpbmcgZGVmY3R5cGUgZm9yIGVudW1zLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4gUGF0Y2ggMTU2MDk4My4gCgoxMC8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIE1pbm9yIGZpeCB0byBtYWtlIFNXSUcgd29yayB3aXRoIHRoZSAoYXMgeWV0IHVucmVsZWFzZWQpIGNoaWNrZW4gMi41CgogICAgICAgICAgICBbR3VpbGUsQ2hpY2tlbl0gRml4IFNGIEJ1ZyAxNTczODkyLiAgQWRkZWQgYW4gZXh0X3Rlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gdGVzdAogICAgICAgICAgICB0aGlzIGJ1ZywgYnV0IHRoaXMgdGVzdCBjYW4gbm90IHJlYWxseSBiZSBtYWRlIGdlbmVyaWMgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgY29kZSBtdXN0CiAgICAgICAgICAgIHBsdWcgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGludGVycHJldGVyIGRpcmVjdGx5LgogICAgICAgICAgICBTZWUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9jaGlja2VuL2V4dF90ZXN0LmkgYW5kIGV4dF90ZXN0X2V4dGVybmFsLmN4eAoKICAgICAgICAgICAgQWRkZWQgYSAlLmV4dGVybmFsdGVzdCB0byBjb21tb24ubWssIGFuZCBhbnkgaW50ZXJlc3RlZCBsYW5ndWFnZSBtb2R1bGVzIGNhbgogICAgICAgICAgICBjb3B5IGFuZCBzbGlnaHRseSBtb2RpZnkgZWl0aGVyIHRoZSBjaGlja2VuIG9yIHRoZSBndWlsZSBleHRfdGVzdC5pCgoxMC8xNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBhZGRlZCBPVVRQVVQmIGZvciBhbGwgbnVtYmVyIHR5cGVzLCBhZGRlZCBhIGxvbmcgbG9uZyB0eXBlCiAgICAgICAgICAgIGZpeGVkIHNldmVyYWwgdGVzdCBjYXNlcy4KICAgICAgICAgICAgdXBkYXRlOiBjaGFuZ2VkIHR5cGVtYXBzIHRvIHVzZSBTV0lHX0NvbnZlcnRQdHIgcmF0aGVyIHRoYW4gU1dJR19NdXN0R2V0UG9pbnRlcgogICAgICAgICAgICBzdGFydGVkIHNwbGl0aW5nIGx1YS5zd2cgaW50byBzbWFsbGVyIHBhcnRzIHRvIG1ha2UgaXQgbmVhdGVyCgoxMC8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIE1hcmdpbmFsbHkgYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIG9ubHkgaW4gdGhhdCB5b3UgY2FuCiAgICAgICAgICAgIGNvbnRyb2wgd2hhdCB0aGUgYmFzZSBjbGFzcyBpcy4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBuZXcgJ3JlcGxhY2UnIGF0dHJpYnV0ZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwLCBlZyBpbiB0aGUgZm9sbG93aW5nLCAnTWUnIHdpbGwgYmUgdGhlIGJhc2UgY2xhc3MsCiAgICAgICAgICAgIG5vIG1hdHRlciB3aGF0IEZvbyBpcyByZWFsbHkgZGVyaXZlZCBmcm9tIGluIHRoZSBDKysgbGF5ZXIuCgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSIKICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIgoKICAgICAgICAgICAgUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIGZvciB0aGUgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXBzIHRvIG92ZXJyaWRlIHRoZSBDKysgYmFzZS4KCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgZGVsZXRlKCkgbWV0aG9kIAogICAgICAgICAgICAoaXQgaXMgbm93IGEgc3luY2hyb25pemVkIG1ldGhvZCwgYnV0IGlzIG5vdyBjdXN0b21pc2FibGUgYnkgY2hhbmdpbmcgdGhlIAogICAgICAgICAgICBtZXRob2Rtb2RpZmllcnMgYXR0cmlidXRlIGluIHRoZSBqYXZhZGVzdHJ1Y3Qgb3IgamF2YWRlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcCkKCiAgICAgICAgICAgIFtDI10gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIERpc3Bvc2UoKSBtZXRob2QsIAogICAgICAgICAgICBzaW1pbGFyIHRvIEphdmEncyBkZWxldGUoKSBhYm92ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gUmVtb3ZlIHJlZHVuZGFudCBkaXJlY3RvciBjb2RlIGluICVleHRlbmQgbWV0aG9kcyAoJWV4dGVuZAogICAgICAgICAgICBtZXRob2RzIGNhbm5vdCBiZSBkaXJlY3RvciBtZXRob2RzKQoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gRml4ICMxNTA1NTk0IC0gZGlyZWN0b3Igb2JqZWN0cyBub3QgcmV0dXJuZWQgYXMgZGlyZWN0b3Igb2JqZWN0cwogICAgICAgICAgICBpbiAlZXh0ZW5kIG1ldGhvZHMuCgoxMC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMxMjM4Nzk4IC0gRGlyZWN0b3JzIHVzaW5nIHVuc2lnbmVkIGxvbmcgbG9uZyBvciBhbnkgb3RoZXIgdHlwZQogICAgICAgICAgICBtYXJzaGFsbGVkIGFjcm9zcyB0aGUgSk5JIGJvdW5kYXJ5IHVzaW5nIGEgSmF2YSBjbGFzcyAod2hlcmUgdGhlIGpuaSB0eXBlbWFwIAogICAgICAgICAgICBjb250YWlucyBqb2JqZWN0KS4KCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTE2MjE5NCAtICNpbmNsdWRlLyVpbmNsdWRlIHdpdGhpbiBhIHN0cnVjdHVyZQoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDUwNjYxLCBzdHJpbmcgdHJ1bmNhdGlvbiBpbiBTdHJpbmdfc2VlayB0cnVuY2F0aW5nIEphdmEvQyMgZW51bXMuCgoxMC8wNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXggIzE1Njk1ODcuIFRoZSBuYW1lIGlzIG5vdyBjb3JyZWN0LgoKMTAvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3IgZml4ZXMgZm9yIHZpcnR1YWwgY29udmVyc2lvbiBvcGVyYXRvcnMKCjEwLzA0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggIzE1Njk1ODcgZm9yIFBIUC4gIERvbid0IHVzZSBzaXplb2YoKSBleGNlcHQgd2l0aCBzdHJpbmcKCSAgICBsaXRlcmFscy4gIENoYW5nZSBzb21lICIvLyIgY29tbWVudHMgdG8gIi8qICovIiBmb3IgcG9ydGFiaWxpdHkuCgoxMC8wNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXJ0aWFsIEZpeCAjMTU2OTU4Ny4gVGhlIHR5cGUgaXMgbm93IGNvcnJlY3QsIGJ1dCB0aGUgbmFtZSBpcyBzdGlsbCBub3QgY29ycmVjdC4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzE1Mjc4ODUgLSBPdmVybG9hZGVkIGRpcmVjdG9yIHZpcnR1YWwgbWV0aG9kcyBzb21ldGltZXMgcHJvZHVjZWQKICAgICAgICAgICAgdW5jb21waWxhYmxlIGNvZGUgd2hlbiB1c2VkIHdpdGggdGhlIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlLgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3JzOiBEaXJlY3RvcnMgYXJlIG91dHB1dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgcmF0aGVyIHRoYW4gaW4gc29tZSBwc2V1ZG8tcmFuZG9tIG9yZGVyLgoKMTAvMDMvMjAwNjogbW1hdHVzCiAgICAgICAgICAgIEZpeCAjMTQ4NjI4MSBhbmQgIzE0NzEwMzkuCgoxMC8wMy8yMDA2OiBvbGx5CgkgICAgW1BlcmxdIEZpeCBmb3IgaGFuZGxpbmcgc3RyaW5ncyB3aXRoIHplcm8gYnl0ZXMgZnJvbSBTdGVwaGVuIEh1dHNhbC4KCjA5LzMwLzIwMDY6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gQml0ZmllbGQgc3VwcG9ydCBhbmQgdmFyYXJnIHN1cHBvcnQgZHVlIHRvIEFydGh1ciBTbXlsZXMuCiAgICAgICAgICAgIEMgZXhwcmVzc2lvbiB0byBMaXNwIGNvbnZlcnNpb24sIHRoYW5rcyB0byBBcnRodXIgU215bGVzIGZvciB0aGUgaW5pdGlhbAogICAgICAgICAgICBpZGVhLCBpdCBub3cgc3VwcG9ydHMgY29udmVyc2lvbiBmb3IgYSB3aG9sZSByYW5nZSBvZiBDIGV4cHJlc3Npb25zLiAKCjA5LzI4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUwODMyNyAtIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgaGlkZGVuIHdoZW4gdXNpbmcgLWZ2aXJ0dWFsIG9wdGltaXNhdGlvbi4KICAgICAgICAgICAgT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgY2FuZGlkYXRlcyBmb3IgZWxpbWluYXRpb24gLSB0aGlzIG1pbWljcwogICAgICAgICAgICBDKysgYmVoYXZpb3VyIHdoZXJlIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZAogICAgICAgICAgICBpbiBhIGRlcml2ZWQgY2xhc3MgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUgYXZhaWxhYmxlLgoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbiwgT2NhbWxdIEZpeCAjMTUwNTU5MSBUaHJvd2luZyBleGNlcHRpb25zIGluIGV4dGVuZGVkIGRpcmVjdG9ycwoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDU2MTAwIC0gdmlydHVhbCBvcGVyYXRvcnMuIAoKMDkvMjQvMjAwNjogb2xseQoJICAgIERvbid0IGFjY2lkZW50YWxseSBjcmVhdGUgYSAiPDoiIHRva2VuICh3aGljaCBpcyB0aGUgc2FtZSBhcyAiWyIgaW4gQysrKS4KCSAgICBGaXhlcyBidWcgIyAxNTIxNzg4LgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFtSdWJ5XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIHRoZSBSdWJ5IDEuOQoJICAgIGRldmVsb3BtZW50IGJyYW5jaC4gIEZpeGVzIGJ1ZyAjMTU2MDA5Mi4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBUZW1wbGF0ZXMgY2FuIG5vdyBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycyBhbmQKCSAgICBjb25zdGFudCBleHByZXNzaW9ucywgZS5nLjoKCgkgICAgdGVtcGxhdGU8aW50IHE+IGNsYXNzIHgge307CgkgICAgJXRlbXBsYXRlKHhfbWludXMxKSB4PC0xPjsKCSAgICAldGVtcGxhdGUoeF8xcGx1czIpIHg8MSsyPjsKCgkgICAgQWxzbywgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2FuIG5vdyBpbmNsdWRlIGNvbXBhcmlzb25zICg+LCA8LCA+PSwKCSAgICA8PSwgIT0sID09KSwgbW9kdWx1cyAoJSksIGFuZCB0ZXJuYXJ5IGNvbmRpdGlvbmFscyAoYSA/IGIgOiBjKS4KCgkgICAgRml4ZXMgYnVncyAjNjQ2Mjc1LCAjOTI1NTU1LCAjOTU2MjgyLCAjOTk0MzAxLgoKMDkvMjIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgbWV0aG9kcyAtIEJ1Z3MgIzE1NDYyNTQsICMxNTQzNTMzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHRzIGFuZCBhc3NlcnRzIHdoZW4gZGlyZWN0b3IgbWV0aG9kcyBhcmUgaWdub3JlZCAoIzE1NDM1MzMpCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3V0IG9mIHNvdXJjZSBidWlsZHMgLSBidWcgIzE1NDQ3MTgKCjA5LzIwLzIwMDY6IG9sbHkKCSAgICBUcmVhdCBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiByYXRoZXIKCSAgICB0aGFuIGlnbm9yaW5nIGl0IGNvbXBsZXRlbHksIHNvIHRoYXQgd2UgZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvcgoJICAgIHBhc3Npbmcgb3BhcXVlIHBvaW50ZXJzIHRvIHRoZSBuZXN0ZWQgY2xhc3MgKGZpeGVzIFNGIGJ1ZyAjOTA5Mzg3KS4KCjA5LzIwLzIwMDY6IG9sbHkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgW3BocF0gT3ZlcmxvYWQgcmVzb2x1dGlvbiBub3cgd29ya3MuICBIb3dldmVyIHRvIGFsbG93IHRoaXMsIFNXSUcKCSAgICBnZW5lcmF0ZWQgd3JhcHBlcnMgbm8gbG9uZ2VyIGNvZXJjZSBQSFAgdHlwZXMgKHdoaWNoIHJldmVydHMgYSBjaGFuZ2UKCSAgICBtYWRlIGluIDEuMy4yNikuICBTbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXRob2QgdGFrZXMgYSBzdHJpbmcsIHlvdQoJICAgIGNhbiBubyBsb25nZXIgcGFzcyBhIG51bWJlciB3aXRob3V0IGV4cGxpY2l0bHkgY29udmVydGluZyBpdCB0byBhCgkgICAgc3RyaW5nIGluIFBIUCB1c2luZzogKHN0cmluZyl4CgowOS8xOC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSBmaXggb24gc3dpZ2luaXQuc3dnLCBoYXMgYmVlbiByZXBvcnRlZCB0byBjcmFzaCBvbiBzZXZlcmFsIHRlc3QgY2FzZXMKCSAgICBmb3VuZCBhbmQgZml4ZWQgcHJvYmxlbSBpbiBpbXBvcnRzIHVuZGVyIHB5dGhvbiAobWluZ3cpCgowOS8xNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCBmcm9tIE1pY2hhbCBNYXJlayBmb3IgUHl0aG9uIDIuNSB0byBmaXggNjQgYml0IGFycmF5IGluZGV4ZXMgb24KICAgICAgICAgICAgNjQgYml0IG1hY2hpbmVzLgoKMDkvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGhhcyBiZWVuIHNjcmFwcGVkLiBUaGlzIGZlYXR1cmUgd2FzIGludHJvZHVjZWQgcHJpbWFyaWx5CiAgICAgICAgICAgIHRvIHNvbHZlIHJlY3Vyc2l2ZSBkaXJlY3RvciBtZXRob2QgY2FsbHMuIERpcmVjdG9yIHVwY2FsbCBpbXByb3ZlbWVudHMgbWFkZSBpbnN0ZWFkOgoKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIFRoZSBzd2lnX3VwIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIFRoZSByZXF1aXJlZCBtdXRleGVzCiAgICAgICAgICAgIHdyYXBwaW5nIHRoaXMgZmxhZyBhcmUgYWxzbyBubyBsb25nZXIgbmVlZGVkLiBUaGUgcmVjdXJzaXZlIGNhbGxzIGdvaW5nIGZyb20gQysrCiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGJhY2sgYWdhaW4gZXRjIGFyZSBub3cgYXZvaWRlZCBieSBhIHN1YnRsZWx5IGRpZmZlcmVudAogICAgICAgICAgICBhcHByb2FjaC4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3dpZ191cCBmbGFnIGluIGVhY2ggZGlyZWN0b3IgbWV0aG9kIHRvIGluZGljYXRlCiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGV4cGxpY2l0IEMrKyBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIG1ldGhvZCBvciBhIG5vcm1hbAogICAgICAgICAgICBwb2x5bW9ycGhpYyBDKysgY2FsbCBzaG91bGQgYmUgbWFkZSwgdGhlIG5ldyBhcHByb2FjaCBtYWtlcyBvbmUgb2YgdGhlc2UgY2FsbHMKICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgd3JhcHBlciBtZXRob2QuCgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSByZWN1cnNpdmUgY2FsbCBwcm9ibGVtIHdoZW4gY2FsbGluZyBhIEMrKyBiYXNlIGNsYXNzIG1ldGhvZCBmcm9tCiAgICAgICAgICAgIEphdmEvQyMgaXMgbm93IGZpeGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgYXMgdGhlIGRldGVjdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBleHBsaWNpdCBjYWxsIG9yIGEgbm9ybWFsIHBvbHltb3JwaGljIGNhbGwgaXMgbWFkZQogICAgICAgICAgICBpbiB0aGUgSmF2YS9DIyBsYXllciByYXRoZXIgdGhhbiBpbiB0aGUgQysrIGxheWVyLgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gdXBkYXRlZCBzd2lnaW5pdC5zd2cgdG8gYWxsb3cgbXVsdGlwbGUgaW50ZXJwcmV0ZXJzIHRvIHVzZSBtdWx0aXBsZQoJICAgIHN3aWcgbW9kdWxlcyBhdCBvbmNlLiBUaGlzIGhhcyBiZWVuIHRlc3RlZCBpbiBMdWEgKG1pbmd3ICYgbGludXgpLAoJICAgIHBlcmw1ICYgcHl0aG9uIChsaW51eCkgb25seS4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXMgd2VsbCBhcyBuYXRpdmUgbHVhIG9iamVjdAogICAgICAgICAgICBpbnRvIHdyYXBwZXJlZCBmdW5jdGlvbi4KICAgICAgICAgICAgQWRkZWQgZXhhbXBsZSBmdW5jcHRyMyB0byBkZW1vbnN0cmF0ZSB0aGlzIGZlYXR1cmUKCjA5LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW5hbWUgRXJyb3JDb2RlIGFuZCBFcnJvck1zZyAjZGVmaW5lLXMgdG8gU1dJR19FcnJvckNvZGUKCSAgICBhbmQgU1dJR19FcnJvck1zZyB0byBhdm9pZCBjbGFzaGVzIHdpdGggY29kZSB0aGUgdXNlciBtaWdodCBiZQoJICAgIHdyYXBwaW5nIChwYXRjaCBmcm9tIERhcnJlbiBXYXJuZXIgaW4gU0YgYnVnICMxNDY2MDg2KS4gIEFueQoJICAgIHVzZXIgdHlwZW1hcHMgd2hpY2ggdXNlIEVycm9yQ29kZSBhbmQvb3IgRXJyb3JNc2cgZGlyZWN0bHkgd2lsbAoJICAgIG5lZWQgYWRqdXN0aW5nIC0geW91IGNhbiBlYXNpbHkgZml4IHRoZW0gdG8gd29yayB3aXRoIGJvdGggb2xkCgkgICAgYW5kIG5ldyBTV0lHIGJ5IGNoYW5naW5nIHRvIHVzZSBTV0lHX0Vycm9yTXNnIGFuZCBhZGRpbmc6CgoJCSNpZm5kZWYgU1dJR19FcnJvck1zZwoJCSNkZWZpbmUgU1dJR19FcnJvck1zZygpIEVycm9yTXNnKCkKCQkjZW5kaWYKCjA4LzI5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBNb3ZlIGNvbnN0YW50IGluaXRpYWxpc2F0aW9uIGZyb20gUklOSVQgdG8gTUlOSVQgdG8gZml4IGEKCSAgICB3YXJuaW5nIHdoZW4gdXNpbmcgQXBhY2hlIGFuZCBtb2RfcGhwLiAgV2Ugb25seSBuZWVkIHRvIGNyZWF0ZQoJICAgIFBIUCBjb25zdGFudHMgb25jZSB3aGVuIHdlJ3JlIGZpcnN0IGluaXRpYWxpc2VkLCBub3QgZm9yIGV2ZXJ5IEhUVFAKCSAgICByZXF1ZXN0LgoKMDgvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1NDI0NjYgYWRkZWQgY29kZSB0byBhbGxvdyBtYXBwaW5nIEx1YSBuaWwncyA8LT4gQy9DKysgTlVMTCdzCgkgICAgdXBkYXRlZCB2YXJpb3VzIHR5cGVtYXBzIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIGNoYW5nZXMKCSAgICBhZGRlZCB2b2lkdGVzdF9ydW5tZS5sdWEgdG8gc2hvdyB0aGUgZmVhdHVyZXMgd29ya2luZwoKMDgvMTkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBBZGQgZmVhdHVyZTpjb25zdGFzdmFyIHRvIGV4cG9ydCBjb25zdGFudHMgYXMgdmFyaWFibGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZS4KCjA4LzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEZXRhY2hDdXJyZW50VGhyZWFkIGNhbGxzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IG5hdGl2ZWx5IGNyZWF0ZWQgdGhyZWFkcwogICAgICAgICAgICBubyBsb25nZXIgcHJldmVudCB0aGUgSlZNIGZyb20gZXhpdGluZy4gQnVnIHJlcG9ydGVkIGJ5IFRob21hcyBEdWR6aWFrIGFuZAogICAgICAgICAgICBQYXVsIE5vbGwuCgowOC8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBzbyB0aGV5IHdvcmsKCjA3LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtb3JlIGFkZGl0aW9ucyB0byBzdGQ6OnN0cmluZywgc29tZSB0d2Vha3MgYW5kIHNtYWxsIGJ1ZyBmaXhlcwoJICAgIC1ub2N3cmFwIG1vZGUuCgowNy8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTUyNjAyMiBwZGF0ZWQgc3RkOjpzdHJpbmcgdG8gc3VwcG9ydCBzdHJpbmdzIHdpdGggJ1wwJyBpbnNpZGUgdGhlbQoJICAgIHVwZGF0ZWQgdHlwZW1hcHMuaSB0byBhZGQgc3VwcG9ydCBmb3IgcG9pbnRlciB0byBwb2ludGVycwoKMDcvMTkvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gQWRkIHN0ZF9zdHJpbmcuaSBzdXBwb3J0LgoJICAgIC0gQWRkIG5ld29iamVjdCBwYXRjaCBzdWJtaXR0ZWQgYnkgbWtvZXBwZSAodGhhbmtzISkKCSAgICAtIEZpeCB0eXBlIG5hbWUgbWlzbWF0Y2ggaXNzdWUgZm9yIG5lc3RlZCB0eXBlIGRlZmluaXRpb25zLgoJICAgICAgc3BlY2lmaWNhbGx5IHR5cGVkZWZzIGluIHRlbXBsYXRlZCBjbGFzcyBkZWZucy4KCjA3LzE4LzIwMDY6IG1nb3NzYWdlCgkgICAgQnVnZml4ICMxNTIyODU4CgkgICAgdXBkYXRlZCBsdWEuY3h4IHRvIHN1cHBvcnQgLWV4dGVybmFsLXJ1bnRpbWUgY29tbWFuZAoKMDcvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgSW5jcmVtZW50IHRoZSBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byAzLCBiZWNhdXNlIG9mIHRoZQoJICAgIGFkZGl0aW9uIG9mIHRoZSBvd25kYXRhIG1lbWJlciBpbiBzd2lnX3R5cGVfaW5mby4KCSAgICBSZXBvcnRlZCBieTogUHJhYmh1IFJhbWFjaGFuZHJhbgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU2VhcmNoIHBhdGggZml4ZXM6CiAgICAgICAgICAgIC0gRml4IHNlYXJjaCBwYXRoIGZvciBsaWJyYXJ5IGZpbGVzIHRvIGJlaGF2ZSBhcyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbC4KICAgICAgICAgICAgLSBGaXggbWluZ3cvbXN5cyBidWlsZHMgd2hpY2ggZGlkIG5vdCBmaW5kIHRoZSBTV0lHIGxpYnJhcnkgd2hlbiBpbnN0YWxsZWQuCiAgICAgICAgICAgIC0gV2luZG93cyBidWlsZHMgYWxzbyBvdXRwdXQgdGhlIG1pbmd3L21zeXMgaW5zdGFsbCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcKICAgICAgICAgICAgICBzd2lnIC1zd2lnbGliLgogICAgICAgICAgICAtIFRoZSBub24tZXhpc3RlbnQgYW5kIHVuZG9jdW1lbnRlZCBjb25maWcgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBoYXMKICAgICAgICAgICAgICBiZWVuIHJlbW92ZWQuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHN5bW5hbWUgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24uCgowNy8wNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBBZGQgJWZlYXR1cmUoImNvbnN0YXN2YXIiKSwgd2hpY2ggaW5zdGVhZCBvZiBleHBvcnRpbmcgYSBjb25zdGFudCBhcyBhCgkgICAgc2NoZW1lIGZ1bmN0aW9uLCBleHBvcnRzIHRoZSBjb25zdGFudCBhcyBhIHNjaGVtZSB2YXJpYWJsZS4gIFVwZGF0ZSB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGFzIHdlbGwuCgowNy8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbU2VlIGVudHJ5IG9mIDA5LzEzLzIwMDYgLSBleHBsaWNpdGNhbGwgZmVhdHVyZSBhbmQgZG9jdW1lbnRhdGlvbiB0byBpdCByZW1vdmVkXQogICAgICAgICAgICBOZXcgZXhwbGljaXRjYWxsIGZlYXR1cmUgd2hpY2ggZ2VuZXJhdGVzIGFkZGl0aW9uYWwgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICB0aGF0IGNhbGwgdGhlIG1ldGhvZCBleHBsaWNpdGx5LCBub3QgcmVseWluZyBvbiBwb2x5bW9ycGhpc20gdG8gbWFrZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGNhbGwuIFRoZSBmZWF0dXJlIGlzIGEgZmVhdHVyZSBmbGFnIGFuZCBpcyBlbmFibGVkIGxpa2UgYW55IG90aGVyIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgSXQgYWxzbyByZWNvZ25pc2VzIGFuIGF0dHJpYnV0ZSwgInN1ZmZpeCIgZm9yIG1hbmdsaW5nIHRoZSBmZWF0dXJlIG5hbWUsIHNlZQogICAgICAgICAgICBTV0lHUGx1cy5odG1sI1NXSUdQbHVzX2V4cGxpY2l0Y2FsbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBpcyBhbHNvIGEgd29ya2Fyb3VuZCBmb3Igc29sdmluZyB0aGUgcmVjdXJzaXZlIGNhbGxzCiAgICAgICAgICAgIHByb2JsZW0gd2hlbiBhIGRpcmVjdG9yIG1ldGhvZCBtYWtlcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIG1ldGhvZC4gU2VlCiAgICAgICAgICAgIEphdmEuaHRtbCNqYXZhX2RpcmVjdG9yc19leHBsaWNpdGNhbGwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KCjA2LzI4LzIwMDY6IGpvZSAoSm9zZXBoIFdhbmcpCgkgICAgW3JdIEluaXRpYWwgc3VwcG9ydCBmb3IgUgoKMDYvMjAvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCiAgICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIGdldCBhcHBseV9zdHJpbmdzLmkgdGVzdHN1aXRlIHRvIHBhc3MKCSAgICBSZW1vdmUgaW50ZWdlcnNfcnVubWUuc2NtIGZyb20gdGhlIHRlc3RzdWl0ZSwgYmVjYXVzZSBTV0lHIGFuZCBDaGlja2VuIGRvZXMKICAgICAgICAgICAgaGFuZGxlIG92ZXJmbG93cy4KCjA2LzE5LzIwMDU6IG9sbHkKCSAgICBbcGhwXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBQSFA1IGNsYXNzIHdyYXBwZXJzIGZvciBDKysKCSAgICBjbGFzc2VzICh1c2UgInN3aWcgLXBocDUiKS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBBZGRlZCBzb21lIG1pc3Npbmcga2V5d29yZHMgdG8gdGhlIFBIUDQga2V5d29yZCBsaXN0LCBhbmQKCSAgICBmaXhlZCBfX0xJTkVfXyBhbmQgX19GSUxFX18gd2hpY2ggd2VyZSBpbiB0aGUgd3JvbmcgY2F0ZWdvcnkuCgkgICAgQWxzbyBhZGRlZCBhbGwgdGhlIGtleXdvcmRzIG5ldyBpbiBQSFA1LCBhbmQgYWRkZWQgY29tbWVudHMKCSAgICBub3RpbmcgdGhlIFBIUDQga2V5d29yZHMgd2hpY2ggYXJlbid0IGtleXdvcmRzIGluIFBIUDUuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIGFzIHRoaXMgcG9pbnRlciAoZS5nLgoJICAgIENsYXNzX21ldGhvZChOdWxsKSkgLSBnaXZlIGEgUEhQIEVycm9yIGluc3RlYWQuCgowNi8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lciBjbGFzcy4KCSAgICBGaXggYSBmZXcgYnVncyBpbiBoZWxwZXIgZnVuY3Rpb25zLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlcGxhY2UgSk5JRVhQT1JUIHdpdGggU1dJR0VYUE9SVCwgdGhlcmVieSBlbmFibGluZyB0aGUgcG9zc2liaWxpdHkKICAgICAgICAgICAgb2YgdXNpbmcgZ2NjIC1mdmlzaWJpbGl0eT1oaWRkZW4gZm9yIHBvdGVudGlhbGx5IHNtYWxsZXIgZmFzdGVyIGxvYWRpbmcgd3JhcHBlcnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIE1ha2VmaWxlcyBmb3IgYXV0b2NvbmYtMi42MCBiZXRhCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBWbGFkaW1pciBNZW5zaGFrb3YgcGF0Y2ggZm9yIGNvbXBpbGluZyB3cmFwcGVycyB3aXRoIHB5dGhvbi0yLjUgYWxwaGEuCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVmZmVyIG92ZXJmbG93IGVycm9yIHdoZW4gdXNpbmcgbGFyZ2UgJWZlYXR1cmUoZG9jc3RyaW5nKSByZXBvcnRlZAogICAgICAgICAgICBieSBKb3NlcGggV2luc3Rvbi4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBPcGVyYXRvciBvdmVybG9hZCBmaXggZnJvbSBEYW5pZWwgTW9vcmUuCgowNS8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBnZW5lcmF0aW9uIG9mIENMT1MgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHVuaW9ucwoJICAgIGFuZCBlcXVpdmFsZW50IHR5cGVzLgoKMDUvMjQvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIERvbid0IHJlcXVpcmUgYSBmdWxsIGNsYXNzIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgYSBDTE9TIHdyYXBwZXIuCgowNS8yMC8yMDA2OiBvbGx5CgkgICAgW3BocF0gR0NDIFZpc2liaWxpdHkgc3VwcG9ydCBub3cgd29ya3Mgd2l0aCBQSFAuCgowNS8xOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVtb3ZlZCBzdXBwb3J0IGZvciAtZGxuYW1lICh1c2UgLW1vZHVsZSBpbnN0ZWFkKS4gIEZpeGVkCgkgICAgbmFtaW5nIG9mIFBIUCBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQSFAKCSAgICBjb252ZW50aW9ucyAobm8gInBocF8iIHByZWZpeCBvbiBVbml4OyBvbiBQSFAgPj0gNC4zLjAsIGhhbmRsZSBVbml4CgkgICAgcGxhdGZvcm1zIHdoaWNoIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiLnNvIiBhcyB0aGUgZXh0ZW5zaW9uLikKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZAoKMDUvMDcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCB3aGVyZSBhIEMrKyByZWZlcmVuY2UKCSAgICBpcyB3YW50ZWQuCgowNS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IHdyYXBwZXJzIGdlbmVyYXRlZCBmb3IgZ2xvYmFsICdjaGFyJyB2YXJpYWJsZXMgdG8gbm90CgkgICAgaW5jbHVkZSBhIHRlcm1pbmF0aW5nIHplcm8gYnl0ZSBpbiB0aGUgUEhQIHN0cmluZy4KCjA1LzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSB0eXBlbWFwcyBzbyB0aGF0IGNoYXIgKiBjYW4gYmUgYXBwbGllZCB0byB1bnNpZ25lZCBjaGFyICogb3Igc2lnbmVkIGNoYXIgKgogICAgICAgICAgICB0eXBlcyBhbmQgdmlzYSB2ZXJzYS4KCjA1LzAzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXVRoYW5rcyB0byBMdWtlIEogQ3Jvb2sgZm9yIHRoaXMgaWRlYS4KICAgICAgICAgICAgIC0gYSBzdHJ1Y3QvZW51bS91bmlvbiBpcyByZXBsYWNlZCB3aXRoIDpwb2ludGVyIG9ubHkgaWYKICAgICAgICAgICAgICAgdGhhdCBzbG90IGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0byB0aGF0IHR5cGUuIFNvLDogCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFfc3RydWN0IHsgaW50IHg7IH0gYW5kCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJfc3RydWN0IHsgYV9zdHJ1Y3Qgc3RydWN0XzE7IH07IAogICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBhczoKICAgICAgICAgICAgICAgICAgIChjZmZpOmRlZmNzdHJ1Y3QgYl9zdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdF8xIGFfc3RydWN0KSkKICAgICAgICAgICAgIC0gT3RoZXIgbWlub3IgZml4ZXMgaW4gbGlzcGlmeWluZyBuYW1lcy4KCjA1LzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwb3NzaWJsZSByZWRlZmluaXRpb24gb2YgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIGZvciBWQysrLgoKMDQvMTQvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCiAgICAgICAgICAgIFRoYW5rcyB0byBUaG9tYXMgV2VpZG5lciBmb3IgdGhlIHBhdGNoLgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBleHBvcnQgaXMgc2V0IChleHBvcnQgJ2ZvbykgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBldmVyeSBzeW1ib2wKICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW5saW5lIGlzIHNldCAoZGVjbGFpbSAoaW5saW5lIGZvbykpIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbnRlcm5fZnVuY3Rpb24gaXMgc2V0IAogICAgICAgICAgICAgICMuKHZhbHVlLW9mLWludGVybi1mdW5jdGlvbiAibmFtZSIgIm5vZGVUeXBlIiBwYWNrYWdlKQogICAgICAgICAgICAgIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGUgcGxhaW4gc3ltYm9sLiBBIHNhbXBsZSBzd2lnLWxpc3BpZnkgCiAgICAgICAgICAgICAgaXMgcHJvdmlkZWQuCiAgICAgICAgICAgIC0gZXZlcnkgc3ltYm9sIGlzIHByZWZpeGVkIGJ5IGl0J3MgcGFja2FnZS4KCjA0LzEzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQoJICAgIEZpeGVkIHRoZSBnZW5lcmF0aW9uIG9mIHdyYXBwZXJzIGZvciBnbG9iYWwgdmFyaWFibGVzLiAKICAgICAgICAgICAgQWRkZWQgdGhlIG9wdGlvbiBbbm9dc3dpZy1saXNwIHdoaWNoIHR1cm5zIG9uL29mZiBnZW5lcmF0aW9uIAogICAgICAgICAgICBvZiBjb2RlIGZvciBzd2lnIGhlbHBlciBsaXNwIG1hY3JvLCBmdW5jdGlvbnMsIGV0Yy4KClZlcnNpb24gMS4zLjI5IChNYXJjaCAyMSwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBvdXRwdXQgdHlwZW1hcCBvZiBjaGFyIHNvIGl0IHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluc3RlYWQKCSAgICBvZiBhbiBpbnRlZ2VyLiBBbHNvIGFkZHMgaW5wdXQvb3V0cHV0IHR5cGVtYXBzIGZvciAnY2hhciAqJy4KCgkgICAgYWRkIGNvbW1hbmQtbGluZSBhcmd1bWVudCAtaXNvbGF0ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKCSAgICBmaWxlIHRoYXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgU1dJRyBnZW5lcmF0ZWQgZmlsZXMgdGhhdAoJICAgIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgoKMDMvMjAvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIE1vcmUgdHdlYWtzIHRvIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCgkgICAgRml4IGNvbnN0YW50V3JhcHBlciBmb3IgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLgoKCSAgICBmaW5kLWRlZmluaXRpb24ga2V5YmluZGluZ3Mgc2hvdWxkIHdvcmsgaW4gRUxJL1NMSU1FLgoJICAgIE91dHB1dCAoaW4tcGFja2FnZSA8bW9kdWxlLW5hbWU+KSB0byBsaXNwIHdyYXBwZXIKCSAgICBpbnN0ZWFkIG9mIChpbi1wYWNrYWdlICMuKnN3aWctbW9kdWxlLW5hbWUqKS4KCgkgICAgc2xpZ2h0IHJld29yayBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgoKCSAgICBkb2MgdXBkYXRlcy4KCjAzLzE3LzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtYW5nbGUgbmFtZXMgb2YgY29uc3RhbnRzIGdlbmVyYXRlZCB2aWEgY29uc3RhbnRXcmFwcGVyLgoJICAgIAoJICAgIFdoZW4gdXNpbmcgT1VUUFVUIHR5cGVtYXBzIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgbm9uLXZvaWQKCSAgICByZXR1cm4gdmFsdWUsIGl0IHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgdmFsdWVzLWxpc3QsIGZvbGxvd2VkCgkgICAgYnkgdGhlIE9VVFBVVCBtYXBwZWQgdmFsdWVzLgoKCSAgICBGaXggYnVnIHdpdGggYm9vbGVhbiBwYXJhbWV0ZXJzLCB3aGljaCBuZWVkZWQgdG8gYmUKCSAgICBwYXNzZWQgaW4gYXMgaW50IHZhbHVlcywgcmF0aGVyIHRoYW4gVCBvciBOSUwuCgowMy8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgR2VuZXJhdGUgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyB3aGVuIGluIEMrKyBvciAtY3dyYXAgbW9kZS4KCSAgICBNYWtlIC1jd3JhcCB0aGUgZGVmYXVsdCwgc2luY2UgaXQgaXMgbW9zdCBjb3JyZWN0LiBVc2VycwoJICAgIGNhbiB1c2UgdGhlIC1ub2N3cmFwIG9wdGlvbiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSAuY3h4CgkgICAgZmlsZSB3aGVuIGludGVyZmFjaW5nIHRvIEMgY29kZS4KCgkgICAgV2hlbiBpbiAtbm9jd3JhcCBtb2RlLCBpbXByb3ZlIHRoZSBoYW5kbGluZyBvZiBjb252ZXJ0aW5nCiAJICAgIGluZml4IGxpdGVyYWxzIHRvIHByZWZpeCBub3RhdGlvbiBmb3IgbGlzcC4gVGhpcyBpcyB2ZXJ5CgkgICAgYmFzaWMgYW5kIG5vdCBsaWtlbHkgdG8gYmUgaW1wcm92ZWQgdXBvbiBzaW5jZSB0aGlzIG9ubHkKCSAgICBhcHBsaWVzIHRvIHRoZSAtbm9jd3JhcCBjYXNlLiBMaXRlcmFscyB3ZSBjYW4ndCBmaWd1cmUgb3V0CgkgICAgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGFuZCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgY29kZS4KCgkgICAgdmFsaWRJZGVudGlmaWVyIG5vdyBtb3JlIGNsb3NlbHkgYXBwcm94aW1hdGVzIHdoYXQgbWF5IGJlCgkgICAgYSBsZWdhbCBjb21tb24gbGlzcCBzeW1ib2wuCgoJICAgIEZpeCB0eXBlbWFwIGVycm9yIGluIGFsbGVncm9jbC5zd2cKCSAgICAKMDMvMTIvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCB1cCBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgkgICAgR2VuZXJhdGUgYysrIHN0eWxlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzdHJ1Y3QvdW5pb24gbWVtYmVycwoJICAgIHdoZW4gLWN3cmFwIG9wdGlvbiBzcGVjaWZpZWQuCgowMy8xMC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBDIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGxhc3QgYWxsZWdyb2NsCgkgICAgY29tbWl0LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIENvbW1pdCAjMTQ0NzMzNyAtIERlbGV0ZSBMb2NhbFJlZnMgYXQgdGhlIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIHRvIGZpeCBwb3RlbnRpYWwgbGVhawoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDQ0OTQ5IC0gY29uZmlndXJlIGRvZXMgbm90IGhvbm9yIC0tcHJvZ3JhbS1wcmVmaXguCiAgICAgICAgICAgIFJlbW92ZWQgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4LiBGaXggdGhlIGF1dG9jb25mIHN0YW5kYXJkCiAgICAgICAgICAgIG9wdGlvbnMgLS1wcm9ncmFtLXByZWZpeCBhbmQgLS1wcm9ncmFtLXN1ZmZpeCB3aGljaCB3ZXJlIGJlaW5nIHNob3duIGluIHRoZSBoZWxwLAogICAgICAgICAgICBidXQgd2VyZSBiZWluZyBpZ25vcmVkLiBVc2UgLS1wcm9ncmFtLXN1ZmZpeCBpbnN0ZWFkIG9mIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBub3cuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgRml4ICMxNDQ2MzE5IHdpdGggcGF0Y2ggZnJvbSBhbmRyZWFzdGggLSBtb3JlIHRoYW4gb25lIHdzdHJpbmcgcGFyYW1ldGVyIGluIGRpcmVjdG9yIG1ldGhvZHMKCjAzLzA3LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIAoJICAgIEZpeCBmb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgYSAiLSIgaW4gbm9uLSJzaGFkb3ciIG1vZGUuCgkgICAgUGF0Y2ggZnJvbSBBYXJvbiBWYW5EZXZlbmRlciAoIzE0NDE0NzQpLgoKMDMvMDQvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgLU8gdG8gdGhlIG1haW4gcHJvZ3JhbSwgd2hpY2ggbm93IGVuYWJsZXMgLWZhc3RkaXNwYXRjaAoJICAgIAoJICAgIFtQeXRob25dCgoJICAgIC0gQWRkIHRoZSAtZmFzdGluaXQgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgX19pbml0X18KICAgICAgICAgICAgICBtZXRob2RzLiBTZXR0aW5nICd0aGlzJyBhcyAnc2VsZi50aGlzLmFwcGVuZCh0aGlzKScgaW4gdGhlIHB5dGhvbgoJICAgICAgY29kZSBjb25mdXNlcyBQeUx1Y2VuZS4gTm93IHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQoJICAgICAgdGhlIEMrKyBzaWRlLCBhcyByZXBvcnRlZCBieSBBbmRpIGFuZCBSb2Jpbi4KCgkgICAgLSBBZGQgdGhlIC1mYXN0cXVlcnkgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgU1dJR19UeXBlUXVlcnkgdmlhIGEKICAgICAgICAgICAgICBweXRob24gZGljdCBjYWNoZSwgYXMgcHJvcG9zZWQgYnkgQW5kaSBWYWpkYQoKCSAgICAtIEF2b2lkIHRvIGNhbGwgUHlPYmplY3RfR2V0QXR0ciBpbnNpZGUgU1dJR19QeXRob25fR2V0U3dpZ1RoaXMsCgkgICAgICBzaW5jZSB0aGlzIGNvbmZ1c2VzIFB5THVjZW5lLCBhcyByZXBvcnRlZCBieSBBbmRpIFZhamRhLgoJICAgIAowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgUmVtb3ZlZCBleHRyYSAodm9pZCAqKSBjYXN0IHdoZW4gY2FzdGluZyBwb2ludGVycyB0byBhbmQgZnJvbSBqbG9uZyBhcyB0aGlzCiAgICAgICAgICAgIHdhcyBzdXBwcmVzc2luZyBnY2MncyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5nLiBUaGlzIHdhcm5pbmcgY291bGQgYmUgaWdub3JlZCBpbiB2ZXJzaW9ucyBvZiBnY2MgcHJpb3IgdG8gNC4wLCBidXQgbm93IHRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIHVzZWZ1bCBhcyBnY2MgLU8yIGFuZCBoaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBpbmNsdWRlcyAtZnN0cmljdC1hbGlhc2luZyB3aGljaAogICAgICAgICAgICBnZW5lcmF0ZXMgY29kZSB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlIGNhc3RzLiBUaGUgYXNzaWdubWVudCBpcyBzaW1wbHkgbmV2ZXIgbWFkZS4KICAgICAgICAgICAgUGxlYXNlIHVzZSAtZm5vLXN0cmljdC1hbGlhc2luZyB0byBib3RoIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCBmaXggdGhlIGJhZCBhc3NlbWJseQogICAgICAgICAgICBjb2RlIGdlbmVyYXRlZC4gTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IHRoZSBDIGNvbXBpbGVyLCBidXQgbm90CiAgICAgICAgICAgIHRoZSBDKysgY29tcGlsZXIsIHlldCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgYWxzbyBnZW5lcmF0ZSBicm9rZW4gY29kZS4gQWx0ZXJuYXRpdmVseSB1c2UgCiAgICAgICAgICAgIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIGZvciBnY2MtMy54LiBUaGUgdHlwZW1hcHMgYWZmZWN0ZWQKICAgICAgICAgICAgYXJlIHRoZSAiaW4iIGFuZCAib3V0IiB0eXBlbWFwcyBpbiBqYXZhLnN3ZyBhbmQgYXJyYXlzX2phdmEuc3dnLiBVc2VycyBvdWdodCB0byBmaXgKICAgICAgICAgICAgdGhlaXIgb3duIHR5cGVtYXBzIHRvIGRvIHRoZSBzYW1lLiBOb3RlIHRoYXQgcmVtb3ZhbCBvZiB0aGUgdm9pZCAqIGNhc3Qgc2ltcGx5IHByZXZlbnRzCiAgICAgICAgICAgIHN1cHByZXNzaW9uIG9mIHRoZSB3YXJuaW5nIGZvciB0aGUgQyBjb21waWxlciBhbmQgbm90aGluZyBlbHNlLiBUeXBpY2FsIGNoYW5nZToKCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkodm9pZCAqKSYkaW5wdXQ7ICV9CiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpJiRpbnB1dDsgJX0KCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSh2b2lkICopJiRyZXN1bHQgPSAkMTsgJX0gCiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkmJHJlc3VsdCA9ICQxOyAlfSAKCjAzLzAyLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0KCSAgICBBZGQgdHlwZW1hcHMgZm9yICJsb25nIGxvbmciOyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgaG93ZXZlciwgZGVwZW5kcwoJICAgIG9uIHRoZSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIEd1aWxlLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgaW5uZXIgZXhjZXB0aW9ucy4gSWYgYW55IG9mIHRoZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aGljaCBjb25zdHJ1Y3QKICAgICAgICAgICAgYSBwZW5kaW5nIGV4Y2VwdGlvbiBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZXhjZXB0aW9uLCBpdCB3aWxsIGNyZWF0ZSB0aGUgbmV3CiAgICAgICAgICAgIGV4Y2VwdGlvbiB3aXRoIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBhcyBhbiBpbm5lciBleGNlcHRpb24uCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBQaHA1IGV4Y2VwdGlvbnMgaWYgY29tcGlsaW5nIGFnYWluc3QgUGhwNSAocGF0Y2ggZnJvbSBPbGx5IEJldHRzKS4KCjAzLzAxLzIwMDY6IG1tYXR1cwoJICAgIFVzZSB0aGUgR0NDIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIFNXSUdFWFBPUlQuCgoJICAgIE5vdyB5b3UgY2FuIGNvbXBpbGUgKHdpdGggZ2NjIDMuNCBvciBsYXRlcikgdXNpbmcKCSAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iLgoJICAgIAoJICAgIENoZWNrIHRoZSBkaWZmZXJlbmNlIGZvciB0aGUgJ3N0ZF9jb250YWluZXJzLmknIHB5dGhvbiAKCSAgICB0ZXN0IGNhc2U6CiAKICAgICAgICAgICAgU2l6ZXM6CgoJICAgICAgMzMwNTQzMiBfc3RkX2NvbnRhaW5lcnMuc28KCSAgICAgIDIzODM5OTIgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBFeHBvcnRlZCBzeW1ib2xzIChubSAtRCA8ZmlsZT4uc28gfCB3YyAtbCk6CgogICAgICAgICAgICAgIDYxNDYgX3N0ZF9jb250YWluZXJzLnNvIAogICAgICAgICAgICAgIDE3NCAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbiAKCgkgICAgRXhlY3V0aW9uIHRpbWVzOgoKCSAgICAgIHJlYWwgMG0wLjA1MHMgdXNlciAwbTAuMDM5cyBzeXMgMG0wLjAwNXMgICBfc3RkX2NvbnRhaW5lcnMuc28KICAgICAgICAgICAgICByZWFsIDBtMC4wMzlzIHVzZXIgMG0wLjAyNnMgc3lzIDBtMC4wMDdzICAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBSZWFkIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIG1vcmUgZGV0YWlscy4KCgowMi8yNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIHN1cHBvcnQgZm9yIElOUFVULCBPVVRQVVQsIGFuZCBJTk9VVCB0eXBlbWFwcy4KCSAgICBGb3IgT1VUUFVUIHZhcmlhYmxlcywgdGhlIGxpc3Agd3JhcHBlciByZXR1cm5zIG11bHRpcGxlCgkgICAgdmFsdWVzLgoKMDIvMjYvMjAwNjogbW1hdHVzCgoJICAgIFtSdWJ5XSBhZGQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGZpbGUuCgkgICAgCgkgICAgVXNlIGl0IGFzIGZvbGxvdzoKCgkJJWluY2x1ZGUgYXJnY2FyZ3YuaQoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlYXBwbHkgKGludCBBUkdDLCBjaGFyICoqQVJHVikgeyAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB9IAoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlaW5saW5lIHsJCQkJCiAgIAkgICAgICAgICAgaW50IG1haW5BcHAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSAJCiAgIAkgICAgICAgICAgewkJCQkJCQogICAJICAgICAgICAgICAgcmV0dXJuIGFyZ2M7CQkJCQkKICAgCSAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CQkJCQkJCQoJICAgICAgCQkJCQkJCQogICAJICAgIHRoZW4gaW4gdGhlIHJ1Ynkgc2lkZToJCQkJCQoJICAgICAgCQkJCQkJCQkKICAgCSAgICAgICAgYXJncyA9IFsiYXNkZiIsICJhc2RmMiJdCQkJCQogICAJICAgICAgICBuID0gbWFpbkFwcChhcmdzKTsKCQoKCSAgICBUaGlzIGlzIHRoZSBzaW1pbGFyIHRvIHRoZSBweXRob24gdmVyc2lvbiBMaWIvcHl0aG9uL2FyZ2Nhcmd2LmkKCjAyLzI0LzIwMDY6IG1nb3NzYWdlCgoJICAgIFNtYWxsIHVwZGF0ZSBMdWEgZG9jdW1lbnRzIG9uIHRyb3VibGVzaG9vdGluZyBwcm9ibGVtcwoJICAgIAowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIEZpeCBhbGwgdGhlIGVycm9ycyByZXBvcnRlZCBmb3IgMS4zLjI4LgoJICAgIC0gZml4IGJ1ZyAjMTE1ODE3OAoJICAgIC0gZml4IGJ1ZyAjMTA2MDc4OQoJICAgIC0gZml4IGJ1ZyAjMTI2MzQ1NwoJICAgIC0gZml4ICdjb25zdCAgY2hhciomJyB0eXBlbWFwIGluIHRoZSBVVEwsIHJlcG9ydGVkIGJ5IEdlb2ZmIEh1dGNoaXNvbgoJICAgIC0gZml4ZXMgZm9yIHB5dGhvbiAyLjEgYW5kIHRoZSBydW50aW1lIGxpYnJhcnkKCSAgICAtIGZpeCBjb3B5Y3RvciArIHRlbXBsYXRlIGJ1ZyAjMTQzMjEyNQoJICAgIC0gZml4IFsgMTQzMjE1MiBdICVyZW5hbWUgZnJpZW5kIG9wZXJhdG9ycyBpbiBuYW1lc3BhY2UKCSAgICAtIGZpeCBnY2Mgd2FybmluZyByZXBvcnRlZCBieSBSLiBCZXJuc3RlaW4KCSAgICAtIGF2b2lkIGFzc2VydCB3aGVuIGZpbmRpbmcgYSByZWN1cnNpdmUgc2NvcGUgaW5oZXJpdGFuY2UsCgkgICAgICBlbWl0IGEgd2FybmluZyBpbiB0aGUgd29yc3QgY2FzZSwgcmVwb3J0ZWQgYnkgTml0cm8gCgkgICAgLSBmaXggcHJlbWF0dXJlIG9iamVjdCBkZWxldGlvbiByZXBvcnRlZCBieSBQYXVsIGluIHRjbDNkCgkgICAgLSBmaXggd2FybmluZyByZXBvcnRlZCBieSBOaXRybyBpbiBWQzcKCSAgICAtIG1vcmUgZml4ZXMgZm9yIG9sZCBTb2xhcmlzIGNvbXBpbGVyCgkgICAgLSBmaXggZm9yIHB5dGhvbiAyLjMgYW5kIGdjX3JlZnMgaXNzdWUgcmVwb3J0ZWQgYnkgTHVpZ2kKCSAgICAtIGZpeCBmYXN0cHJveHkgZm9yIG1ldGhvZHMgdXNpbmcga3dhcmdzCgkgICAgLSBmaXggb3ZlcmxvYWQgKyBwcm90ZWN0ZWQgbWVtYmVyIGlzc3VlIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggc2V0ZXJyb3Jtc2cgYXMgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBkaXJlY3RvcnMsIG5vdyB0aGUgdGVzdC1zdWl0ZSBydW5zIGFnYWluIHVzaW5nIC1kaXJlY3RvcnMKCSAgICAtIGZpeCBmb3IgZnJpZW5kIG9wZXJhdG9yIGFuZCBWaXN1YWwgc3R1ZGlvIGFuZCBidWcgMTQzMjE1MgoJICAgIC0gZml4IGJ1ZyAjMTQzNTA5MAoJICAgIC0gZml4IHVzaW5nICsgJWV4dGVuZCBhcyByZXBvcnRlZCBieSBXaWxsaWFtCgkgICAgLSBmaXggYnVnICMxMDk0OTY0CgkgICAgLSBmaXggZm9yIFB5X05vdEltcGxlbWVudGVkIGFzIHJlcG9ydGVkIGJ5IE9sbHkgYW5kIEFtYXVyeQoJICAgIC0gZml4IG5lc3RlZCBuYW1lc3BhY2UgaXNzdWUgcmVwb3J0ZWQgYnkgQ2hhcmxpZQoKCSAgICBhbmQgYWxzbzoKCSAgICAKCSAgICAtIGFsbG93IGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzIGJ5IGRlZmF1bHQKCSAgICAtIGRlbGV0ZSBleHRyYSBuZXcgbGluZXMgaW4gc3dpZ21hY3Jvc1tVVExdCgkgICAgLSBjb3NtZXRpYyBmb3IgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCgkgICAgLSBhZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBVVEwKCSAgICAtIGFkZCBzd2lncmVnaXN0ZXIgcHJveHkgbWV0aG9kIGFuZCBtb3ZlIF9fcmVwcl9fIHRvIGEKCSAgICAgIHNpbmdsZSBnbG9iYWwgbW9kdWxlICBbcHl0aG9uXQoKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBXaGVuIHVzaW5nIGRpcmVjdG9ycywgbm93IHN3aWcgd2lsbCBlbWl0IGFsbCB0aGUgdmlydHVhbAoJICAgIHByb3RlY3RlZCBtZXRob2RzIGJ5IGRlZmF1bHQuIAoKCSAgICBJbiBwcmV2aW91cyByZWxlYXNlcywgeW91IG5lZWRlZCB0byB1c2UgdGhlICdkaXJwcm90JwoJICAgIG9wdGlvbiB0byBhY2hpZXZlIHRoZSBzYW1lLgoKCSAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBuZXcgZGVmYXVsdCBiZWhhdmlvdXIsCgkgICAgdXNlIHRoZSAnbm9kaXJwcm90JyBvcHRpb246IAoKCSAgICAgICBzd2lnIC1ub2RpcnByb3QgLi4uCgoJICAgIGFuZC9vciB0aGUgJW5vZGlyZWN0b3IgZmVhdHVyZSBmb3Igc3BlY2lmaWMgbWV0aG9kcywgaS5lLjoKCgkgICAgICAgJW5vZGlyZWN0b3IgRm9vOjpiYXI7CgoJICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgICAgdmlydHVhbCB+Rm9vKCk7CgoJICAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIoKTsKCSAgICAgICB9OwoJICAgIAoKCSAgICBBcyBiZWZvcmUsIHB1cmUgYWJzdHJhY3QgcHJvdGVjdGVkIG1lbWJlcnMgYXJlIGFsbHdheXMKCSAgICBlbWl0dGVkLCBpbmRlcGVuZGVudCBvZiB0aGUgJ2RpcnByb3Qvbm9kaXJwcm90JyBvcHRpb25zLgoKCjAyLzIyLzIwMDY6IG1tYXR1cwoJICAgIEFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIGxhbmd1YWdlcyB1c2luZyB0aGUgVVRMIChweXRob24sdGNsLHJ1YnkscGVybCkuCgkgICAgCiAgICAgICAgICAgIGZhY3RvcnkuaSBpbXBsZW1lbnRzIGEgbW9yZSBuYXR1cmFsIHdyYXAgZm9yIGZhY3RvcnkgbWV0aG9kcy4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZToJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgR2VvbWV0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZW51bSBHZW9tVHlwZXsJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgICAgIFBPSU5ULAkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgICAgQ0lSQ0xFCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgfkdlb21ldHJ5KCkge30gICAgCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgaW50IGRyYXcoKSA9IDA7CQkJCSAgICAKICAJICAgIAkgCQkJCQkJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgCSAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgICBzdGF0aWMgR2VvbWV0cnkgKmNyZWF0ZShHZW9tVHlwZSBpKTsgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IFBvaW50IDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAxOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSB3aWR0aCgpIHsgcmV0dXJuIDEuMDsgfSAgICAJICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBDaXJjbGUgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDI7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHJhZGl1cygpIHsgcmV0dXJuIDEuNTsgfSAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgfTsgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUoR2VvbVR5cGUgdHlwZSkgewkJICAgIAogIAkgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBQT0lOVDogcmV0dXJuIG5ldyBQb2ludCgpOwkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgQ0lSQ0xFOiByZXR1cm4gbmV3IENpcmNsZSgpOyAJICAgICAJCSAgICAKICAJICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH0JCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH0JCQkJCSAgICAJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICBZb3UgY2FuIHVzZSB0aGUgJWZhY3Rvcnkgd2l0aCB0aGUgR2VvbWV0cnk6OmNyZWF0ZSBtZXRob2QgYXMgZm9sbG93czoKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgJW5ld29iamVjdCBHZW9tZXRyeTo6Y3JlYXRlOwkJCQkgICAgCiAgCSAgICAgICVmYWN0b3J5KEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlLCBQb2ludCwgQ2lyY2xlKTsJICAgIAogIAkgICAgICAlaW5jbHVkZSAiZ2VvbWV0cnkuaCIJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIGFuZCBHZW9tZXRyeTo6Y3JlYXRlIHdpbGwgcmV0dXJuIGEgJ1BvaW50JyBvciAnQ2lyY2xlJyBpbnN0YW5jZSAgIAogIAkgICAgaW5zdGVhZCBvZiB0aGUgcGxhaW4gJ0dlb21ldHJ5JyB0eXBlLiBGb3IgZXhhbXBsZSwgaW4gcHl0aG9uOgkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgIGNpcmNsZSA9IEdlb21ldHJ5LmNyZWF0ZShHZW9tZXRyeS5DSVJDTEUpCQkJICAgIAogIAkgICAgICByID0gY2lyY2xlLnJhZGl1cygpCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgd2hlcmUgJ2NpcmNsZScgbm93IGlzIGEgQ2lyY2xlIHByb3h5IGluc3RhbmNlLgkgICAgCQkgICAgCgoKMDIvMTcvMjAwNjogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIGludGVncmFsCgkgICAgdmFsdWVzLCBhbmQgdGhleSBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCSAgICBbR3VpbGVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZQoJICAgIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgowMi8xMy8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbRG9jdW1lbnRzXSB1cGRhdGVkIHRoZSBleHRlbmRpbmcgZG9jdW1lbnRzIHRvIGdpdmUgYSBza2VsZXRvbiBzd2lnZ2luZyBjb2RlCiAgICAgICAgICAgIHdpdGggYSBmZXcgdHlwZW1hcHMuCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIGFuIGV4dHJhIHR5cGVtYXAgZm9yIHZvaWQqIFtpbl0sIHNvIGEgZnVuY3Rpb24gd2hpY2ggcmVxdWlyZXMgYSB2b2lkKgogICAgICAgICAgICBjYW4gdGFrZSBhbnkga2luZCBvZiBwb2ludGVyCgpWZXJzaW9uIDEuMy4yOCAoRmVicnVhcnkgMTIsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIEZpeCBtYW55IGlzc3VlcyB3aXRoIGxpbmUgY291bnRpbmcgYW5kIGVycm9yIHJlcG9ydHMuCgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBCZXR0ZXIgc3RhdGljIGRhdGEgbWVtYmVyIHN1cHBvcnQsIGlmIHlvdSBoYXZlCgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiBub3cgaXMgdmFsaWQgdG8gYWNjZXNzIHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIsIGllOgoKICAgICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgICAgZi5iYXIgPSAzCgoJICAgIGp1c3QgYXMgaW4gQysrLgoKCjAyLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gdG8gd29yayBhZ2FpbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBQZXJsCiAgICAgICAgICAgICg1LjAwNCBhbmQgbGF0ZXIgdGVzdGVkKQoKMDIvMDQvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoKSBkaXJlY3RpdmUgdG8gZXh0ZW5kCgkgICAgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgaW4gcHl0aG9uLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc21hcnQgcG9pbnRlciBhczoKCSAgICAKCSAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBSQ1B0ciB7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIC4uLgoJICAgICAgICBSQ1B0cihUeXBlICpwKTsKCQlUeXBlICogb3BlcmF0b3ItPigpIGNvbnN0OwoJCS4uLgoJICAgICAgfTsKCSAgICAgIAoJICAgIHlvdSB1c2UgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlciBkaXJlY3RpdmUgYXM6CgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpICBSQ1B0cjxBPjsKCSAgICAKCSAgICB0aGVuLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICBSQ1B0cjxBPiBtYWtlX3B0cigpOwoJICAgICAgaW50IGZvbyhBICopOwoKCSAgICB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CgoJICAgICAgYSA9IG1ha2VfcHRyKCk7CgkgICAgICBiID0gZm9vKGEpOwoKICAgICAgICAgICAgaWUsIHN3aWcgd2lsbCBhY2NlcHQgYSBSQ1B0cjxBPiBvYmplY3Qgd2hlcmUgYSAnQSAqJyBpcwogICAgICAgICAgICBleHBlY3RlZC4KCgkgICAgQWxzbywgd2hlbiB1c2luZyB2ZWN0b3JzCgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpIFJDUHRyPEE+OwoJICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9BKSBzdGQ6OnZlY3RvcjxSQ1B0cjxBPiA+OwoJCQoJICAgIHlvdSBjYW4gdHlwZQoKCSAgICAgIGEgPSBBKCk7CgkgICAgICB2ID0gdmVjdG9yX0EoMikKCSAgICAgIHZbMF0gPSBhCgogICAgICAgICAgICBpZSwgYW4gJ0EgKicgb2JqZWN0IGlzIGFjY2VwdGVkLCB2aWEgaW1wbGljaXQgY29udmVyc2lvbiwgCgkgICAgd2hlcmUgYSBSQ1B0cjxBPiBvYmplY3QgaXMgZXhwZWN0ZWQuIEFkZGl0aW9uYWxseQoKCSAgICAgIHggPSB2WzBdCgoJICAgIHJldHVybnMgKGFuZCBzZXRzICd4JyBhcykgYSBjb3B5IG9mIHZbMF0sIG1ha2luZyByZWZlcmVuY2UKCSAgICBjb3VudGluZyBwb3NzaWJsZSBhbmQgY29uc2lzdGVudC4KCgkgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyIGlzIGp1c3QgYSBjb2xsZWN0aW9ucyBvZiBuZXcvb2xkCgkgICAgdHJpY2tzLCBpbmNsdWRpbmcgJXR5cGVtYXBzIGFuZCB0aGUgbmV3ICVpbXBsaWNpdGNvbnYKCSAgICBkaXJlY3RpdmUuCgowMi8wMi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBidWdmaXggIzEzNTY1NzcsIGNoYW5nZWQgZG91YmxlPT5sdWFfbnVtYmVyIGluIGEgZmV3IHBsYWNlcy4KICAgICAgICAgICAgYWRkZWQgdGhlIHN0ZDo6cGFpciB3cmFwcGluZwoKMDEvMzAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgYW5kIHN0ZDo6d3N0cmluZyBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIG5vdyB1c2UKICAgICAgICAgICAgJW5hdHVyYWx2YXIgYnkgZGVmYXVsdCwgbWVhbmluZyB0aGV5IHdpbGwgbm93IGJlIHdyYXBwZWQgYXMgZXhwZWN0ZWQgaW4gYWxsIGxhbmd1YWdlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGVzZSB3ZXJlIHdyYXBwZWQgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgdGFyZ2V0IGxhbmd1YWdlIHN0cmluZy4KICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBhZGQgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kIHRvIHdyYXAgdGhlc2UgYXMgc3RyaW5nczoKCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMDEvMjgvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSAKCSAgICBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCjAxLzI0LzIwMDY6IG1tYXR1cwoJICAgIC0gQmV0dGVyIHN1cHBvcnQgZm9yIHRoZSAlbmF0dXJhbHZhciBkaXJlY3RpdmUsIG5vdyBpdAoJICAgICAgd29ya3Mgd2l0aCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcyB3ZWxsIGFzCgkgICAgICBKYXZhL0MjLgoJICAgICAgCgkgICAgICBOb3csIGl0IGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2xhc3MgdHlwZXM6CgoJICAgICAgICAlbmF0dXJhbHZhciBzdGQ6OnN0cmluZzsKCSAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KCSAgICAgIAogICAgICAgICAgICAgIHRoYXQgd2lsbCB0ZWxsIHN3aWcgdG8gdXNlIHRoZSAnbmF0dXJhbCcgd3JhcHBpbmcKICAgICAgICAgICAgICBtZWNoYW5pc20gdG8gYWxsIHN0ZDo6c3RyaW5nIGdsb2JhbCBhbmQgbWVtYmVyCiAgICAgICAgICAgICAgdmFyaWFibGVzLgoKCSAgICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgJWFsbG93ZXhjZXB0IGZlYXR1cmUgYWxvbmcgdGhlCiAgICAgICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2hpY2ggYWxsb3dzIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSB2YXJpYWJsZSBhY2Nlc3MgbWV0aG9kcy4gQWxzbywgYWRkCiAgICAgICAgICAgICAgdGhlICVleGNlcHRpb252YXIgZGlyZWN0aXZlIHRvIHNwZWNpZnkgYSBkaXN0aW50aWMKICAgICAgICAgICAgICBleGNlcHRpb24gbWVjaGFuaXNtIG9ubHkgZm9yIHZhcmlhYmxlcy4KCSAgICAgIAoJICAgIAoJICAgIC0gQWRkIG1vcmUgZG9jcyBmb3IgdGhlICVkZWxvYmplY3QgZGlyZWN0aXZlIHRvIG1hcmsgYSBtZXRob2QgYXMgYQoJICAgICAgZGVzdHJ1Y3RvciwgJ2Rpc293bmluZycgdGhlIGZpcnN0IGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCgkgICAgICAgICVuZXdvYmplY3QgY3JlYXRlX2ZvbzsKCSAgICAgICAgJWRlbG9iamVjdCBkZXN0cm95X2ZvbzsKCgkgICAgICAgIEZvbyAqY3JlYXRlX2ZvbygpIHsgcmV0dXJuIG5ldyBGb28oKTsgfQoJICAgICAgICB2b2lkIGRlc3Ryb3lfZm9vKEZvbyAqZm9vKSB7IGRlbGV0ZSBmb287IH0KCgkgICAgICBvciBpbiBhIG1lbWJlciBtZXRob2QgYXM6CgoJICAgICAgICAlZGVsb2JqZWN0IEZvbzo6ZGVzdHJveTsKCgkgICAgICAgIGNsYXNzIEZvbyB7CgkgICAgICAgIHB1YmxpYzoKCSAgICAgICAgICB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzO30KCgkgICAgICAgIHByaXZhdGU6CgkgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICB9OwoKCjAxLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgLSBSZW1vdmVkIHRoZSB0eXBlIHN3aWdfbHVhX2NvbW1hbmRfaW5mbyAmIHJlcGxhY2Ugd2l0aCBsdWFMX3JlZwoJICAgICAgKHdoaWNoIHRoZW4gYnJva2UgdGhlIGNvZGUpLCBmaXhlZCB0aGlzCgkgICAgLSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNhc3QgaW4gdGhlIHR5cGVtYXBzIGZvciBlbnVtJ3MKCSAgICAgIGR1ZSB0byB0aGUgaXNzdWUgdGhhdCBWQy5OZXQgd2lsbCBub3QgYWxsb3cgY2FzdGluZyBvZgoJICAgICAgYSBkb3VibGUgdG8gYW4gZW51bSBkaXJlY3RseS4gVGhlcmVmb3JlIGNhc3QgdG8gaW50IHRoZW4gdG8gZW51bQoJICAgICAgKHRoYW5rcyB0byBKYXNvbiBSZWdvIGZvciB0aGlzIG9ic2VydmF0aW9uKQoKMDEvMTYvMjAwNjogbW1hdHVzIChDaGFuZ2UgZGlzYWJsZWQuLi4gd2lsbCBiZSBiYWNrIGluIENWUyBzb29uKQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHJlZ2V4cCB2aWEgdGhlIGV4dGVybmFsIGxpYnJhcnkKCSAgICBSeFNwZW5jZXIuIFNXSUcgZG9lc24ndCByZXF1aXJlIHRoaXMgbGlicmFyeSB0byBjb21waWxlCgkgICAgYW5kL29yIHJ1bi4gQnV0IGlmIHlvdSBzcGVjaWZ5IC0td2l0aC1yeHNwZW5jZXIsIGFuZCB0aGUKCSAgICBsaWJyYXJ5IGlzIGZvdW5kIGR1cmluZyBpbnN0YWxsYXRpb24sIHRoZW4gc3dpZyB3aWxsIHVzZQoJICAgIGl0IGluIHRocmVlIHBsYWNlczoKCgkgICAgLSBJbiAlcmVuYW1lcyBydWxlcywgdmlhIHRoZSBuZXcgcnhzbWF0Y2ggcnVsZXMsIGZvciBleGFtcGxlOgoJICAgIAkgIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbmFtZT0iR1NMXy4qIikgIiI7CgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRub2RlVHlwZT0iZW51bSBHU0xfLioiKSAiIjsKCSAgICAJIAogICAgICAgICAgICAgIHJ4c21hdGNoIGlzIHNpbWlsYXIgdG8gdGhlIG1hdGNoIHJ1bGUsIGl0IGp1c3QgdXNlcwogICAgICAgICAgICAgIHRoZSBSeFNwZW5jZXIgcmVnZXhwIGxpYnJhcnkgdG8gZGVjaWRlIGlmIHRoZXJlIGlzIGEKICAgICAgICAgICAgICBtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCByZWdleHAuIEFzIHdpdGggdGhlIG1hdGNoCiAgICAgICAgICAgICAgcnVsZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgbmVnYXRlIHJ1bGUgbm90cnhzbWF0Y2guCgoJICAgIC0gSW4gdGhlICVyZW5hbWUgdGFyZ2V0IG5hbWUgdmlhIHRoZSByeHN0YXJnZXQgb3B0aW9uLCBmb3IgZXhhbXBsZToKCSAgICAJCSAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c3RhcmdldD0xKSAiR1NMXy4qIjsKCgkgICAgCXdoZXJlIHRoZSB0YXJnZXQgbmFtZSAiR1NMLioiIGlzIG5vdyB1bmRlcnN0b29kIGFzIGEKCSAgICAJcmVnZXhwIHRvIGJlIG1hdGNoZWQuICAKCSAgICAJIAogICAgICAgICAgICAtIEluIHRoZSBuZXcgZW5jb2RlciAicnhzcGVuY2VyIiwgd2hpY2ggbG9va3MgbGlrZToKCgkgICAgCSAgJShyeHNwZW5jZXI6W3JlZ2V4cF1bcmVwbGFjZV0pcwoKCSAgICAJd2hlcmUgInJlZ2V4cCIgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgInJlcGxhY2UiCgkgICAgCWlzIGEgc3RyaW5nIHVzZWQgYXMgYSByZXBsYWNlbWVudCwgd2hlcmUgdGhlIEAwLEAxLC4uLixAOQoJICAgIAlwc2V1ZG8gYXJndW1lbnRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKCSAgICAJY29ycmVzcG9uZGluZyBtYXRjaGluZyBpdGVtcyBpbiB0aGUgcmVnIGV4cHJlc3Npb24uCgoJICAgIAlGb3IgZXhhbXBsZToKCSAgICAJCSAgICAgIAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEhlbGxvICAgIC0+IAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEdTTEhlbGxvIC0+IEdTTEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtAMV0pcyAgICAgPC0gR1NMSGVsbG8gLT4gSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW2dzbEAxXSlzICA8LSBHU0xIZWxsbyAtPiBnc2xIZWxsbwoKCSAgICAJQW5vdGhlciBleGFtcGxlIGNvdWxkIGJlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiUobG93ZXJjYXNlKXMiLHNvdXJjZWZtdD0iJShyeHNwZW5jZXI6W0dTTF8oLiopXVtAMV0pcyIsJSRpc2Z1bmN0aW9uKSAiIjsKCgkgICAgCXdoaWNoIHRha2Ugb3V0IHRoZSBwcmVmaXggIkdTTF8iIGFuZCByZXR1cm5zIGFsbCB0aGUKCSAgICAJZnVuY3Rpb24gbmFtZXMgaW4gbG93ZXIgY2FzZXMsIGFzIGZvbGxvd2luZzoKCgkgICAgCSAgICB2b2lkIEdTTF9IZWxsbygpOyAgIC0+ICAgaGVsbG8oKTsKCSAgICAJICAgIHZvaWQgR1NMX0hpKCk7ICAgICAgLT4gICBoaSgpOwoJICAgIAkgICAgY29uc3QgaW50IEdTTF9NQVg7ICAtPiAgIEdTTF9NQVg7ICAvLyBubyBjaGFuZ2UsIGlzIG5vdCBhIGZ1bmN0aW9uCgkKCSAgICBXZSB1c2UgdGhlIFJ4U3BlbmNlciBhcyBhbiBpbml0aWFsIHRlc3QgYmVkIHRvCiAgICAgICAgICAgIGltcGxlbWVudGlvbiB3aGlsZSB3ZSBkZWNpZGUgd2hpY2ggbGlicmFyeSB3aWxsIGJlCiAgICAgICAgICAgIGZpbmFsbHkgYWRkZWQgdG8gc3dpZy4KCiAgICAgICAgICAgIFlvdSBjYW4gb2J0YWluIHRoZSBSeFNwZW5jZXIgbGlicmFyeSBmcm9tIAoJICAgIAoJICAgICAgaHR0cDovL2FyZ2xpc3QuY29tL3JlZ2V4IChVbml4KQoKCSAgICBvcgoJICAgICAKCSAgICAgIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMuaHRtbCAoV2luZG93cykKCgkgICAgT25jZSBpbnN0YWxsZWQsIHVzZSAibWFuIHJ4c3BlbmNlciIgdG8gZ2V0IG1vcmUgaW5mbwoJICAgIGFib3V0IHRoZSByZWdleHAgZm9ybWF0LCBvciBqdXN0IGdvb2dsZSByeHNwZW5jZXIuCgoJICAgIFNpbmNlIG5vdyB5b3UgY2FuIGVuYWJsZSB0aGUgcnhzbWF0Y2ggcnVsZXMgKHNlZSBhYm92ZSksCiAgICAgICAgICAgIHRoZSBzaW1wbGUgb3IgJ3wnIHN1cHBvcnQgZm9yIHRoZSBtYXRjaCBydWxlcwogICAgICAgICAgICAoMDEvMTIvMjAwNjogbW1hdHVzKSBpcyBkaXNhYmxlZC4gU3RpbGwsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggdGhlIHJ4c3BlbmNlciBsaWJyYXJ5LCB5b3UgY2FuIHJlLWVuYWJsZQogICAgICAgICAgICB0aGUgc2ltcGxlICdtYXRjaCBvcicgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAtRFNXSUdfVVNFX1NJTVBMRV9NQVRDSE9SLgoJICAKCjAxLzE2LzIwMDY6IG1tYXR1cwoJICAgIENoYW5nZSB0aGUgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIHVzZSB0aGUgcHJlZml4ICclJCcsIGFzIGluOgoJICAgIAoJICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJSRpc2Z1bmN0aW9uLCUkaXNtZW1iZXIpICIiOyAKCSAgIAkKICAgICAgICAgICAgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG90aGVyIHN3aWcgbWFjcm9zL2RpcmVjdGl2ZXMuCgowMS8xNC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgUnVieSBiYW5nISBtZXRob2RzIHZpYSBhIG5ldyAlYmFuZyBmZWF0dXJlLgoJICAgIEJhbmcgbWV0aG9kcyBlbmQgaW4gZXhjbGFtYXRpb24gcG9pbnRzIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZQoJICAgIG9iamVjdCBiZWluZyBwcm9jZXNzZWQgd2lsbCBiZSBtb2RpZmllZCBpbi1wbGFjZSBhcyAKCSAgICBvcHBvc2VkIHRvIGJlaW5nIGNvcGllZC4KCjAxLzEyLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBVcGRhdGVkIHRoZSBSdWJ5IG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKCSAgICBtZXRob2QgbmFtZXMgdG8gbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzIHVzaW5nIHRoZQoJICAgIG5ldyAlcmVuYW1lIGZ1bmN0aW9uYWxpdHkuCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBhbGlhc2VzIGZvciAnY2FzZScgZW5jb2RlcnMgdXNlZCB3aXRoICVyZW5hbWUvJW5hbWV3YXJuCgoJICAgICAgJSh1cHBlcmNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhFTExPX1dPUkxECgkgICAgICAlKGxvd2VyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG93b3JsZAoJICAgICAgJShjYW1lbGNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhlbGxvV29ybGQKCSAgICAgICUodW5kZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb193b3JsZAoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAtZHVtcF9wYXJzZV9tb2R1bGUgYW5kIC1kdW1wX3BhcnNlX3RvcCBvcHRpb25zLAoJICAgIHdoaWNoIGFyZSBzaW1pbGFyIHRvIC1kdW1wX21vZHVsZSBhbmQgLWR1bXBfdG9wLCBidXQgdGhleQoJICAgIGR1bXAgdGhlIG5vZGUgdHJlZXMganVzdCBhZnRlciBwYXJzaW5nLCBzaG93aW5nIG9ubHkgdGhlIAoJICAgIGF0dHJpYnV0ZXMgdmlzaWJsZSBhdCB0aGUgcGFyc2luZyBzdGFnZSwgYW5kIG5vdCB0aGUgYWRkZWQKCSAgICBsYXRlciBpbiB0eXBlbWFwLmN4eCwgYWxsb2NhdGUuY3h4LCBsYW5nLmN4eCBvciBlbHNld2hlcmUuCgkgICAgCgkgICAgQmVzaWRlcyBkZWJ1Z2dpbmcgcG9ycHVzZXMsIHRoZXNlIG9wdGlvbnMgYXJlIHZlcnkgdXNlZnVsCgkgICAgaWYgeW91IHBsYW4gdG8gdXNlICVyZW5hbWUgaW4gYW4gImFkdmFuY2Ugd2F5Iiwgc2luY2UgaXQKCSAgICBzaG93cyBvbmx5IGFuZCBhbGwgdGhlIG5vZGUncyBhdHRyaWJ1dGVzIHlvdSBjYW4gdXNlCgkgICAgaW5zaWRlIHRoZSBtYXRjaCBydWxlcy4KCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBwcmVkaWNhdGVzIHRvICVyZW5hbWUsIHNvLCB5b3UgZG9uJ3QgbmVlZCB0bwoJICAgICAgcmVtZW1iZXIsIGZvciBleGFtcGxlLCBob3cgdG8gbWF0Y2ggYSBtZW1iZXIgZnVuY3Rpb24uCgoJICAgICAgTm93IGl0IGlzIGVhc3ksIGZvciBleGFtcGxlIHRvIHVzZSB0aGUgJ3V0aXRsZScgZW5jb2RlciAKCSAgICAgIGluIGFsbCB0aGUgbWVtYmVyIG1ldGhvZHMsIHlvdSB0eXBlOgoKCSAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJWlzZnVuY3Rpb24sJWlzbWVtYmVyKSAiIjsKCgkgICAgICBvciB0byBpZ25vcmUgYWxsIHRoZSBlbnVtaXRlbXMgaW4gYSBnaXZlbiBjbGFzczoKCgkgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCAlaXNlbnVtaXRlbSwgJWNsYXNzbmFtZT0iTXlDbGFzcyIpICIiOyAgCgoJICAgICAgQXZhaWxhYmxlIHByZWRpY2F0ZXMgYXJlIChzZWUgc3dpZy5zd2cpOgoKICAgICAgICAgICAgICAgICVpc2VudW0gICAgICAgICAKCQklaXNlbnVtaXRlbSAgICAgCgkJJWlzYWNjZXNzICAgICAgIAoJCSVpc2NsYXNzICAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2NvbnN0cnVjdG9yICAKCQklaXNkZXN0cnVjdG9yICAgCgkJJWlzbmFtZXNwYWNlICAgIAoJCSVpc3RlbXBsYXRlICAgICAKCQklaXNjb25zdGFudCAgICAgCgkJCQkJCgkJJWlzdW5pb24gICAgICAgIAoJCSVpc2Z1bmN0aW9uICAgICAKCQklaXN2YXJpYWJsZSAgICAgCgkJJWlzaW1tdXRhYmxlICAgIAoJCQkJCQoJCSVpc3N0YXRpYyAgICAgICAKCQklaXNmcmllbmQgICAgICAgCgkJJWlzdHlwZWRlZiAgICAgIAoJCSVpc3ZpcnR1YWwgICAgICAKCQklaXNleHBsaWNpdCAgICAgCgkJJWlzZXh0ZXJuICAgICAgIAoJCQkJCQoJCSVpc21lbWJlciAgICAgICAKCQklaXNnbG9iYWwgCgkJJWlubmFtZXNwYWNlCgoJCSVpc3B1YmxpYyAgICAKCQklaXNwcm90ZWN0ZWQgCgkJJWlzcHJpdmF0ZSAgIAoJCQkJICAgICAKCQklY2xhc3NuYW1lICAgCgogICAgICAgICAgICAgIFRoZXNlIHByZWRpY2F0ZXMgY29ycmVzcG9uZCB0byBzcGVjaWZpYyAnbWF0Y2gnCiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLCB3aGljaCBzb21ldGltZXMgYXJlIG5vdCBhcyBldmlkZW50IGFzIHRoZQogICAgICAgICAgICAgIHByZWRpY2F0ZXMgbmFtZXMuCgoKICAgICAgICAgICAgLSBBZGQgdGhlIG9yICd8JyBvcGVyYXRpb24gaW4gJXJlbmFtZSBtYXRjaCwgZm9yCiAgICAgICAgICAgICAgZXhhbXBsZSB0byBjYXBpdGFsaXplIGFsbCB0aGUgY29uc3RhbnRzICglY29uc3RhbnQgb3IKICAgICAgICAgICAgICBjb25zdCBjZGVjbCk6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIsbWF0Y2g9ImNkZWNsfGNvbnN0YW50IiwlaXNpbW11dGFibGUpICIiOwogICAgICAgICAgICAgICAgCgoKMDEvMTIvMjAwNjogbWdvc3NhZ2UKCSAgICAtCVBhcnRpYWwgZml4ZWQgb2YgZXJyb3JzIHVuZGVyIEM4OSwgYnVnICMxMzU2NTc0CgkgICAgCShjb252ZXJ0ZWQgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUpCgkgICAgLQlBZGRlZCBwYXRjaGVzIGZyb20gbmVvbWFudHJhQHVzZXJzLnNmLm5ldCAjMTM3OTk4OCBhbmQgIzEzODgzNDMKCSAgICAJbWlzc2luZyBhICdyZXR1cm4nIHN0YXRlbWVudCBmb3IgZXJyb3IgY29uZGl0aW9ucwoJICAgIAlhbHNvIHVwZGF0ZWQgdGhlICVpbml0IGJsb2NrIGJ1ZyAjMTM1NjU4NgoJCSAKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlICd1dGl0bGUnIGVuY29kZXIsIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZAoJICAgICAgeW91ciBvd24gZW5jb2Rlci4gSSBhZGRlZCB0aGUgZW5jb2RlciBtZXRob2QgaW4gbWlzYy5jIAoJICAgICAgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBvdGhlcnMsIHRoZSBzYW1lIHdheSwgaW5zaWRlIGFueQoJICAgICAgdGFyZ2V0IGxhbmd1YWdlLgoJICAgICAgCgkgICAgICBXZWxsLCAndXRpdGxlJyBpcyB0aGUgcmV2ZXJzZSBvZiAnY3RpdGxlJywgaWU6CgoJICAgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7ICAtPiBDYW1lbENhc2U7CgkgICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIikgQ2FtZWxDYXNlOyAgIC0+IGNhbWVsX2Nhc2U7CgkJIAoKMDEvMTAvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQogICAgICAgICAgICBVcGRhdGVkIFJ1YnkgRXhjZXB0aW9uIGhhbmRsaW5nLiAgQ2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhyb3dzIGNsYXVzZXMsIAogICAgICAgICAgICBvciBhcmUgbWFya2VkIGFzICVleGNlcHRpb25jbGFzcywgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSByYl9lUnVudGltZUVycm9yLiAKICAgICAgICAgICAgVGhpcyBhbGxvd3MgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgdG8gYmUgcmV0dXJuZWQgdG8gUnVieSBhcyBleGNlcHRpb25zLiAKICAgICAgICAgICAgVGh1cyBpZiBhIEMrKyBtZXRob2QgdGhyb3dzIGFuIGluc3RhbmNlIG9mIE15RXhjZXB0aW9uLCB0aGUgY2FsbGluZyBSdWJ5IAogICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQgYmFjayBhIE15RXhjZXB0aW9uIG9iamVjdC4gIFRvIHNlZSBhbiBleGFtcGxlLCAKICAgICAgICAgICAgbG9vayBhdCBydWJ5L2V4YW1wbGVzL2V4Y2VwdGlvbl9jbGFzcy4KCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIAogICAgICAgICAgICAtIEFkZCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlLCB3aGljaCBjb21wbGVtZW50cyB0aGUgJWV4Y2VwdGlvbgoJICAgIGRpcmVjdGl2ZSBpbiBhIG1vcmUgYXV0b21hdGljIHdheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEUxKTsKCiAgICAgICAgICAgIHN3aWcgZ2VuZXJhdGVzIHRoZSBwcm9wZXIgdHJ5L2NhdGNoIGNvZGUgdG8gZGlzcGF0Y2ggRTEuCgkgICAgCgkgICAgQnV0IGlmIHlvdSBoYXZlOgoKCgkgICAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKCSAgICAgICAgICAgICAgIHRocm93IEUxKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgdGhyb3cgRTIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGllLCB3aGVyZSB0aGVyZSBpcyBubyBleHBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiB0aGUgZGVjbCwgeW91IAoJICAgIGVuZCB1cCBkb2luZzoKCQkgIAogICAgICAgICAgICAgICAlZXhjZXB0aW9uIGJhcmZvbyB7CQkJCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFMSkgewkuLi4gfQkJCQkgIAoJICAgICAgICAgfSBjYXRjaChFMikgewkuLi4gfQkJCQkgIAoJICAgICAgIH0JCQkJCgkgICAgCgkgICAgd2hpY2ggaXMgdmVyeSB0ZWRpb3VzLiBXZWxsLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIGRlZmluZXMKCSAgICB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRvIGNhdGNoLCBhbmQgZnJvbSBzd2lnOgogCQoJICAgICAgICVjYXRjaGVzKEUxLEUyKSBiYXJmb28oaW50IGkpOwoJICAgICAgIGludCBiYXJmb28oaW50IGkpOwoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byAKCgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKCSAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSAlY2F0Y2hlcyBsaXN0IGRvZXNuJ3QgaGF2ZSB0bwoJICAgIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdQoJICAgIGhhdmU6CgoJCXN0cnVjdCBFIHt9OwoJCXN0cnVjdCBFMSA6IEUge307CgkJc3RydWN0IEUyIDogRSB7fTsKCiAgCSAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKICAgICAgICAgICAgeW91IGNhbiBkZWZpbmUKCSAgICAgICAgCgkJJWNhdGNoZXMoRSkgYmFyZm9vKGludCBpKTsKCQoJICAgIGFuZCBzd2lnIHdpbGwgZ2VuZXJhdGUgYW4gYWN0aW9uIGNvZGUgZXF1aXZhbGVudCB0bwoKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUgJl9lKSB7IAoJCSAgIDxyYWlzZSBfZT47CgkJIH0JCgogICAgICAgICAgICBPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHNhdGlzZnkgdGhlIEMrKyByZXN0cmljdGlvbnMsCgkgICAgYW5kIHRoZSBjYXRjaGVzIGxpc3QgbXVzdCBiZSBjb21wYXRpYmxlIChub3QgdGhlIHNhbWUpCgkgICAgYXMgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdHlwZXMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgoKCSAgICBBbHNvLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gY2F0Y2ggdGhlCgkgICAgdW5rbm93biBleGNlcHRpb24gJy4uLicsIGZvciBleGFtcGxlOgoKCSAgICAgICAlY2F0Y2hlcyhFMSxFMiwuLi4pIGJhcmZvbyhpbnQpOwoKCSAgICBJbiBhbnkgY2FzZSwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSB3aWxsIGVtaXQgdGhlCgkgICAgY29kZSB0byBjb252ZXJ0IGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBlcnJvci9leGNlcHRpb24KICAgICAgICAgICAgdXNpbmcgdGhlICd0aHJvd3MnIHR5cGVtYXAuCgoJICAgIEZvciB0aGUgJy4uLicgY2FzZSB0byB3b3JrLCB5b3UgbmVlZCB0bwoJICAgIHdyaXRlIHRoZSBwcm9wZXIgdHlwZW1hcCBpbiB5b3VyIHRhcmdldCBsYW5ndWFnZS4gSW4gdGhlCgkgICAgVVRMLCB0aGlzIGxvb2tzIGxpa2U6CgoJICAgICAgJXR5cGVtYXAodGhyb3dzKSAoLi4uKSB7CgkgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJ1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgIH0KCjAxLzA5LzIwMDY6IG11dGFuZGl6CgkgICAgW0FsbGVncm9jbF0KCiAgICAgICAgICAgIEZpeGVzIGEgbnVtYmVyIG9mIFNFR1ZzIHByaW1hcmlseSBpbiB0aGUgaGFuZGxpbmcgb2YKICAgICAgICAgICAgdmFyaW91cyBhbm9ueW1vdXMgdHlwZXMuIEZvdW5kIGluIGEgcGFzcyB0aHJvdWdoIHRoZQogICAgICAgICAgICBzd2lnIHRlc3Qtc3VpdGUuIFN0aWxsIG1vcmUgdG8gZG8gaGVyZSwgYnV0IHRoaXMgaXMgYQogICAgICAgICAgICBnb29kIGNoZWNrcG9pbnQuCgogICAgICAgICAgICBBZGRzIC1jd3JhcCBhbmQgLW5vY3dyYXAgYXMgYW4gYWxsZWdyb2NsIHNwZWNpZmljCiAgICAgICAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gQ29udHJvbHMgZ2VuZXJhdGluZyBvZiBhIEMKICAgICAgICAgICAgd3JhcHBlciBmaWxlIHdoZW4gd3JhcHBpbmcgQyBjb2RlLiBCeSBkZWZhdWx0IG9ubHkgYQogICAgICAgICAgICBsaXNwIGZpbGUgaXMgY3JlYXRlZCBmb3IgQyBjb2RlIHdyYXBwaW5nLgoKICAgICAgICAgICAgRG9jIHVwZGF0ZXMgZm9yIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBmaXhlcyBhcwogICAgICAgICAgICBwb2ludGVkIG91dCBvbiBzd2lnLWRldmVsCgowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHVuc2lnbmVkIGxvbmcgbG9uZyBhbmQgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYgdHlwZW1hcHMKICAgICAgICAgICAgLSBCdWcgIzEzOTgzOTQgIHdpdGggcGF0Y2ggZnJvbSBEcmllcyBEZWNvY2sKCjAxLzA2LzIwMDY6IG1tYXR1cwoJICAgIEFkZCAnbmFtZWQnIHdhcm5pbmcgY29kZXMsIG5vdyBpbiBhZGRpdGlvbiB0bzoKCSAgICAKCSAgICAgICV3YXJuZmlsdGVyKDgxMyk7CgkgICAKCSAgICB5b3UgY2FuIHVzZQoKCSAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX0pBVkFfTVVMVElQTEVfSU5IRVJJVEFOQ0UpOwoKCSAgICBqdXN0IHVzZSB0aGUgc2FtZSBjb2RlIG5hbWUgZm91bmQgaW4gIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmggCgkgICAgcGx1cyB0aGUgJ1NXSUcnIHByZWZpeC4KCgkgICAgSWYgYSBkZXZlbG9wZXIgYWRkcyBhIG5ldyB3YXJuaW5nIGNvZGUsIHRoZSBMaWIvc3dpZ3dhcm4uc3dnIGZpbGUKICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nIHRoZSB0b3AgbGV2ZWwgbWFrZS4KCjAxLzA1LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBSZWltcGxlbWVudGVkIG9iamVjdCB0cmFja2luZyBmb3IgUnVieS4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gd29ya3MKCSAgICBieSBleHBhbmRpbmcgdGhlIHN3aWdfY2xhc3Mgc3RydWN0dXJlIGZvciBSdWJ5IGJ5IGFkZGluZyBhIHRyYWNrT2JqZWN0cwoJICAgIGZpZWxkLiAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0L3Vuc2V0IHZpYSAldHJhY2tvYmplY3RzIGFzIGV4cGxhaW5lZAoJICAgIGluIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24uICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIGlzIG1vcmUgcm9idXN0CgkgICAgYW5kIHRha2VzIGxlc3MgY29kZSB0byBpbXBsZW1lbnQuCgkJCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWV4dGVuZCBhbmQgc3RhdGljIGNvbnN0IGludGVncmFsIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmFyID0gNDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluZm8gZm9yIG9sZCBhbmQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBlbnRpcmUgbm9kZSB0cmVlLCBpbmNsdWRpbmcgc3lzdGVtIG5vZGVzICAgIAogICAgIAkgICAgLWR1bXBfbW9kdWxlICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIG1vZHVsZSBub2RlIHRyZWUsIGF2b2lkaW5nIHN5c3RlbSBub2RlcyAgICAgCiAgICAgCSAgICAtZHVtcF9jbGFzc2VzICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kdW1wX3R5cGVkZWYgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBhbmQgdHlwZWRlZnMgZm91bmQgaW4gdGhlIGludGVyZmFjZQogICAgIAkgICAgLWR1bXBfdGFncyAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZGVidWdfdHlwZW1hcCAgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHR5cGVtYXBzCQkJICAgICAgIAogICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHRlbXBsYXRlcwkJCSAgICAgICAgCgoJICAtIEFkZCB0aGUgZmFrZXZlcnNpb24uIElmIHlvdSBoYXZlIGEgcHJvamVjdCB0aGF0IHVzZXMKICAgICAgICAgICAgY29uZmlndXJlL3NldHVwLnB5LCBvciBhbm90aGVyIGF1dG9tYXRpYyBidWlsZGluZyBzeXN0ZW0KICAgICAgICAgICAgYW5kIHJlcXVpcmVzIGEgc3BlY2lmaWMgc3dpZyB2ZXJzaW9uLCBsZXQgc2F5IDEuMy4yMiAKCSAgICB5b3UgY2FuIHVzZToKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIKCgkgICAgIG9yCiAKICAgICAgICAgICAgICAgc3dpZyAtZmFrZXZlcnNpb24gMS4zLjIyCgogICAgICAgICAgICAgYW5kIHRoZW4gc3dpZyAtdmVyc2lvbiB3aWxsIHJlcG9ydCAxLjMuMjIgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbi4KCgkgICAgIFR5cGljYWwgdXNlIHdvdWxkIGJlCgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiIC4vY29uZmlndXJlIAkgICAgIAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBvcHRpb24vZm9ybWF0IHN1cHBvcnQgdG8gJXJlbmFtZSBhbmQgJW5hbWV3YXJuLgkKCSAgICBOb3cgJW5hbWV3YXJuIGNhbiBmb3JjZSByZW5hbWluZywgZm9yIGV4YW1wbGU6CgoJICAgICAgJW5hbWV3YXJuKCIzMTQ6IGltcG9ydCBpcyBhIGtleXdvcmQiLHJlbmFtZT0iXyVzIikgImltcG9ydCI7CgkgICAgCgkgICAgYW5kIHJlbmFtZSBjYW4gYWxzbyBzdXBwb3J0IGZvcm1hdCBmb3JtczoKCgkgICAgICAgJXJlbmFtZSgic3dpZ18lcyIpIGltcG9ydDsKCgkgICAgTm93LCBzaW5jZSB0aGUgZm9ybWF0IGlzIHByb2Nlc3NlZCB2aWEgc3dpZyBQcmludGYsIHlvdQoJICAgIGNhbiB1c2UgZW5jb2RlcnMgYXMgZm9sbG93czoKCgkgICAgICAgJXJlbmFtZSgiJSh0aXRsZSlzIikgIGltcG9ydDsgICAgIC0+IEltcG9ydAoJICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIpICBpbXBvcnQ7ICAgICAtPiBJTVBPUlQKCSAgICAgICAlcmVuYW1lKCIlKGxvd2VyKXMiKSAgSW1wb3J0OyAgICAgLT4gaW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7IC0+IENhbWVsQ2FzZQoJICAgICAgIAoJICAgIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhZGQgbW9yZSBlbmNvZGVycywgYXMgdGhlIAoJICAgIGV4cGVjdGVkIG9uZSBmb3IgcmVndWxhciBleHByZXNzaW9ucy4gCgoJICAtIEFkZCB0aGUgYWJvdmUgJ2N0aXRsZScgZW5jb2Rlciwgd2hpY2ggZG9lcyB0aGUgY2FtZWwgY2FzZToKCgkgICAgICAgIGNhbWVsX2Nhc2UgLT4gQ2FtZWxDYXNlCiAgCgkgIC0gQWxzbywgd2hpbGUgd2UgZ2V0IHRoZSByZWdleHAgc3VwcG9ydCwgYWRkIHRoZSAnY29tbWFuZCcgZW5jb2RlciwKICAgICAgICAgICAgeW91IGNhbiB1c2UgaXQgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOnNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgKXMiKSBpbXBvcnQ7IAoKCSAgICB0aGVuIHN3aWcgd2lsbCBwb3BlbiB0aGUgY29tbWFuZAoJICAgIAoJCSJzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IGltcG9ydCIKCQkKICAgICAgICAgICAgc2VlIGJlbG93IGZvciBhbm9ueW1vdXMgcmVuYW1lcyBmb3IgYmV0dGVyIGV4YW1wbGVzLgkJCgogICAgICAgICAgLSBUaGUgcmVuYW1lIGRpcmVjdGl2ZSBub3cgYWxzbyBhbGxvd3M6CgoJICAgIC0gc2ltcGxlIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgYSB0eXBlIG1hdGNoCgkgICAgICBoYXBwZW4sIGZvciBleGFtcGxlCgoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaD0iZW51bWl0ZW0iKSBoZWxsbzsKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgkJIGludCBoZWxsbygpICAtPiAgaGVsbG87IAoKCSAgICAtIGV4dGVuZGVkIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgdGhlICdleHRlbmRlZCBhdHRyaWJ1dGUnIG1hdGNoCgkgICAgICBvY2N1cnJlZCwgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHNhbWUgYXMgc2ltcGxlIG1hdGNoIAkJCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgoJICAgICAgIE5vdGUgdGhhdCB0aGUgc3ltYm9sICckJyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYXR0cmlidXRlIG5hbWUgaW4KCSAgICAgICBhICdyZWN1cnNpdmUnIHdheSwgZm9yIGV4YW1wbGU6CgoJCSAvLyBtYXRjaCBvbmx5IGhlbGxvIGluICdlbnVtIEhlbGxvJwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAgLy8gbWF0Y2gKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoKICAgICAgICAgICAgICAgaGVyZSwgZm9yIEhlbGxvOjpoaSwgdGhlICJwYXJlbnROb2RlIiBpcyAiSGVsbG8iLCBhbmQgaXRzICJ0eXBlIgogICAgICAgICAgICAgICBpcyAiZW51bSBIZWxsbyIuCgkgICAgICAgCgkgICAgICAgCiAgICAgICAgICAgIC0gQW5vbnltb3VzIHJlbmFtZXM6IHlvdSBjYW4gdXNlICdhbm9ueW1vdXMnIHJlbmFtZSBkaXJlY3RpdmVzLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyBpbiBIZWxsbwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSAiIjsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgSGksIEhlbGxvICAgLy8gbWF0Y2ggYm90aAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgkJIAoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyAKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgIiI7IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGl0ZW1zIGluIGdpdmVuIGNvbW1hbmQgKHNsb29vb3csIGJ1dC4uLikKCQkgJXJlbmFtZSglKGNvbW1hbmQ6PG15IGV4dGVybmFsIGNtZD4pcykgIiI7IAoKCQoJICAgICAgQW5vbnltb3VzIHJlbmFtZXMgd2l0aCBjb21tYW5kcyBjYW4gYmUgdmVyeSBwb3dlcmZ1bCwgc2luY2UgeW91CgkgICAgICBjYW4gJ291dHNvdXJjZScgYWxsIHRoZSByZW5hbWluZyBtZWNoYW5pc20gKG9yIHBhcnQgb2YgaXQpIHRvIGFuCgkgICAgICBleHRlcm5hbCBwcm9ncmFtOgoJICAgICAgCgkgICAgICAgIC8vIFVwcGVyY2FzZSBhbGwgKGFuZCBvbmx5KSB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoICdpJwoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICcvXmkve3ByaW50IHRvdXBwZXIoJDEpfScgPDw8KXMiKSAiIjsgICAKCSAgICAgICAKCSAgICAgICAgaW50IGltcG9ydGVkKCkgLT4gSU1QT1JURUQ7CgkgICAgICAgIGludCBoZWxsbygpICAgIC0+IGhlbGxvCgoJICAgICAgTm90ZSB0aGF0IGlmIHRoZSAnY29tbWFuZCcgZW5jb2RlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgc3dpZwoJICAgICAgdW5kZXJzdGFuZHMgdGhhdCBubyByZW5hbWUgaXMgbmVjZXNzYXJ5LgoKCSAgICAgIEFsc28gbm90ZSB0aGF0ICVyZW5hbWUgJ3Bhc3NlcycgdGhlIG1hdGNoZWQgbmFtZS4gRm9yIGV4YW1wbGUsIGluCgkgICAgICB0aGlzIGNhc2UKCgkgICAgICAgIG5hbWVzcGFjZSBuczEgewoJCSAgaW50IGZvbygpOwoJCX0KCgkgICAgICAgIG5hbWVzcGFjZSBuczIgewoJCSAgaW50IGJhcigpOwoJCX0KCgkgICAgICB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBvbmx5IHJlY2VpdmVzICJmb28iIGFuZCAiYmFyIi4gSWYgbmVlZGVkLAoJICAgICAgaG93ZXZlciwgeW91IGNhbiByZXF1ZXN0IHRoZSAnZnVsbG5hbWUnIAoJICAgICAgIAkKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnYXdrICcvbnMxOjove2w9c3BsaXQoJDEsYSwiOjoiKTsgcHJpbnQgdG91cHBlcihhW2xdKX0nJyA8PDwpcyIsZnVsbG5hbWU9MSkgIiI7ICAgCiAgICAgICAgICAgICAgICAKCQluczE6OmZvbyAtPiBGT08KCQluczI6OmJhciAtPiBiYXIJCgkKCSAgICAtIE1peGluZyBlbmNvZGVycyBhbmQgbWF0Y2hpbmc6IG9mIGNvdXJzZSwgeW91IGNhbiBkbyBtaXggY29tbWFuZHMKCSAgICAgIGFuZCBtYXRjaCBmaWVsZHMsIGZvciBleGFtcGxlOgoKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZm5jcz4pIixtYXRjaD0iY2RlY2wiKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXM+KSIsbWF0Y2g9ImVudW1pdGVtIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zIGluc2lkZSBhIGNsYXNzPikiLG1hdGNoPSJlbnVtaXRlbSIsCgkJICAgICAgICBtYXRjaCRwYXJlbnROb2RlJHBhcmVudE5vZGUkbm9kZVR5cGU9ImNsYXNzIikgIiI7CgkJCgkgICAgICBVc2UgInN3aWcgLWR1bXBfcGFyc2VfbW9kdWxlIiB0byBzZWUgdGhlIGF0dHJpYnV0ZSBuYW1lcyB5b3UgY2FuIHVzZSB0bwoJICAgICAgbWF0Y2ggYSBzcGVjaWZpYyBjYXNlLgoJCiAgICAgICAgICAgIC0gJ3NvdXJjZWZtdCcgYW5kICd0YXJnZXRmbXQnOiBzb21ldGltZXMgeW91IG5lZWQgdG8KICAgICAgICAgICAgICBwcm9jZXNzIHRoZSAnc291cmNlJyBuYW1lIGJlZm9yZSBjb21wYXJpbmcsIGZvciBleGFtcGxlCgoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIpICJlbXB0eSI7CgoJICAgICAgdGhlbiBpZiB5b3UgaGF2ZQoKCSAgICAgICAgaW50IEVtcHR5KCk7ICAvLyAiRW1wdHkiIGlzIHRoZSBzb3VyY2UgCgkJCgkgICAgICB5b3Ugd2lsbCBnZXQgdGhlIGtleXdvcmQgd2FybmluZyBzaW5jZSAnRW1wdHknIHdpbGwgYmUKCSAgICAgIGxvd2VyIGNhc2VkLCB2aWEgdGhlIHNvdXJjZWZtdD0iJShsb3dlcilzIiBvcHRpb24sCgkgICAgICBiZWZvcmUgYmVlbiBjb21wYXJlZCB0byB0aGUgJ3RhcmdldCcgImVtcHR5Ii4KCgkgICAgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsICd0YXJnZXRmbXQnIG9wdGlvbiB0byBwcm9jZXNzIHRoZQoJICAgICAgJ3RhcmdldCcgYmVmb3JlIGNvbXBhcmluZy4KCgkgICAgLSBjb21wbGVtZW50aW5nICdtYXRjaCc6IHlvdSBjYW4gdXNlICdub3RtYXRjaCcsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiLG5vdG1hdGNoPSJuYW1lc3BhY2UiKSAiZW1wdHkiOwoKCSAgICAgIGhlcmUsIHRoZSBuYW1lIHdhcm5pbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3ltYm9scyBleGNlcHQgbmFtZXNwYWNlcy4KCSAgICAKICAgICAgCQoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZ2NqIGFuZCBKYXZhIC0+IDx0YXJnZXQgbGFuZ3VhZ2U+IG1lY2hhbmlzbS4KCgkgICAgU2VlCWV4YW1wbGVzIGluOiAgCgkgIAoJCUV4YW1wbGVzL3B5dGhvbi9qYXZhCgkJRXhhbXBsZXMvcnVieS9qYXZhCgkJRXhhbXBsZXMvdGNsL2phdmEKCiAgICAgICAgICAgIHRvIHNlZSBob3cgdG8gdXNlIGdjaitzd2lnIHRvIGV4cG9ydCBqYXZhIGNsYXNzZXMgaW50bwogICAgICAgICAgICBweXRob24vcnVieS90Y2wuCgkgICAgCgkgICAgVGhlIGlkZWEgaXMgdG8gcHV0IGFsbCB0aGUgY29tbW9uIGNvZGUgZm9yIGdjaiBpbnNpZGUKCgkgICAgICAgICAgTGliL2djagoKICAgICAgICAgICAgYW5kIGxvY2FsaXplIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMganN0cmluZywgYXMgY2FuIGJlIGZvdW5kCiAgICAgICAgICAgIGluCgoJICAgICAgICAgTGliL3B5dGhvbi9qc3RyaW5nLmkKCSAgICAgICAgIExpYi9ydWJ5L2pzdHJpbmcuaQoJICAgICAgICAgTGliL3RjbC9qc3RyaW5nLmkKCiAgICAgICAgICAgIFVzaW5nIHRoZSBVVEwsIHRoaXMgaXMgdmVyeSBlYXN5LCBhbmQgdGhlIHBlcmwgdmVyc2lvbiBmb3IKICAgICAgICAgICAganN0cmluZy5pIHdpbGwgYmUgbmV4dC4KCQkgCSAgICAKCjEyLzI5LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgY29weWN0b3IgZmVhdHVyZS9kaXJlY3RpdmUvb3B0aW9uIHRvIGVuYWJsZSB0aGUgYXV0b21hdGljCgkgICAgZ2VuZXJhdGlvbiBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIGFzIGluOgoKCSAgICAgICVjb3B5Y3RvciBBOwoKCSAgICAgIHN0cnVjdCBBIHsKCiAgICAgICAgICAgICAgfTsKCgkgICAgdGhlbiB0aGlzIHdpbGwgd29yawoKCSAgICAgIGExID0gQSgpOwoJICAgICAgYTIgPSBBKGExKTsKCgkgICAgQWxzbywgc2luY2UgaXQgaXMgYSBmZWF0dXJlLCBpZiB5b3UganVzdCB0eXBlCgoJICAgICAgJWNvcHljdG9yOwoKCSAgICB0aGF0IHdpbGwgIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gZm9yIGFsbCB0aGUKCSAgICBjbGFzc2VzLiBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgc3dpZyAtY29weWN0b3IgLWMrKyAuLi4KCgkgICAgTm90ZXM6IAoKCSAgICAxLi0gVGhlIGZlYXR1cmUgb25seSB3b3JrcyBpbiBDKysgbW9kZS4KCgkgICAgMi4tIFRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgdGhlIGNvcHkgY29uc3RydWN0b3Igd2lsbAoJICAgICAgICB1c3VhbGx5IHByb2R1Y2Ugb3ZlcmxvYWRpbmcuIEhlbmNlLCBpZiB0aGUgdGFyZ2V0CgkgICAgICAgIGxhbmd1YWdlIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGluZywgYSBzcGVjaWFsIG5hbWUKCSAgICAgICAgd2lsbCBiZSB1c2VkIChBX2NvcHkpLgoJICAgIAoJICAgIDMuLSBGb3IgdGhlIG92ZXJsb2FkaW5nIHJlYXNvbnMgYWJvdmUsIGl0IGlzIHByb2JhYmx5IG5vdAogICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBmbGFnIHdoZW4sIGZvciBleGFtcGxlLCB5b3UgYXJlCgkJdXNpbmcga2V5d29yZHMgaW4gUHl0aG9uLgoKICAgICAgICAgICAgNC4tIFRoZSBjb3B5Y3RvciBhdXRvbWF0aWMgbWVjaGFuaXNtIGZvbGxvd3MgbW9yZSBvciBsZXNzCgkgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG1lY2hhbmlzbSwKCSAgICAgICAgaS5lLiwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZQoJICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCBvciBpZiB0aGVyZSBpcyBhIHBlcnRpbmVudCBub24tcHVibGljIAoJCWNvcHkgY3RvciBpbiB0aGUgY2xhc3Mgb3IgaXRzIGhpZXJhcmNoeS4KCgkJSGVuY2UsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGNvbXBsZXRlIHRoZQoJCWNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByb3BlciBub24tcHVibGljIGNvcHkgY3RvcgoJCXRvIGF2b2lkIGEgd3JvbmcgY29uc3RydWN0b3IgYWRkaXRpb24uCgkJCiAgICAgICAgICAtIEZpeCBmZWF0dXJlcy9yZW5hbWUgZm9yIHRlbXBsYXRlcyBjdG9yL2R0b3IgYW5kIG90aGVyCiAgICAgICAgICAgIHRoaW5ncyBhcm91bmQgd2hpbGUgYWRkaW5nIHRoZSBjb3B5Y3RvciBtZWNoYW5pc20uCgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICdtYXRjaCcgb3B0aW9uIHRvIHR5cGVtYXBzLiBBc3N1bWUgeW91IGhhdmU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoKCSAgICB0aGVuIGlmIHlvdSBkbwogCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CgoJICAgIHN3aWcgd2lsbCAnb3ZlcmxvYWQgdGhlICdpbicgdHlwZW1hcCwgYnV0IHRoZSAnZnJlZWFyZycgCgkgICAgdHlwZW1hcCB3aWxsIGJlIGFsc28gYXBwbGllZCwgZXZlbiB3aGVuIHRoaXMgaXMgd3JvbmcuIFRoZSBvbGQKCSAgICBzb2x1dGlvbnMgaXMgdG8gd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQogIAkgICAgICAldHlwZW1hcChmcmVlYWcpIEEgKiAiIgoKCSAgICBvdmVybG9hZCAnZnJlZWFyZycgd2l0aCBhbiBlbXB0eSBkZWZpbml0aW9uLgoKCSAgICBUaGUgcHJvYmxlbSBpcywgaG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgeW91IG5lZWQKCSAgICB0byBkbyB0aGF0IHVudGlsIHlvdSBzdGFydCBnZXR0aW5nIGJyb2tlbiBDKysgY29kZSwgb3IKCSAgICB3b3JzZSwgYnJva2VuIHJ1bnRpbWUgY29kZS4KCgkgICAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgaW5mYW1vdXMgJ3R5cGVjaGVjaycgdHlwZW1hcCwKCSAgICB3aGljaCBhbHdheXMgY29uZnVzZXMgcGVvcGxlLCBzaW5jZSB0aGUgZmlyc3QgdGhpbmcgeW91IGRvCgkgICAgaXMgdG8ganVzdCB3cml0ZSB0aGUgJ2luJyB0eXBlbWFwLgoKCSAgICBUaGUgJ21hdGNoJyBvcHRpb24gc29sdmVzIHRoZSBwcm9ibGVtLCBhbmQgaWYgaW5zdGVhZCB5b3Ugd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcsbWF0Y2g9ImluIikgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgkgICAgICAldHlwZW1hcCh0eXBlY2hlY2ssbWF0Y2g9ImluIixwcmVjZWRlbmNlLi4uKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgkgICAgaXQgd2lsbCB0ZWxsIHN3aWcgdG8gYXBwbHkgdGhlICdmcmVlYXJnL3R5cGVjaGVjaycKCSAgICB0eXBlbWFwcyBvbmx5IGlmIHRoZXkgJ21hdGNoJyB0aGUgdHlwZSBvZiB0aGUgJ2luJwoJICAgIHR5cGVtYXAuIFRoZSBzYW1lIGNhbiBiZSBkb25lIHdpdGggb3RoZXIgdHlwZW1hcHMgYXM6CgoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JvdXQpIFNXSUdUWVBFICogey4uLn0KCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yZnJlZSxtYXRjaD0iZGlyZWN0b3JvdXQiKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICduYXR1cmFsdmFyJyBvcHRpb24vbW9kZS9mZWF0dXJlIHRvIHRyZWF0IG1lbWJlcgoJICAgIHZhcmlhYmxlcyBpbiBhIG1vcmUgbmF0dXJhbCB3YXksIGllLCBzaW1pbGFyIHRvIHRoZSBnbG9iYWwKCSAgICB2YXJpYWJsZSBiZWhhdmlvci4KCgkgICAgWW91IGNhbiB1c2UgaXQgaW4gYSBnbG9iYWwgd2F5IHZpYSB0aGUgY29tbWFuZCBsaW5lCgoJICAgICAgc3dpZyAtbmF0dXJhbHZhciAuLi4KCgkgICAgb3IgdGhlIG1vZHVsZSBtb2RlIG9wdGlvbgogCgkgICAgICAlbW9kdWxlKG5hdHVyYWx2YXI9MSkKCgkgICAgYm90aCBmb3JtcyBtYWtlIHN3aWcgdHJlYXQgYWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzIGluIHRoZQoJICAgIHNhbWUgd2F5IGl0IHRyZWF0cyBnbG9iYWwgdmFyaWFibGVzLiAKCgkgICAgQWxzbywgeW91IGNhbiB1c2UgaXQgaW4gYSBjYXNlIGJ5IGNhc2UgYXBwcm9hY2ggZm9yCgkgICAgc3BlY2lmaWMgbWVtYmVyIHZhcmlhYmxlcyB1c2luZyB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgJW5hdHVyYWx2YXIgQmFyOjpzOwoJICAgIAoJICAgIFRoZW4sIGluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZToKCgkgICAgICAgc3RkOjpzdHJpbmcgczsKCSAgICAgICBzdHJ1Y3QgQmFyIHsKCQkgc3RkOjpzdHJpbmcgczsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHlvdSBjYW4gZG86ICAKCgkgICAgICAgYiA9IEJhcigpCgkgICAgICAgYi5zID0iaGVsbG8iCgkgICAgICAgY3Zhci5zID0gImhlbGxvIgoJICAgICAgIAoJICAgICAgIGlmIChiLnMgIT0gY3Zhci5zKToKCSAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKCgkJICAKICAgICAgICAgICAgVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCB0aGUKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gZm9yY2luZyB0aGUgdXNlIG9mIHRoZSAKICAgICAgICAgICAgY29uc3QgU1dJR1RZUEUmIChDKyspL1NXSUdUWVBFIChDKSB0eXBlbWFwcyBmb3IgdGhlCiAgICAgICAgICAgIGdldC9zZXQgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBTV0lHVFlQRSAqIHR5cGVtYXBzLgoJICAgIEhlbmNlLCBmb3IgJ25hdHVyYWx2YXInIHRvIHdvcmssIGVhY2ggdGFyZ2V0IGxhbmd1YWdlCgkgICAgbXVzdCBpbXBsZW1lbnQgJ3R5cGVtYXAoaW4vb3V0KSBjb25zdCBUeXBlJicgcHJvcGVybHkuCgoJICAgIFRoZSAnbmF0dXJhbHZhcicgb3B0aW9uIHJlcGxhY2VzIG9yIG1ha2VzIHdvcmthcm91bmRzIHN1Y2ggIGFzOgoJICAgIAoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgIHVubmVjZXNzYXJ5LgoKCSAgICBOb3RlMTogSWYgeW91ciBpbnRlcmZhY2UgaGFzIG90aGVyIGtpbmRzIG9mIHdvcmthcm91bmRzIHRvCgkgICAgZGVhbCB3aXRoIHRoZSBvbGQgJ3VubmF0dXJhbCcgd2F5IHRvIGRlYWwgd2l0aCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgKHJldHVybmluZy9leHBlY3RpbmcgcG9pbnRlcnMpLCB0aGUKCSAgICAnbmF0dXJhbHZhcicgb3B0aW9uIGNvdWxkIGJyZWFrIHRoZW0uCgkgICAgCgkgICAgTm90ZTI6IHRoZSBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB1bm5hbWVkIHR5cGVzLCBzdWNoCgkgICAgYXMgdW5uYW1lZCBuZXN0ZWQgdW5pb25zLgoJICAgIAoJICAKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIG1vcmUgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMgZm9yIHRoZSB0eXBlbWFwCiAgICAgICAgICAgIGxpYnJhcmllcy4KCgkgICAgSW4gdGhlIHBhc3QsIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB5b3Ugd291bGQgZG8gY2hlY2tpbmcgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgaWYgKENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKSAhPSAtMSkgewoJICAgICAgICAvLyBzdWNjZXNzCiAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gZXJyb3IKCSAgICAgIH0KCgkgICAgTm93IHRoZSByZXN1bHQgc3RhdGUgY2FuIGNhcnJ5IG1vcmUgaW5mb3JtYXRpb24sCgkgICAgaW5jbHVkaW5nOgoKCSAgICAgIC0gRXJyb3Igc3RhdGU6IGxpa2UgdGhlIG9sZCAtMS8wLCBidXQgd2l0aCBlcnJvciBjb2RlcyBmcm9tIHN3aWdlcnJvcnMuc3dnLgoKCSAgICAgICAgIGludCByZXMgPSBDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncyk7CgkJIGlmIChTV0lHX0lzT0socmVzKSkgewoJCSAgIC8vIHN1Y2Nlc3MgY29kZQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJICAgU1dJR19FcnJvcihyZXMpOyAvLyByZXMgY2FycmllcyB0aGUgZXJyb3IgY29kZQogICAgICAgICAgICAgICAgIH0KCgkgICAgICAtIENhc3QgcmFuazogd2hlbiByZXR1cm5pbmcgYSBzaW1wbGUgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgY29udmVyc2lvbiwgeW91IGp1c3QgcmV0dXJuIFNXSUdfT0ssIGJ1dCBpZiB5b3UgbmVlZAogICAgICAgICAgICAgICAgdG8gZG8gYSAnY2FzdCcsIHlvdSBjYW4gYWRkIHRoZSBjYXN0aW5nIHJhbmssIGllOgoJCQoJCSAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfT0s7CgkJICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSAoZG91YmxlKSBQeUludF9Bc0xvbmcob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX09LKTsJCSAgICAKICAgICAgICAgICAgICAgICAgfQoJCQoJCWxhdGVyLCB0aGUgY2FzdGluZyByYW5rIGlzIHVzZWQgdG8gcHJvcGVybHkgZGlzcGF0Y2gKCQl0aGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiwgZm9yIGV4YW1wbGUuIFRoaXMgb2YgY291cnNlCgkJcmVxdWlyZXMgeW91ciBsYW5ndWFnZSB0byBzdXBwb3J0IGFuZCB1c2UgdGhlIG5ldwoJCWRpc3BhdGNoIGNhc3QvcmFuayBtZWNoYW5pc20gKE5vdyBtYWlubHkgc3VwcG9ydGVkIGluCgkJcGVybCBhbmQgcHl0aG9uLCBhbmQgZWFzaWx5IGV4cGFuZGFibGUgdG8gcnVieSBhbmQgdGNsKS4KCSAgICAgIAoJICAtIFtVVExdIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3ICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzLgoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSBDKysgaW1wbGljaXQgY29udmVyc2lvbiBtZWNoYW5pc20sIHdoaWNoCiAgICAgICAgICAgIHJlcXVpcmVkIHNvbWUgbW9kaWZpY2F0aW9ucyBpbiBwYXJzZXIueSAodG8gcmVjb2duaXplCiAgICAgICAgICAgICdleHBsaWNpdCcpIGFuZCBvdmVybG9hZC5jeHggKHRvIHJlcGxhY2UgJGltcGxpY2l0Y29udiBhcwogICAgICAgICAgICBuZWVkZWQpLgoJICAgIAoJICAgIFN0aWxsLCByZWFsIHN1cHBvcnQgaW4gZWFjaCB0YXJnZXQgbGFuZ3VhZ2UgcmVxdWlyZXMgZWFjaAoJICAgIHRhcmdldCBsYW5ndWFnZSB0byBiZSBtb2RpZmllZC4gUHl0aG9uIHByb3ZpZGVzIGFuIGV4YW1wbGUsCiAgICAgICAgICAgIHNlZSBiZWxvdy4KCgoJICAtIEFkZCBzdXBwb3J0IGZvciBuYXRpdmUgQysrIGltcGxpY2l0IGNvbnZlcnNpb25zLCBpZSwgaWYgeW91CiAgICAgICAgICAgIGhhdmUKCgkgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKCgkgICAgICAgIHN0cnVjdCBBIHsKCQkgICBpbnQgaWk7CgkJICAgQSgpIHtpaSA9IDE7fQoJCSAgIEEoaW50KSB7aWkgPSAyO30KCQkgICBBKGRvdWJsZSkge2lpID0gMzt9CgkJICAgZXhwbGljaXQgQShjaGFyICpzKSB7aWkgPSA0O30KCQl9OwoJCQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCiAgICAgICAgICAgIHlvdSBjYW4gY2FsbDoKCgkgICAgICAgIGEgPSBBKCkKCSAgICAgICAgYWkgPSBBKDEpCgkgICAgICAgIGFkID0gQSgxLjApCgkgICAgICAgIGFzID0gQSgiaGVsbG8iKQoJCQoJCSMgb2xkIGZvcm1zCgkgICAgICAgIGdldChhKSAgLT4gMQoJICAgICAgICBnZXQoYWkpIC0+IDIKCSAgICAgICAgZ2V0KGFkKSAtPiAzCgkgICAgICAgIGdldChhcykgLT4gNAoJCQoJCSNpbXBsaWNpdCBjb252ZXJzaW9ucwoJICAgICAgICBnZXQoMSkgICAgICAgLT4gMgoJICAgICAgICBnZXQoMS4wKSAgICAgLT4gMwoJICAgICAgICBnZXQoImhlbGxvIikgLT4gRXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgogICAgICAgICAgICBBbHNvLCBhcyBpbiBDKyssIG5vdyBpbXBsaWNpdCBjb252ZXJzaW9ucyBhcmUgc3VwcG9ydGVkIGluCiAgICAgICAgICAgIHZhcmlhYmxlIGFzc2lnbWVudHMsIGFuZCBpZiB5b3UgaGF2ZToKCgkgICAgICBBIGdhOwoJICAgICAgc3RydWN0IEJhciB7CgkgICAgICAgIEEgYTsKICAgICAgICAgICAgICB9OwoKCSAgICB5b3UgY2FuIGRvOgoKCSAgICAgIGN2YXIuZ2EgPSBBKDEpCgkgICAgICBjdmFyLmdhID0gMQoJICAgICAgY3Zhci5nYSA9IDEuMAoJICAgICAgY3Zhci5nYSA9IEEoImhlbGxvIikgCgkgICAgICBjdmFyLmdhID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgICBiID0gQmFyKCkKCSAgICAgIGIuYSA9IEEoImhlbGxvIikKCSAgICAgIGIuYSA9IDEKCSAgICAgIGIuYSA9IDEuMAoJICAgICAgYi5hID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgTm90ZSB0aGF0IHRoZSBsYXN0IGNhc2UsIGFzc2lnbmluZyBhIG1lbWJlciB2YXIgZGlyZWN0bHksIAoJICAgIGFsc28gcmVxdWlyZXMgdGhlICduYXR1cmFsdmFyJyBvcHRpb24uCgoJICAgIFRoaXMgc3VwcG9ydCBub3cgbWFrZXMgdGhlIG9sZCAnJWltcGxpY2l0JyBtYWNybywgd2hpY2gKCSAgICB3YXMgZm91bmQgaW4gJ2ltcGxpY2l0LmknIGFuZCBpdCB3YXMgZnJhZ2lsZSBpbiBtYW55IHdheXMsCgkgICAgb2Jzb2xldGUsIGFuZCB5b3Ugc2hvdWxkIHVzZSB0aGUgbmV3ICclaW1wbGljaXRjb252JwoJICAgIGRpcmVjdGl2ZSBpbnN0ZWFkLgoKCSAgICBOb3RlIHRoYXQgd2UgZm9sbG93IHRoZSBDKysgY29udmVudGlvbnMsIGllLCBpbiB0aGUKCSAgICBmb2xsb3dpbmcgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgYWxsb3dlZDoKCgkJaW50IGdldChBIGEpIHtyZXR1cm4gYS5paTt9CgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoJICAgIAoJICAgIGJ1dCBub3QgaW4gdGhlc2UgY2FzZXM6CgoJCWludCBnZXQoQSAqYSkge3JldHVybiBhLT5paTt9CgkJaW50IGdldChBJiBhKSB7cmV0dXJuIGEuaWk7fQoJCQoJICAgIEFsc28sIGl0IHdvcmtzIGZvciBkaXJlY3RvciBtZXRob2RzIHRoYXQgcmV0dXJuIGEgYnkgdmFsdWUKCSAgICByZXN1bHQsIGllLCB0aGUgZm9sbG93aW5nIHdpbGwgd29yazoKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEgZ2V0X2EoKSA9IDA7CgoJCWRlZiBnZXRfYShzZWxmKToKCQkgICByZXR1cm4gMQoKICAgICAgICAgICAgYnV0IG5vdCBpbiB0aGlzIGNhc2U6CgogICAgICAgICAgICAgICAgdmlydHVhbCBjb25zdCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEqIGdldF9hKCkgPSAwOwoJICAgIAoJICBOb3RlczoKCgkgIC0gdGhlIGltcGxpY2l0Y29udiBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQgYnkgZGlyZWN0bHkKCSAgICBjYWxsaW5nL2Rpc3BhdGNoaW5nIHRoZSBweXRob24gY29uc3RydWN0b3IsIHRyaWdnZXJpbmcgYQoJICAgIGNhbGwgdG8gdGhlIF9faW5pdF9fbWV0aG9kLiBIZW5jZSwgaWYgeW91IGV4cGFuZGVkIHRoZQoJICAgIF9faW5pdF9fIG1ldGhvZCwgbGlrZSBpbjoKCgkgICAgICAgIGNsYXNzIEE6CgkJICAgZGVmIF9faW5pdF9fKHNlbGYsYXJncyk6CgkJICAgICAgPHN3aWcgY29kZT4KCQkgICAgICA8bXkgY29kZSBoZXJlPgoKICAgICAgICAgICAgdGhlbiAnbXkgY29kZScgd2lsbCBhbHNvIGJlIGV4ZWN1dGVkLgoJICAgIAoJICAtIFNpbmNlIHRoZSAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBpcyBhIFNXSUcgZmVhdHVyZSwgaWYgeW91IHR5cGU6CgkgICAgCiAgCSAgICAgICAlaW1wbGljaXRjb252OyAgCgoJICAgIHRoYXQgd2lsbCBlbmFibGUgaW1wbGljaXQgY29udmVyc2lvbiBmb3IgYWxsIHRoZSBjbGFzc2VzIGluCgkgICAgeW91ciBtb2R1bGUuCgoJICAgIEJ1dCBpZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgcGVyZm9ybWFuY2UsIG1heWJlIHRoYXQgd2lsbCBiZQoJICAgIHRvbyBtdWNoLCBlc3BlY2lhbGx5IGlmIHlvdSBoYXZlIG92ZXJsb2FkZWQgbWV0aG9kcywgc2luY2UKCSAgICB0byByZXNvbHZlIHRoZSBkaXNwYXRjaGluZyBwcm9ibGVtLCBweXRob24gd2lsbCBlZmVjdGl2ZWx5CgkgICAgdHJ5IHRvIGNhbGwgYWxsIHRoZSBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYXMgbmVlZGVkLgoKCSAgLSBGb3IgdGhlIHNhbWUgcmVhc29uLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlCiAgICAgICAgICAgIHRoZSBuZXcgJ2Nhc3Rtb2RlJyB3aGVuIG1peGluZyBpbXBsaWNpdCBjb252ZXJzaW9uIGFuZAogICAgICAgICAgICBvdmVybG9hZGluZy4KCgkgLSBbcHl0aG9uXSBUaGUgJWltcGxpY2l0IGRpcmVjdGl2ZSBpcyBkZWNsYXJlZCBvYnNvbGV0ZSwgYW5kCiAgICAgICAgICAgeW91IHNob3VsZCB1c2UgJWltcGxpY2l0Y29udiBpbnN0ZWFkLiBJZiB5b3UgaW5jbHVkZQoJICAgdGhlIGltcGxpY2l0LmkgZmlsZSwgYSB3YXJuaW5nIHdpbGwgcmVtaW5kIHlvdSBvZiB0aGlzLgoKCSAgIE5vdGU6IFNpbmNlICVpbXBsaWNpdCBpcyBmcmFnaWxlLCBqdXN0IHJlcGxhY2luZyBpdCBieQoJICAgJWltcGxpY2l0Y29udiBjb3VsZCBsZWFkIHRvIGRpZmZlcmVudCBiZWhhdmlvci4gSGVuY2UsIHdlCgkgICBkb24ndCBhdXRvbWF0aWNhbGx5IHN3aXRjaCBmcm9tIHRvIHRoZSBvdGhlciwgYW5kIHRoZSB1c2VyCgkgICBtdXN0IG1pZ3JhdGUgdG8gdGhlIG5ldyAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBtYW51YWxseS4KCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIE1vZGlmeSBzdGQ6OnZlY3RvciB3cmFwcGVycyB0byB1c2Ugc3RkOjp2ZWN0b3I6OnZhbHVlX3R5cGUgYXMgdGhpcyBpcwogICAgICAgICAgICBjbG9zZXIgdG8gdGhlIHJlYWwgU1RMIGRlY2xhcmF0aW9ucyBmb3Igc29tZSBtZXRob2RzLCBlZyBmb3IgcHVzaF9iYWNrKCkuCiAgICAgICAgICAgIEZpeGVzIHNvbWUgY29tcGlsYXRpb24gZXJyb3JzIGZvciBzb21lIGNvbXBpbGVycyBlZyB3aGVuIHRoZSB0ZW1wbGF0ZWQKICAgICAgICAgICAgdHlwZSBpcyBhIHBvaW50ZXIuCgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgc3RkOjp2ZWN0b3IgaW1wcm92ZW1lbnRzIC0gYSBmZXcgbW9yZSBtZXRob2RzIGFyZSB3cmFwcGVkIGFuZCBzcGVjaWFsaXphdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciByZXF1aXJlZC4gVGhlIHNwZWNpYWxpemVfc3RkX3ZlY3RvciBtYWNybyBpcyBubyBsb25nZXIgbmVlZGVkIChhCiAgICAgICAgICAgIHdhcm5pbmcgaXMgaXNzdWVkIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgaXQpLgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBBZGQgaW4gcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMuIFRoaXMgYWxzbyBlbmFibGVzIG9uZSB0byBlYXNpbHkgd3JhcAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB3aGVyZSBUIGlzIGEgcG9pbnRlci4KCjEyLzI0LzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gVGhlIGNmZmkgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gRnVsbHkgc3VwcG9ydHMgQywgYnV0IHByb3ZpZGVzIGxpbWl0ZWQgc3VwcG9ydHMgZm9yIEMrKywgaW4KICAgICAgICAgICAgICAgcGFydGljdWxhciBDKysgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIGFuZCBvdmVybG9hZGluZyBuZWVkcyB0bwogICAgICAgICAgICAgICBiZSB3b3JrZWQgdXBvbi4gCgoxMi8yMy8yMDA1OiBtbWF0dXMKCSAgICBbcHl0aG9uXSBBZGQgdGhlIGNhc3Rtb2RlIHRoYXQgYWxsb3dzIHRoZSBweXRob24KCSAgICB0eXBlIGNhc3RpbmcgdG8gb2NjdXIuCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAnaW50IGZvbyhpbnQpJywgbm93CgkgICAgCgkgICAgICBjbGFzcyBBaSgpOgoJICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYseCk6IAoJCSAgICBzZWxmLnggPSB4CgkgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKTogCgkJICAgIHJldHVybiBzZWxmLngKCgkgICAgICBmb28oMSkgICAvLyBPawoJICAgICAgZm9vKDEuMCkgLy8gT2sKCSAgICAgIGZvbygxLjMpIC8vIEVycm9yCgkgICAgICBhaSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNlc3NhcnkgY2FsbHMgdG8gU1dJR19UeXBlUXVlcnkgZm9yICdjaGFyIConCgkgICAgYW5kICd3Y2hhcl90IConLCBwcm9ibGVtIGZvdW5kIGJ5IENsYXkgQ3VsdmVyIHdoaWxlCgkgICAgcHJvZmlsaW5nIHRoZSBQeU9ncmUgcHJvamVjdC4KCgkgIAoJICBbUHl0aG9uXSAKCSAgLSBBZGQgdGhlIC1kaXJ2dGFibGUvLW5vZGlydnRhYmxlIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgYSBwc2V1ZG8gdmlydHVhbCB0YWJsZSB1c2VkIGZvciBkaXJlY3RvcnMsIGF2b2lkaW5nCgkgICAgdGhlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgcHl0aG9uIG1ldGhvZCBhdCBlYWNoIGNhbGwuCgkgICAgCgkgIC0gQWRkIHRoZSAtc2FmZWNzdHJpbmdzLy1ub3NhZmVjc3RyaW5ncyBvcHRpb25zIHRvCgkgICAgZW5hYmxlL2Rpc2FibGUgdGhlIHVzZSBvZiBzYWZlIGNvbnZlcnNpb25zIGZyb20gUHlTdHJpbmcKCSAgICB0byBjaGFyICouIFB5dGhvbiByZXF1aXJlcyB5b3UgdG8gbmV2ZXIgY2hhbmdlIHRoZSBpbnRlcm5hbAoJICAgIGJ1ZmZlciBkaXJlY3RseSwgYW5kIGhlbmNlICdzYWZlY3RyaW5ncycgd2FycmFudGllcyB0aGF0CgkgICAgYnV0IHJldHVybmluZyBhIGNvcHkgb2YgdGhlIGludGVybmFsIHB5dGhvbiBzdHJpbmcgYnVmZmVyLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcHJldmlvdXMgcmVsZWFzZXMsIGlzIHRvIHJldHVybiBhCgkgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIChub3NhZmVjc3RyaW5ncyksIHNvLCBpdCBpcyB0aGUgdXNlcidzCgkgICAgcmVzcG9uc2liaWxpdHkgdG8gYXZvaWQgaXRzIG1vZGlmaWNhdGlvbi4KCSAgICAKCSAgLSBBZGQgdGhlIC1PIG9wdGlvbiB0byBlbmFibGUgYWxsIHRoZSBvcHRpbWl6YXRpb24gb3B0aW9ucwoJICAgIGF0IG9uY2UsIGluaXRpYWxseSBlcXVpdmFsZW50IHRvCgoJICAgIC1tb2Rlcm4gLWZhc3RkaXNwYXRjaCAtZGlydnRhYmxlIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwKCjEyLzA4LzIwMDU6IG1tYXR1cyAKCgkgIC0gQWRkIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiAoZmFzdGRpc3BhdGNoIGZlYXR1cmUpLiBUaGlzCgkgICAgZW5hYmxlcyB0aGUgImZhc3QgZGlzcGF0Y2giIG1lY2hhbmlzbSBmb3Igb3ZlcmxvYWRlZAoJICAgIG1ldGhvZHMgcHJvdmlkZWQgYnkgU2FsdmFkb3IgRmFuZGl+bm8gR2FyYydpYSAoIzkzMDU4NikuCgoJICAgIFRoZSByZXN1bHRpbmcgY29kZSBpcyBzbWFsbGVyIGFuZCBmYXN0ZXIgc2luY2UgbGVzcyB0eXBlCgkgICAgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiBIb3dldmVyLCB0aGUgZXJyb3IgbWVzc2FnZXMgeW91CgkgICAgZ2V0IHdoZW4gdGhlIG92ZXJsb2FkaW5nIGlzIG5vdCByZXNvbHZlZCBjb3VsZCBiZQoJICAgIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCByZXR1cm5zLgoKCSAgICBXaXRoIHRoZSBvbGQgbWV0aG9kIHlvdSBhbHdheXMgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgCgoJICAgICAgICJObyBtYXRjaGluZyBmdW5jdGlvbiBmb3Igb3ZlcmxvYWRlZCAuLi4iCgogICAgICAgICAgICB3aXRoIHRoZSBuZXcgbWV0aG9kIHlvdSBjYW4gYWxzbyBnZXQgZXJyb3JzIHN1Y2ggYXMKCgkgICAgICAgIlR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiB0eXBlIC4uLiIKCgkgICAgU2VlIGJ1ZyByZXBvcnQgIzkzMDU4NiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAKICAJICAgIFNvLCB0aGlzIG9wdGltaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB1c2Vycy4KCgkgICAgVGhlIG5ldyBtZWNoYW5pc20gY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgIHN3aWcgLWZhc3RkaXNwYXRjaAoKICAgICAgICAgICAgb3IgdXNpbmcgdGhlIGZlYXR1cmUgZm9ybQoKCSAgICAgICVmZWF0dXJlKCJmYXN0ZGlzcGF0Y2giKSBtZXRob2Q7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgJWZhc3RkaXNwYXRjaCBtZXRob2Q7CgkgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMgCgogICAgICAgICAgLSBTZXZlcmFsIG1lbW9yeSBhbmQgc3BlZWQgaW1wcm92ZW1lbnRzLCBzcGVjaWFsbHkgZm9yCgkgICAgdGVtcGxhdGVzLiBOb3cgc3dpZyBpcyB1cCB0byAyMCBmYXN0ZXIgdGhhbiBiZWZvcmUgZm9yCgkgICAgbGFyZ2UgdGVtcGxhdGUgaW50ZXJmYWNlcywgc3VjaCBhcyB0aGUgc3RkX2NvbnRhaW5lcnMuaQoJICAgIGFuZCB0ZW1wbGF0ZV9tYXRyaXguaSBmaWxlcyBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUuCgoJICAgIE1lbW9yeSBmb290cHJpbnQgaXMgYWxzbyByZWR1Y2VkIGluIGNvbnNpZGVyYXRpb24gb2Ygc21hbGwKCSAgICBwY3MvYXJjaGl0ZWN0dXJlcy4KCgkgIC0gYWRkIGNvbW1hbmRsaW5lIG9wdGlvbnMgLWNwcGVycmFzd2FybiBhbmQgLW5vY3BwZXJyYXN3YXJuIiB0byBmb3JjZQogICAgICAgICAgICB0aGUgc3dpZyBwcmVwcm9jZXNzb3IgdG8gdHJlYXQgdGhlICNlcnJvciBkaXJlY3RpdmUgYXMgYSAjd2FybmluZy4KCSAgICAKCSAgICB0aGUgcHJhZ21hcwoKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0xCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MAoJICAgICAgIAoJICAgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IG1vcmUgcG9ydGFibGUsIGVzcGVjaWFsbHkKCSAgICBmb3IgV2luZG93cy4gRm9sbG93aW5nIAoKICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS93aW5kb3dzLmh0bWwKCiAgICAgICAgICAgIFB5X05vbmUgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBzdHJ1Y3R1cmUsIHBsdXMgb3RoZXIKICAgICAgICAgICAgdHJpY2tzIG1lbnRpb25lZCB0aGVyZS4KCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhyZWFkcyBiYXNlZCBpbiB0aGUKCSAgICBwcm9wb3NhbCBieSBKb3NlcGggV2luc3Rvbi4KCgkgICAgVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CgoJICAgIDEuLSB0aGUgbW9kdWxlIHRocmVhZCBzdXBwb3J0IGlzIGVuYWJsZSB2aWEgdGhlICJ0aHJlYWRzIiBtb2R1bGUKICAgICAgICAgICAgICAgIG9wdGlvbiwgaS5lLgoKICAgICAgICAgICAgICAgICAgJW1vZHVsZSgidGhyZWFkcyI9MSkKCiAgICAgICAgICAgIDIuLSBFcXVpdmFsZW50IHRvIHRoYXQsIGlzIHRoZSBuZXcgJy10aHJlYWRzJyBzd2lnIG9wdGlvbgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGhyZWFkcyAtcHl0aG9uIC4uLgoKICAgICAgICAgICAgMy4tIFlvdSBjYW4gcGFydGlhbGx5IGRpc2FibGUgdGhyZWFkIHN1cHBvcnQgZm9yIGEgZ2l2ZW4KICAgICAgICAgICAgICAgIG1ldGhvZCB1c2luZzoKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZCIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWQgbWV0aG9kOwoKICAgICAgICAgICAgICAgIGFsc28sIHlvdSBjYW4gZGlzYWJsZSBzZWN0aW9ucyBvZiB0aGUgdGhyZWFkIHN1cHBvcnQsIAogICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGJsb2NrIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGJsb2NrIG1ldGhvZDsKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGFsbG93IikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGFsbG93IG1ldGhvZDsKCiAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGlzYWJsZXMgdGhlIEMrKy9weXRob24gdGhyZWFkIHByb3RlY3Rpb24sIGFuZCB0aGUKICAgICAgICAgICAgICAgIHNlY29uZCBkaXNhYmxlcyB0aGUgcHl0aG9uL0MrKyB0aHJlYWQgcHJvdGVjdGlvbi4gCgogICAgICAgICAgICA0Li0gVGhlIGN1cnJlbnQgdGhyZWFkIHN1cHBvcnQgaXMgYmFzZWQgaW4gdGhlIFB5R0lMCiAgICAgICAgICAgICAgICBleHRlbnNpb24gcHJlc2VudCBpbiBweXRob24gdmVyc2lvbiAyLjMgb3IgbGF0ZXIsIGJ1dAogICAgICAgICAgICAgICAgeW91IGNhbiBwcm92aWRlIHRoZSB0aHJlYWQgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMgYnkKICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBtYWNyb3MgaW4gcHl0aHJlYWRzLnN3Zy4KCgkJSWYgeW91IGdldCBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gZm9yIG9sZGVyIHZlcnNpb25zLAoJCXBsZWFzZSBzZW5kIHVzIGEgcGF0Y2guCgogICAgICAgICAgICBGb3IgdGhlIGN1cmlvdXMgYWJvdXQgcGVyZm9ybWFuY2UsIGhlcmUgYXJlIHNvbWUgbnVtYmVycwogICAgICAgICAgICBmb3IgdGhlIHByb2ZpbGV0ZXN0LmkgdGVzdCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB0aGUgc3BlZWQKCSAgICBvZiB0aGUgd3JhcHBlZCBjb2RlOgoKCSAgICAgICAgbm90aHJlYWQgICAgICAgICAgIDkuNnMgIChubyB0aHJlYWQgY29kZSkKCQlub3RocmVhZGJsb2NrICAgICAxMi4ycyAgKG9ubHkgJ2FsbG93JyBjb2RlKQoJCW5vdGhyZWFkYWxsb3cgICAgIDEzLjZzICAob25seSAnYmxvY2snIGNvZGUpCiAgICAgICAgICAgICAgICBmdWxsIHRocmVhZCAgICAgICAxNS41cyAgKCdhbGxvdycgKyAnYmxvY2snIGNvZGUpCgkgICAgCgkgICAgaS5lLiwgZnVsbCB0aHJlYWQgY29kZSBkZWNyZWFzZXMgdGhlIHdyYXBwaW5nIHBlcmZvcm1hbmNlIGJ5CgkgICAgYXJvdW5kIDYwJS4gSWYgdGhhdCBpcyBpbXBvcnRhbnQgdG8geW91ciBhcHBsaWNhdGlvbiwgeW91CgkgICAgY2FuIHR1bmUgZWFjaCBtZXRob2QgdXNpbmcgdGhlIGRpZmZlcmVudCAnbm90aHJlYWQnLAoJICAgICdub3RocmVhZGJsb2NrJyBvciAnbm90aHJlYWRhbGxvdycgZmVhdHVyZXMgYXMKCSAgICBuZWVkZWQuIE5vdGUgdGhhdCBmb3Igc29tZSBtZXRob2RzIGRlYWN0aXZhdGluZyB0aGUKCSAgICAndGhyZWFkIGJsb2NrJyBvciAndGhyZWFkIGFsbG93JyBjb2RlIGlzIG5vdCBhbiBvcHRpb24sCgkgICAgc28sIGJlIGNhcmVmdWwuCgkgICAgCgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgdXNlIHN5c3RlbSBhbmdsZSBicmFja2V0cyBldmVyeXdoZXJlIGZvciAlaW5jbHVkZSwgZWcKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX2NvbW1vbi5pIgogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9jb21tb24uaT4KCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcyBoYXZlIGFuIGV4dHJhIGNvbnN0cnVjdG9yIHNvIHRoYXQgZW51bSBpdGVtIHZhbHVlcyB0aGF0CiAgICAgICAgICAgIGFyZSBpbml0aWFsaXNlZCBieSBhbm90aGVyIGVudW0gaXRlbSB2YWx1ZSBjYW4gYmUgd3JhcHBlZCB3aXRob3V0IGhhdmluZyB0byB1c2UgJWphdmFjb25zdHZhbHVlLwogICAgICAgICAgICAlY3Njb25zdHZhbHVlIGZvciB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkuIFN1Z2dlc3Rpb24gYnkKICAgICAgICAgICAgQm9iIE1hcmluaWVyL0RvdWdsYXMgUGVhcnNvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB4eXosCiAgICAgICAgICAgICAgICAgbGFzdCA9IHh5egogICAgICAgICAgICAgIH0gcmVwZWF0OwoKMTEvMjEvMjAwNTogbW1hdHVzCgkgICAgW3J1YnkgKyBweXRob25dCgoJICAgIEZpeGVzIGZvciBkaXJlY3RvcnMgKyBwb2ludGVycy4gVGhpcyBpcyBhbiB1Z2x5IHByb2JsZW0gd2l0aG91dCBhbiBlYXN5CgkgICAgc29sdXRpb24uIEJlZm9yZSB3ZSBpZGVudGlmaWVkIHRoaXMgY2FzZSBhcyBwcm9ibGVtYXRpYzoKCgkgICAgICAgICAgdmlydHVhbCBjb25zdCBNeUNsYXNzJiBteV9tZXRob2QoKTsKCiAgICAgICAgICAgIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBhbGwgdGhlIGNhc2VzIHdoZXJlIGEgcG9pbnRlciwgYXJyYXkgb3IKICAgICAgICAgICAgcmVmZXJlbmNlIGlzIHJldHVybmVkLCBhcmUgcHJvYmxlbWF0aWMsIGV2ZW4gZm9yIAoJICAgIHByaW1pdGl2ZSB0eXBlcyAoYXMgaW50LCBkb3VibGUsIGNoYXIqLCBldGMpLgoKCSAgICBUbyB0cnkgdG8gZml4IHRoZSBpc3N1ZSwgYSBuZXcgdHlwZW1hcCB3YXMgYWRkZWQsCgkgICAgJ2RpcmVjdG9yZnJlZScsIHdoaWNoIGlzIHVzZWQgdG8gJ2ZyZWUnIHRoZSByZXNvdXJjZXMKCSAgICBhbGxvY2F0ZWQgZHVyaW5nIHRoZSAnZGlyZWN0b3JvdXQnIHBoYXNlLiBBdCB0aGUgc2FtZQoJICAgIHRpbWUsIGEgcHJpbWl0aXZlIGdhcmJhZ2UgY29sbGVjdG9yIGVuZ2luZSB3YXMgYWRkZWQgdG8KCSAgICBkZWFsIHdpdGggb3JwaGFuZWQgYWRkcmVzc2VzLCB3aGVuIG5lZWRlZC4KCSAgICAKCSAgICBUaGUgc2l0dWF0aW9uIGlzIG11Y2ggYmV0dGVyIG5vdywgYnV0IHN0aWxsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKCSAgICBtZW1vcnkgZXhoYXVzdGF0aW9uIGlmIHJlY3Vyc2lvbiBpcyB1c2VkLgoKCSAgICBTbywgc3RpbGwgeW91IG5lZWQgdG8gYXZvaWQgcmV0dXJuaW5nIHBvaW50ZXJzLCBhcnJheXMgb3IKCSAgICByZWZlcmVuY2VzIHdoZW4gdXNpbmcgZGlyZWN0b3IgbWV0aG9kcy4KCgkgICAgLSBBZGRlZCBzdGRpbnQuaSAtIHR5cGVtYXBzIGZvciBsYXRlc3QgQzk5IGludGVncmFsIHR5cGVzIGZvdW5kIGluIHN0ZGludC5oLgoJICAgIAoxMS8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIHR5cGVzIGFkZGVkIHRvIHdpbmRvd3MuaSwgZWcgVUlOVDgsIFdPUkQsIEJZVEUgZXRjLiAKICAgICAgICAgICAgSW5jbHVkaW5nIHdpbmRvd3MuaSB3aWxsIGFsc28gZW5hYmxlIFNXSUcgdG8gcGFyc2UgdGhlIF9fZGVjbHNwZWMgTWljcm9zb2Z0CiAgICAgICAgICAgIGV4dGVuc2lvbiwgZWcgX19kZWNsc3BlYyhkbGxpbXBvcnQpLiBBbHNvIG90aGVyIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucwogICAgICAgICAgICBzdWNoIGFzIF9fc3RkY2FsbC4KCjExLzEwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgZm9yIFdpbmRvd3MgLSB3aW5kb3dzLmkuIFRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gdXNlZnVsIHR5cGUKICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHVzZXJzIHdobyBpbmNsdWRlIHdpbmRvd3MuaC4gSW5pdGlhbCBzdXBwb3J0IGlzIGZvciB0aGUKICAgICAgICAgICAgbm9uIElTTyBpbnRlZ3JhbCB0eXBlczogX19pbnQ4LCBfX2ludDE2LCBfX2ludDMyLCBfX2ludDY0IGFuZCB1bnNpZ25lZCB2ZXJzaW9ucy4KICAgICAgICAgICAgVGhlIHVuc2lnbmVkIHZlcnNpb25zIHByZXZpb3VzbHkgY291bGQgbm90IGJlIHBhcnNlZCBieSBTV0lHLiAgU0YgIzg3MjAxMy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gUG9ydGFiaWxpdHkgd2FybmluZyBmb3IgZmlsZXMgd2hpY2ggd2lsbCBvdmVyd3JpdGUgZWFjaCBvdGhlciBvbiBjYXNlCiAgICAgICAgICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBzdWNoIGFzIEZBVDMyL05URlMuIFRoaXMgd2lsbCBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdHdvCiAgICAgICAgICAgIGNsYXNzIG5hbWVzIGFyZSB0aGUgc2FtZSBiYXJyaW5nIGNhc2UuIFRoZSB3YXJuaW5nIGlzIGlzc3VlZCBvbiBhbGwgcGxhdGZvcm1zIGFuZAogICAgICAgICAgICBjYW4gYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSB1c3VhbCB3YXJuaW5nIHN1cHByZXNzaW9uIHRlY2huaXF1ZXMuIFNGIGJ1ZyAjMTA4NDUwNy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1weXRob24gLS13aXRoLXJ1YnkgLS13aXRoLXBlcmw1IGV0YyBlbmFibGUgdGhlc2UgbGFuZ3VhZ2VzLAogICAgICAgICAgICBpZSB0aGUgLS13aXRoLXh4eHggb3B0aW9ucywgd2hlcmUgbm8gcGF0aCBpcyBzcGVjaWZpZWQsIHdvcmsgdGhlIHNhbWUgYXMgaWYgCiAgICAgICAgICAgIHRoZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQgYXQgYWxsLiBCYXNlZCBvbiBwYXRjaGVzICMxMzM1MDQyICMxMzI5MDQ4ICMxMzI5MDQ3LgoKMTEvMDkvMjAwNTogZGFuY3kKCgkgICAgW0FsbGVncm9jbF0KCSAgICBBZGQgQysrIHN1cHBvcnQgdG8gdGhlIEFsbGVncm9jbCBtb2R1bGUuIEZ1cnRoZXIKCSAgICBlbmhhbmNlcyB0aGUgQyBzdXBwb3J0IGFzIHdlbGwuIFNvbWUgb2YgdGhlCgkgICAgZmVhdHVyZXM6CgoJICAgIC0gTVVDSCBiZXR0ZXIgZ2VuZXJhdGlvbiBvZiBmb3JlaWduIHR5cGVzIGJhc2VkIG9uCgkgICAgdGhlIEMvQysrIHR5cGVzIGZvciB1c2UgaW4gZGVmaW5pbmcgdGhlIEZGSSBvbgoJICAgIHRoZSBsaXNwIHNpZGUuIFdlIGRvbid0IHBhc3MgZXZlcnl0aGluZyBhcyBhICgqIDp2b2lkKQoJICAgIGFueSBsb25nZXIuCgoJICAgIC0gVXNlcyB0eXBlbWFwcyBmb3IgYmV0dGVyIGNvbnRyb2wgb2YgdHlwZSBjb252ZXJzaW9ucwoJICAgIGFuZCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBsaXNwIGFuZCBjKysgd3JhcHBlcgoJICAgIGNvZGUuCgoJICAgIC0gQ0xPUyB3cmFwcGluZyBvZiBwb2ludGVycyByZXR1cm5lZCBmcm9tIGZvcmVpZ24gc3BhY2UKCSAgICBtYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBwb2ludGVycyBpbiB1c2VyIGNvZGUuCgkgICAgVGhlIHdyYXBwaW5nIG9iamVjdHMgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byBGRiBjYWxscy4KCgkgICAgLSBEZWZ1biB3cmFwcGluZyBvZiBGRiBjYWxscywgYWxsb3dpbmcgZm9yIG1vcmUgbGlzcHkKCSAgICBpbnRlcmZhY2UuIENvbnZlcnNpb24sIEdDaW5nLCBvZiBsaXNwIG9iamVjdHMgdG8gCgkgICAgZm9yZWlnbiBvYmplY3RzIGNhbiBiZSBkb25lIGluIHRoZSB3cmFwcGluZyBkZWZ1biB2aWEKCSAgICB0aGUgdXNlIG9mIHR5cGVtYXBzLgoJICAgIAoJICAgIC0gb3ZlcmxvYWQgZGlzcGF0Y2hpbmcgaW1wbGVtZW50ZWQgb24gdGhlIGxpc3Agc2lkZQoJICAgIHVzaW5nIGdlbmVyaWMgZnVuY3Rpb25zLgoKCSAgICAtIFRlbXBsYXRlcyBhbmQgc3lub255bW91cyB0eXBlcyBzdXBwb3J0ZWQuCgoxMS8wNy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aS1pbmhlcml0YW5jZSBpbgoJICAgIHRoZSBweXRob24gc2lkZSwgaWUsIGlmIHlvdSBoYXZlIHR3byBDKysgd3JhcHBlZCBjbGFzcywgRm9vCgkgICAgYW5kIEJhciwgbm93OgoKCSAgICAgICBjbGFzcyBNeVB5dGhvbkNsYXNzKEZvbyxCYXIpOgoJICAgICAgICAgIC4uLi4KCiAgICAgICAgICAgIHdpbGwgcHJvcGVybHkgd29yaywgZXZlbiB3aXRoIGRpcmVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgRm9vLnRoaXMgYW5kIEJhci50aGlzIHdpbGwgZm9sbG93CiAgICAgICAgICAgIGNvcnJlY3RseS4gQmVmb3JlLCBhIGNsYXNzIGNvdWxkIG9ubHkgaGF2ZSBvbmUgJ3RoaXMnCiAgICAgICAgICAgIGluc3RhbmNlICh1bmxpa2UgQysrKSwgb25seSB0aGUgbGFzdCBiYXNlIGNsYXNzIHdhcwogICAgICAgICAgICBwcm9wZXJseSBkZWxldGVkLCBvciBkZXRlY3RlZCB3aXRoIGRpcmVjdG9ycy4KCgkgICAgTm93ICdzZWxmLnRoaXMnIGNhbiBiZSBhIGxpc3QsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgQysrCgkgICAgaW5zdGFuY2UgcG9pbnRlcnMgZm9yIGFsbCB0aGUgYmFzZSBjbGFzc2VzLgoJICAgIAoJICAgIEFsc28sIHN3aWcudGhpcyBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZSBDKysKCSAgICBpbnN0YW5jZShzKSwgYW5kIHRoZSBfX2RlbF9fIG1ldGhvZCBpcyBub3QgZW1pdHRlZCB1bmxlc3MKCSAgICB0aGUgdXNlciBwcmVwcGVuZC9hcHBlbmQgc29tZSBjb2RlIHRvIGl0LgoKCSAgLSBTd2lnIGNhbiBub3cgZGV0ZWN0IG1lbW9yeSBsZWFrcywgaWUsIGlmIHlvdSBzdGlsbAoJICAgIGRvbid0IHVzZSBwcm94eS9zaGFkb3cgY2xhc3NlcywgYW5kIHR5cGUgc29tZXRoaW5nIGxpa2UKCSAgICAKCSAgICAgICAgIGltcG9ydCBfZXhhbXBsZQoJICAgICAgICAgZiA9IF9leGFtcGxlLm5ld19Gb28oKQoKCSAgICBhbmQgZm9yZ2V0IHRvIGNhbGwgX2V4YW1wbGUuZGVsZXRlX0ZvbyhmKSwgdGhlbiBzd2lnIHdpbGwKCSAgICB0ZWxsIHlvdSB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsuCgoJICAgIE90aGVyd2lzZSwgaWYgeW91IGFsd2F5cyB1c2UgdGhlIHByb3h5IGNsYXNzZXMsIHlvdSBwcm9iYWJseQoJICAgIHlvdSB3aWxsIG5ldmVyIGV2ZXIgc2VlIHRoaXMgd2FybmluZyB1bmxlc3MgdGhlcmUgaXMKCSAgICBzb21ldGhpbmcgd3JvbmcgaW5zaWRlIHRoZSBzd2lnIHdyYXBwaW5nIGNvZGUuCgkgICAgICAgCgkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgSWYgeW91IG92ZXJsb2FkZWQgdGhlIF9fZGVsX18gbWV0aG9kLCBhbmQgY2FsbCB0aGUgYmFzZQoJICAgIG9uZQkgd2l0aG91dCBhIHRyeSBibG9jaywgYXMgaW4KCgkgICAgICAgICAgIGNsYXNzIE15Q2xhc3MoU3dpZ0NsYXNzKToKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgCiAgICAgICAgICAgIHB5dGhvbiBjb3VsZCBjb21wbGFpbiB0aGF0IHRoZSBtZXRob2QgU3dpZ0NsYXNzLl9fZGVsX18gaXMKICAgICAgICAgICAgdW5kZWZpbmVkLiBUcnkgdG8gdXNlIGluc3RlYWQ6CgkgICAgCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIHRyeTogU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICBleGNlcHQ6IHBhc3MKCgkgICAgb3Igc2ltcGx5IAkJICAKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIG1vcmUgZnVuIHRvIFNUTC9TVEQgY29udGFpbmVycywgbm93IHlvdQoJICAgIGNhbiBkbwoKCSAgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PFB5T2JqZWN0ICo+OwkJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3RvcjxQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8UHlPYmplY3QgKixQeU9iamVjdCAqPjsKCSAgICAgICAuLi4uCgoJICAgIFRoZSBzYW1lICBhcHBsaWVzIHRvIHN0ZDo6bGlzdCwgc3RkOjpkZXF1ZSwgc3RkOjptdWx0aXNldCwgZXRjLgoKCSAgICBUaGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUgeW91IGNhbiBkbyBub3c6CgoJICAgICAgICMgQysrIHN0ZDo6dmVjdG9yIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICB2ID0gcHl2ZWN0b3IoWzEsImhlbGxvIiwoMSwyKV0pCgkgICAgICAgcHJpbnQgdlsxXQoJICAgICAgID4+ICdoZWxsbycKCSAgICAgICBwcmludCB2WzJdCgkgICAgICAgPj4gKDEsMikKCSAgICAgICAJCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6c2V0IGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBzID0gcHlzZXQoKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCgxLDIpKQkJICAgCgkgICAgICAgcy5pbnNlcnQoMSkJCQkgICAKCSAgICAgICBzLmluc2VydCgiaGVsbG8iKQoJICAgICAgIHN1bT0oKQoJICAgICAgIGZvciBpIGluIHM6CgkgICAgICAgICBzdW0gKz0oaSwpCgkgICAgICAgcHJpbnQgc3VtCgkgICAgICAgPj4+ICgxLCAnaGVsbG8nLCAoMSwgMikpCgkgICAgICAgCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6bWFwIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBtID0gcHltYXAoKQkJCSAgIAoJICAgICAgIG1bImZvbyJdID0gImhlbGxvIgkJICAgCgkgICAgICAgbVsxXSA9ICgxLDIpCgkgICAgICAgcG0gPSB7fQoJICAgICAgIGZvciBrIGluIG06CSAgICAJICAgCgkgICAgICAgICBwbVtrXSA9IG1ba10KCSAgICAgICBwcmludCBwbQoJICAgICAgID4+PiB7MTogKDEsIDIpLCAnZm9vJzogJ2hlbGxvJ30KCgkgICAgaWUsIHRoZSBTVEQvU1RMIGNvbnRhaW5lcnMgd29yayBhcyByZWFsIG5hdGl2ZSBweXRob24KCSAgICBjb250YWluZXIsIHdpdGggYXJiaXRyYXJ5IGl0ZW0gdHlwZXMgYW5kIHNvLgoKCSAgICBCdXQgc2luY2Ugbm9ybWFsIEMrKyBjb250YWluZXJzIGRvIG5vdCBwcm9wZXJseSByZWYvdW5yZWYKCSAgICB0aGVpciBpdGVtcywgeW91IHNob3VsZCB1c2UgdGhlIHNhZmVyIHZlcnNpb25zOgoJICAgIAoJICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3Rvcjxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPHN3aWc6OlB5T2JqZWN0X3B0ciwgc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8c3dpZzo6UHlPYmplY3RfcHRyLHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAuLi4uCgoJICAgIHdoZXJlIHN3aWc6OlB5T2JqZWN0X3B0ciBpcyBhIFB5T2JqZWN0ICogZW52ZWxvcGUgY2xhc3MgcHJvdmlkZWQKCSAgICB0byBzYWZlbHkgaW5jcmVmL2RlY3JlZiB0aGUgcHl0aG9uIG9iamVjdC4gCgkgICAgCgkgICAgU28sIG5vdyB5b3UgY2FuIHVzZSBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBhcyBuYXRpdmUKCSAgICBQeXRob24gY29udGFpbmVycy4gCgoJICAgIE5vdGUgMTogc3RkOjptYXAsIHN0ZDo6c2V0IGFuZCB0aGUgb3RoZXIgJ29yZGVyZWQnCgkgICAgY29udGFpbmVycyB3aWxsIHByb3Blcmx5IHVzZSBQeU9iamVjdF9Db21wYXJlIGZvciBzb3J0aW5nLAoJICAgIHdoZW4gbmVlZGVkLgoKCSAgICBOb3RlIDI6IGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGhhdmUgYSBsaW1pdCBzaXplIG9mCgkgICAgU0laRV9NQVgsIGllLCB5b3UgY2FuIGhhdmUgbWFuYWdlIGNvbnRhaW5lcnMgbGFyZ2VyIHRoYW4KCSAgICBJTlRfTUFYLCB0aGUgcHl0aG9uIGxpbWl0LgoJICAgIAoJICAgICAgCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXQoJICAgIC0gYWRkICdpdGVyYXRvcigpJyBtZXRob2QgZm9yIGFsbCBzZXF1ZW5jZXMgYW5kIGFkZGl0aW9uYWxseQoJICAgICAgJ2tleV9pdGVyYXRvcigpJyBmb3IgbWFwcy4KCgkgICAgICAnaXRlcmF0b3IoKScgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLgoJICAgICAgQWRkaXRpb25hbGx5LCBpbiBtYXBzLCAna2V5X2l0ZXJhdG9yKCknIHdpbGwgcmV0dXJuIGEgcHl0aG9uCgkgICAgICBpdGVyYXRvciB1c2luZyBvbmx5IHRoZSBtYXAga2V5cy4KCSAgICAgIAoJICAgICAgSW4gZ2VuZXJhbCB0aGUgc2VxdWVuY2UgbWV0aG9kIF9faXRlcl9fIHdpbGwgY2FsbAoJICAgICAgJ2l0ZXJhdG9yKCknLCByZXR1cm5pbmcgdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IsIGJ1dCBpbgoJICAgICAgbWFwcyBpdCB3aWxsIGNhbGwgJ2tleV9pdGVyYXRvcigpJywgbWFpbnRhaW5pbmcKCSAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJICAgICAgSGVuY2UsIGZvciBzdGQ6Om1hcHMsIHlvdSBjYW4gcGxheSB0aGVuIHdpdGggdGhlIG5hdGl2ZQoJICAgICAgQysrIGl0ZXJhdG9yLCB3aGljaCB2YWx1ZSBpcyBhIChrZXksIHZhbHVlKSBwYWlyLCBieQoJICAgICAgY2FsbGluZyBtYXAuaXRlcmF0b3IoKSwgYXMgd2l0aCBtYXAuYmVnaW4oKSwgbWFwLmVuZCgpLCBldGMuCgoJICAgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtYXAuaXRlcmF0b3IoKSByZXR1cm5zIGEgc2FmZQoJICAgICAgJ2Nsb3NlZCcgaXRlcmF0b3IsIHdoaWxlIG1hcC5iZWdpbigpIGFuZCBtYXAuZW5kKCkgYXJlCgkgICAgICAnb3BlbicgaXRlcmF0b3JzLgoKCSAgICAgIEEgJ2Nsb3NlZCcgaXRlcmF0b3Iga25vd3MgdGhlIGJlZ2luIGFuZCB0aGUgZW5kIG9mIHRoZQoJICAgICAgc2VxdWVuY2UsIGFuZCBpdCBuZXZlciBjYW4gc2VnLiBmYXVsdC4gQW4gJ29wZW4nCgkgICAgICBpdGVyYXRvciwgYXMgaW4gQysrLCBjYW4gc2VnLiBmYXVsdCBhdCB0aGUgQysrIHNpZGUuCgoJICAgICAgICAgIyBhIGNsb3NlZCBpdGVyYXRvciBpcyBzYWZlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KCQkgIyB0aGUgbmV4dCgpIG1ldGhvZCB3aWxsIHRocm93IGEgU3RvcEl0ZXJhdGlvbgoJICAgICAgICAgIyBleGNlcHRpb24gYXMgbmVlZGVkCgkKCSAgICAgICAgIGkgPSBzZXEuaXRlcmF0b3IoKQoJCSB0cnk6CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgoJCSAgICAgICAgc3VtICs9IGkubmV4dCgpCgkJIGV4Y2VwdDogcGFzcwoJCSAKCQkgIyBhbiBvcGVuIGl0ZXJhdG9yIGFsd2F5cyBuZWVkIHRvIGJlIGNoZWNrZWQsCgkJICMgb3IgaXQgd2lsbCBjcmFzaCBhdCB0aGUgQysrIHNpZGUKCgkgICAgICAgICBjdXJyZW50ID0gc2VxLmJlZ2luKCkKICAgICAgICAgICAgICAgICBlbmQgPSBzZXEuZW5kKCkKCQkgd2hpbGUgKGN1cnJlbnQgIT0gZW5kKToKCQkgICAgc3VtICs9IGN1cnJlbnQubmV4dCgpCgkgICAgICAKCSAgICAgIAoJICAgIFtQeXRob25dCgkgICAgLSBGaW5hbGx5LCB3aGVuIHdlIGNhbGwgCgoJICAgICAgICBmID0gRm9vKCkKCgkgICAgICB0aGUgY29uc3RydWN0aW9uIGlzICdvbmUtd2F5Jy4gQmVmb3JlIGNvbnN0cnVjdGlvbiAgd2FzIGRvbmUKCSAgICAgIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykgCiAgICAgICAgICAgICAgICAgIG5ld19Gb28oKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKSAKICAgICAgICAgICAgICAgICAgRm9vUHRyKCkgKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgd2FzIGRvbmUgbGlrZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pCiAgICAgICAgICAgICAgICAgIEZvb1B0cihweXRob24pIC0+IEZvbygpIChweXRob24pCiAgICAgICAgICAgICAgICAgIAkJICAKCgkgICAgICBpZSwgd2Ugd2hlbiBnb2luZyBiYWNrIGFuZCBmb3J3YXJkIGJldHdlZW4gdGhlIEMrKyBhbmQKCSAgICAgIHB5dGhvbiBzaWRlLgoKCSAgICAgIE5vdyBzaW5jZSB0aGVyZSBpcyBubyBGb29QdHIgdGhlIGNvbnN0cnVjdGlvbiBwcm9jZXNzIGlzCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykKICAgICAgICAgICAgICAgICAgX25ld19Gb28oKSAoQysrKSAtPiBOZXdQb2ludGVyT2JqKCkgKEMrKykgKG5vIHNoYWRvdyBjbGFzcykKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgaXMgZG9uZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspICh3aXRoIHNoYWRvdyBjbGFzcykgLT4gTmV3SW5zdGFjZU9iaigpIChDKyspCgoJICAgICAgd2hlcmUgTmV3SW5zdGFuY2VPYmogY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRob3V0CgkgICAgICBjYWxsaW5nIF9faW5pdF9fIGFuZCBpdCBkb2Vzbid0IGdvICdiYWNrJyB0byBweXRob24sIGlzCgkgICAgICAncHVyZScgQyBBUEkuCgoJICAgICAtIFdpdGggdGhpcyBjaGFuZ2UsIGFuZCB0aGUgb3RoZXIgb25lcyBpbiB0aGUKICAgICAgICAgICAgICAgUHlTd2lnT2JqZWN0IHR5cGUsIHdoaWNoIG5vdyBjYXJyaWVzIHRoZSB0aGlzb3duIGFuZAogICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyBwb2ludGVyLCB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGJlIGFzCiAgICAgICAgICAgICAgIGZhc3QgYXMgYm9vc3Q6OlB5dGhvbiBhbmQvb3IgdGhlIG90aGVyIHB5dGhvbiB3cmFwcGVycwogICAgICAgICAgICAgICBiYXNlZCBpbiBwdXJlIFB5dGhvbi9DIEFQSSBjYWxscy4KCgkgICAgICAgQXMgYSByZWZlcmVuY2UsIHRoZSBwcm9maWxldGVzdF9ydW5tZS5weSBleGFtcGxlLCB3aGljaAoJICAgICAgIGRvZXMgYSBzaW1wbGUgY2FsbCBmdW5jdGlvbiBtYW55IHRpbWVzLCBzdWNoIGFzIHRoaXMgY29kZToKCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGV0ZXN0ICAgICAgIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJICAgIGEgPSBwcm9maWxldGVzdC5BKCkgICAgICAKCQkgICAgYiA9IHByb2ZpbGV0ZXN0LkIoKSAgICAgIAoJCSAgICBmb3IgaSBpbiByYW5nZSgwLDEwMDAwMDApCgkgICAgICAgICAgICAgIGEgPSBiLmZuKGEpICAgICAgICAgICAgCgoKCSAgICAgICB3aGVyZSBmbiBpcyBkZWZpbmVkIGFzICdBKiBCOjpmbihBICphKSB7cmV0dXJuIGE7fScsCgkgICAgICAgcHJvZHVjZXMgIHRoZSBmb2xsb3dpbmcgdGltZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub21vZGVybiAgICBtb2Rlcm4KCSAgICAgICAgIHN3aWctMS4zLjI2ICAgIDE5LjcwcyAgICAgIDUuOThzCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuOTlzICAgICAgMC45OHMKCSAgICAgICAKCgkgICAgICAgQ2xlYXJseSwgdGhlcmUgaXMgYSBsYXJnZSBpbXByb3ZlbWVudCBmb3IgdGhlIHB5dGhvbgoJICAgICAgICdub21vZGVybicgbW9kZS4gU3RpbGwsIHRoZSAnbW9kZXJuJyBtb2RlIGlzIGFyb3VuZAoJICAgICAgIDYgdGltZXMgZmFzdGVyIHRoYW4gYmVmb3JlLiBGb3IgdGhlIHNhbWUgdGVzdCwgYnV0CgkgICAgICAgdXNpbmcgdGhlIG5vbi1zaGFkb3cgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCB3ZSBnZXQKCgkgICAgICAgICAgICAgICAgICAgICAgIF9wcm9maWxldGVzdCAobm9uLXNoYWRvdykKCSAgICAgICAgIHN3aWctMS4zLjI2ICAgICAwLjgwcyAKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC42MHMgCgoJICAgICAgIEhlbmNlLCBub3cgZm9yIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIHByb3h5IG92ZXJoZWFkCgkgICAgICAgaXMgaW5zaWduaWZpY2FudC4KCgkgICAgICAgTm90ZSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBudW1iZXJzIHdlIGFyZSBzaG93aW5nIGlzIGZvcgoJICAgICAgIGEgc2ltcGxlIG1vZHVsZSAodHdvIHR5cGVzKSBhbmQgYSBzaW1wbGUgZnVuY3Rpb24gKG9uZQoJICAgICAgIGFyZ3VtZW50KS4gRm9yIHJlYWwgc2l0dWF0aW9ucywgZm9yIG1vZHVsZXMgd2l0aCBtYW55CgkgICAgICAgbW9yZSB0eXBlcyBhbmQvb3IgZnVuY3Rpb25zIHdpdGggbWFueSBtb3JlIHBhcmFtZXRlcnMsCgkgICAgICAgeW91IHdpbGwgc2VlIGV2ZW4gYmV0dGVyIHJlc3VsdHMuCgkgICAgICAgCgkJICAJICAgICAgCjEwLzMxLzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dCgoJICAgIC0gRmluYWxseSwgbm8gbW9yZSBDbGFzc1B0ciBwcm94eSBjbGFzc2VzLiBZb3Ugd2lsbCBzZWUKCSAgICAgIG9ubHkgYSBjbGVhbiBDbGFzcyBwcm94eSBjbGFzcyBpbiB0aGUgLnB5IGZpbGUuCgoJICAgIC0gTm8gbW9yZSAncmVhbCcgdGhpc293biBhdHRyaWJ1dGUgZWl0aGVyLCB0aGUgUHlTd2lnT2JqZWN0IG5vdwogICAgICAgICAgICAgIGNhcnJpZXMgdGhlIG93bmVyc2hpcCBpbmZvLgoKCSAgICAgIFlvdSBjYW4gYWxzbyBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoJCSAgCgkJICBzZWxmLnRoaXMuZGlzb3duKCkKCQkgIHNlbGYudGhpcy5vd24oMCkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzLmFjcXVpcmUoKQoJCSAgc2VsZi50aGlzLm93bigxKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgoJICAgICAgU3RpbGwgdGhlIG9sZCB3YXksCgkgICAgICAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgoJCSAgc2VsZi50aGlzb3duID0gMAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpc293biA9IDEKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgogICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCwgYW5kIHB5dGhvbiBkaXNwYXRjaGVzIHRoZSBwcm9wZXIgbWV0aG9kCiAgICAgICAgICAgICAgY2FsbHMgYXMgbmVlZGVkLiAJCSAgCgkgICAgICAgCgoJICAgIC0gU3VwcG9ydCBmb3IgaXRlcmF0b3JzIGluIFNUTC9TVEQgY29udGFpbmVycywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZTxzZXRfc3RyaW5nPiBzdGQ6OnNldDxzdGQ6OnN0cmluZz47CgkgICAgICAgICAgCiAgICAgICAgICAgICAgIHlvdSBjYW4gdXNlIHRoZSBDKysgaXRlcmF0b3JzIGFzOiAgCgogICAgICAgICAgICAgICAgICAgICBzID0gc2V0X3N0cmluZygpCgkJICAgICAgICAgICAgICAgICAgICAgCgkJICAgICBzLmFwcGVuZCgiYyIpICAgCgkJICAgICBzLmFwcGVuZCgiYSIpICAgCgkgICAgICAgICAgICAgcy5hcHBlbmQoImIiKQoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImFiYyIgCgoJCWFkdmFuY2UgdGhlIGl0ZXJhdG9yIGFzIGluIEMrKwoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgY3VycmVudCArPSAxCiAgICAgICAgICAgICAgICAgICAgIHByaW50IGN1cnJlbnQudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgCgkJbm93IHVzaW5nIHRoZSByZXZlcnNlIG9wZXJhdG9ycwoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMucmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLnJlbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCgkgICAgICAgIG9yIHRoZSAncHJldmlvdXMnIG1ldGhvZAoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGUucHJldmlvdXMoKQogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCiAgICAgICAgICAgICAgICBvciBqdXN0IGFzIGluIGEgcHl0aG9uIGZhc2hpb24KCiAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgTm90ZSAxOiBJdGVyYXRvcnMgaW4gQysrIGFyZSB2ZXJ5IHBvd2VyZnVsLCBidXQKICAgICAgICAgICAgICAgIGRhbmdlcm91cyB0b28uIEFuZCBpbiBweXRob24geW91IGNhbiBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdAogICAgICAgICAgICAgICAganVzdCBsaWtlIGluIEMrKywgc28sIGJlIGNhcmVmdWwuCgkJCgkJTm90ZSAyOiB0aGUgaXRlcmF0b3JzIGFyZSAnbGlnaHQnLCBpZSwgdGhleSBkbyBub3QKCQljb252ZXJ0IHNlcXVlbmNlIGVsZW1lbnRzIHVudGlsIHlvdSByZXF1ZXN0IHRvIGRvIHNvLCB2aWEKCQluZXh0KCksIHZhbHVlKCkgb3IgcHJldmlvdXMoKS4gSWYgeW91IGp1c3QgaW5jcmVtZW50L2RlY3JlbWVudCBvbmUKCQlubyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCSAgICAgICAgICAgICBiICs9IDEKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKCkKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKDIpCgkJICAgICBiLmRlY3IoMikKICAgICAgICAgICAgICAgICAgICAgYi5kZWNyKCkKICAgICAgICAgICAgICAgICAgICAgYiAtPSAxCgoJCSBvbmx5IHRoZSBpdGVyYXRvciBpcyBtb2RpZmllZCwgYW5kIG5vdCB2YWx1ZSB3cmFwcGVyCgkJIGlzIGdlbmVyYXRlZC4gT3RoZXIgdHlwaWNhbCBDKysgb3BlcmF0aW9ucyBhcmUgYWxzbyAKCQkgYXZhaWxhYmxlLCBzdWNoIGFzOgoKCQkgICAgIHByaW50IHMuZW5kKCkgLSBzLmJlZ2luKCkKCQkgICAgID4+PiAzCgkJICAgICBmID0gcy5iZWdpbigpICsgMQoJCSAgICAgcHJpbnQgZi52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICBsID0gcy5lbmQoKSAtIDEKCQkgICAgIHByaW50IGwudmFsdWUoKQoJCSAgICAgPj4+ICJjIgoJCSAKCQkgZXRjLiAgT2YgY291cnNlLCB0aGUgJ2ZpbmQnLCAnaW5zZXJ0JywgJ2VyYXNlJywgYW5kCgkJIHNvIG9uIG1ldGhvZHMgYWxzbyBzdXBwb3J0cyBpdGVyYXRvcnMgbm93LCBpZToKCgkJICAgICAgaSA9IHMuYmVnaW4oKQoJCSAgICAgIGkgKz0gMQoJCSAgICAgIHMuZXJhc2UoaSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaQoJCSAgICAgIHByaW50IHN1bQoJCSAgICAgID4+PiAiYWMiCgkJICAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGVyZSBpcyBubyBtb3JlICd0aGlzb3duJyBhdHRyaWJ1dGUuIElmIHlvdSB1c2UgaXQsIHB5dGhvbgoJICAgIHdpbGwgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnRoaXNvd24pOiAgID09PiAgIGlmIChzZWxmLnRoaXMub3duKCkpOgoJCXNlbGYudGhpc293biA9IDEgICAgID09PiAgIHNlbGYudGhpcy5vd24oMSkKICAgICAgICAgICAgICAgIHNlbGYudGhpc293biA9IDAgICAgID09PiAgIHNlbGYudGhpcy5vd24oMCkKCgkgICAgU3RpbGwsIG1heWJlIGluIHNvbWUgdW51c3VhbCBjYXNlcyB0aGUgdHJhbnNsYXRpb24gd2lsbCBub3QgYmUKCSAgICAxMDAlIGNvcnJlY3QsIHNvIGlmIHlvdSBoYXZlIGEgcHJvYmxlbSwgcGxlYXNlIHJlcG9ydCBpdAoJICAgIGFuZC9vciB1c2UgdGhlIG5ldyAnc2VsZi50aGlzLm93bigpJyBhY2Nlc3Nvci4KCSAgICAKCSAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgVGhlcmUgaXMgbm8gbW9yZSBDbGFzc1B0ciBjbGFzc2VzIGluIHRoZSBweXRob24gY29kZS4gSGVuY2UsCgkgICAgaWYgaW4gdGhlIHBhc3QgeW91IG5lZWRlZCB0byByZXNvcnQgdG8gc29tZSBraW5kIG9mIHRyaWNrZXJ5CgkgICAgd2l0aCB0aGVtLCBvciBvdmVyY29tZSB0aGVpciBwcmVzZW5jZSwgaXQgaXMgbm8gbG9uZ2VyCgkgICAgcmVxdWlyZWQsIGJ1dCB0aGUgZXh0cmEgY29kZSB5b3UgYWRkZWQgY291bGQgbm93IGJyZWFrCgkgICAgdGhpbmdzLgoKCSAgICBJZiBuZWVkZWQsIHlvdSBjYW4gdXNlIHRoZSBvcHRpb24gLWNsYXNzcHRyLCBpLmUuLAoKICAgICAgICAgICAgICAgc3dpZyAtY2xhc3NwdHIgLXB5dGhvbiAuLi4KCgkgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBDbGFzc1B0ciBjbGFzc2VzLgoKCjEwLzMwLzIwMDU6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBNYWtlIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGxpbmthZ2Ugb2YgU1dJR19pbml0IGNvbnNpc3RlbnQuICAKCSAgICBSZXBvcnRlZCBieSBTdGV2ZW4gRy4gSm9obnNvbiAoU0YgcGF0Y2ggMTMxNTQ5OCkuCgoxMC8yNi8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIGdsb2JhbCBsaWJyYXJ5IGRpcmVjdG9yLgoJICAgIE5vdyBpdCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCB1c2UKCSAgICB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgYXMgd2VsbC4KCgkgICAgU28sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAlaW5jbHVkZSBhdHRyaWJ1dGUuaQoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZShBLCBpbnQsIGEsIGdldF9hLCBzZXRfYSk7CgkgICAgICAgCQkJCSAgICAgIAkgIAoJICAgICAgIHN0cnVjdCBBCQkJICAgICAgCSAgCgkgICAgICAgeyAgICAJCQkJICAKCSAgICAgICAgIGludCBnZXRfYSgpIGNvbnN0OyAJCSAgCgkgICAgICAgICB2b2lkIHNldF9hKGludCBhYSk7IAkJICAKCSAgICAgICB9OwkJCQkgIAoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQiwgaW50LCBjKTsKCSAgICAgICAJCQkJCgkgICAgICAgc3RydWN0IEIJCQkKCSAgICAgICB7ICAgIAkJCQoJICAgICAgICAgaW50JiBjKCk7IAkJCgkgICAgICAgfTsgCgoJICAgIHRoZW4gaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0aGUgJ0EuYScgYW5kICdCLmMnIGF0dHJpYnV0ZXMgd2lsbAoJICAgIGJlIHZpc2libGUsIGllLCB5b3UgY2FuIGFjY2VzcyB0aGVtIGFzIHBsYWluIHZhcmlhYmxlczoKCiAgICAgICAgICAgICAgIGYgICA9IEEoKQogICAgICAgICAgICAgICBmLmEgPSAzCiAgICAgICAgICAgICAgIGcgICA9IEIoKQogICAgICAgICAgICAgICBnLmMgPSAzIAogICAgICAgICAgIAoJICAgICAgIGggICA9IGYuYSArIGcuYwoKCSAgICBhbmQgdGhlIHByb3BlciBnZXQvc2V0IG1ldGhvZHMgd2lsbCBiZSBkaXNwYXRjaGVkLiBTZWUKCSAgICBhdHRyaWJ1dGUuaSBmb3IgbW9yZSBpbmZvLgogICAKICAgICAgICAgIC0gTW9yZSBjbGVhbnVwcyBhcm91bmQgYW5kIGFkZGluZyBtb3JlIHRlc3QtY2FzZXMuIFRoZQogICAgICAgICAgICBESVNPV04gdHlwZW1hcCBub3cgaXMgdGVzdGVkIGFuZCB3b3JraW5nIGluIGFsbCB0aGUKICAgICAgICAgICAgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaWUsIHRjbCwKICAgICAgICAgICAgcnVieSwgcGVybCBhbmQgcHl0aG9uLgoJICAgIAoKMTAvMjUvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCwgY29tcGxldGUgdGhlIERJU09XTiB0eXBlbWFwLgoJICAgIAoJICAgIC0gYWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIHVuaWZpZWQgdHlwZW1hcAogICAgICAgICAgICAgIGxpYnJhcnkgKGJlZm9yZSB3YXMgb25seSB1c2FibGUgZnJvbSBweXRob24pLgoKCSAgICAtIHVuaWZ5IHRoZSBuYW1lcyBmb3IgdGhlIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgaW4KCSAgICAgIHBlcmwsdGNsLHJ1YnkgYW5kIHB5dGhvbiwgc28sIHRoZSBhdHRyaWJ1dGUuaSBsaWJyYXJ5CgkgICAgICBjYW4gd29yayBhY3Jvc3MgdGhlbS4KCSAgICAgIAoJICAgIC0gc2VlIHRoZSBsaV9hdHRyaWJ1dGUuaSB0ZXN0LWNhc2Ugb3IgdGhlIGxpYnJhcnkgZmlsZQoKIAkgICAgICAgIExpYi90eXBlbWFwcy9hdHRyaWJ1dGUuc3dnCgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm8gYWJvdXQgaG93IHRvIHVzZSBpdC4KCiAKCSAgICAgIAoKMTAvMjQvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCBub3cgdXNlcyB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkuCgoJICAgIC0gQ2hhbmdlcyBpbiBydWJ5IHRvIHVzZSB0aGUgJHRyYWNrIG9wdGlvbiBpbiB0eXBlbWFwcy4KCgkgICAgLSBDaGFuZ2VzIGluIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSB0byBmb2xsb3cgdGhlCgkgICAgICBjb252ZW50aW9uIHRoYXQgYWxsIG1hY3JvcyB0aGF0IGFyZSBub3QgdXNlZCBpbiB0aGUKCSAgICAgIEMvQysrIHNpZGUgc3RhcnRzIHdpdGggJSwgc3VjaCBhcwoKCSAgICAgICAgICAgJWRlbGV0ZQoJCSAgICVuZXdfYXJyYXkKCiAgICAgICAgICAgICAgZXRjLgoJICAgICAgCgkgICAgLSBEb2N1bWVudGluZyBmcmFnbWVudHMsIHNlZSBmcmFnbWVudHMuc3dnLgoKCSAgICAtIENsZWFuZXIgd2F5IHRvIHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGluY2x1ZGUKCSAgICAgIGp1c3QgPHR5cGVtYXBzL3N3aWd0eXBlcy5zd2c+LgoKCSAgICAgIENoZWNrIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IHBlcmwsIHRjbCwgcnVieSwKCSAgICAgIHB5dGhvbi4KCgkgICAgICBBbHdheXMgc3RhcnQgd2l0aCB0aGUgaGVhZCBmaWxlLCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dGhvbi5zd2cKCSAgICAgICAgIHRjbC90Y2w4LnN3ZwoJICAgICAgICAgcnVieS9ydWJ5LnN3ZwoJICAgICAgICAgcGVybDUvcGVybDUuc3dnCgogICAgICAgICAgICAgIGFuZCB0aGUgcHJpbmNpcGFsIGZpbGUgdGhhdCBpbnZva2VzIHRoZSB1bmlmaWVkIGxpYnJhcnksIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgdGNsL3RjbHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBydWJ5L3J1Ynl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcGVybC9wZXJsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAKCSAgICAgIFRoZSBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIGVhY2gKCSAgICAgIGxhbmd1YWdlIGFyZSB0aGUgb25lIHRoYXQgcHJvdmlkZXMgdGhlIGJhc2ljIHR5cGVzOgoKCSAgICAgICAgIHB5dGhvbi9weXByaW10eXBlcy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgdGNsL3RjbHByaW10eXBlcy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJscHJpbXR5cGVzLnN3ZwoKCSAgICAgIGFuZCB0aGUgc3RyaW5nIG1hbmlwdWxhdGlvbjogIAkgCgkgICAgCgkgICAgICAgICBweXRob24vcHlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXN0cmluZ3Muc3dnCQoJICAgICAgICAgdGNsL3RjbHN0cmluZ3Muc3dnCQoJICAgICAgICAgcGVybDUvcGVybHN0cmluZ3Muc3dnCgoJCSAKCSAgICAgIFRoZSByZXN0IG9mIHRoZSBmaWxlcywgc3VjaCBhcyBjYXJyYXkuaSwgYXJlIG1vc3RseSBvbmUgCgkgICAgICBsaW5lIGZpbGVzIHRoYXQgaW5jbHVkZSB0aGUgcHJvcGVyIHR5cGVtYXAgbGlicmFyeQoJICAgICAgdmVyc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFBlcmwgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBleHBlY3RlZCBiZWhhdmlvciBpbiBQZXJsLgoKMTAvMjMvMjAwNTogd3V6emViCiAgICAgICAgICAgIENoaWNrZW46CiAgICAgICAgICAgICAgKyBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGZpbmFsbHkgd29yayBwcm9wZXJseQogICAgICAgICAgICAgICsgYWRkIHRlc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNwcF9iYXNpYy5pCgoxMC8yMC8yMDA1OiBkYW5jeQoJICAgIFthbGxlZ3JvY2xdIEFkZGVkIEMrKyBzdXBwb3J0LiBMYXJnZSB1cGRhdGUsIG1hbnkgY2hhbmdlcy4gU2VlCgkgICAgbmV3bHkgYWRkZWQgQWxsZWdybyBDb21tb24gTGlzcCBzZWN0aW9uIGluIGxpc3AuaHRtbAoKMTAvMjAvMjAwNTogbW1hdHVzCgkgICAgUnVieSwgVGNsLCBQeXRob246CgoJICAgIC0gVW5pZm9ybSB3YXkgdG8gZmFpbCAobGFiZWwgZmFpbDopLCBub3cgZmluYWxseQoJICAgICAgU1dJR19leGNlcHRpb24gd29ya3MgYWNyb3NzIHRoZSB0aHJlZSBsYW5ndWFnZXMgYW5kIGFsbAoJICAgICAgdGhlIHR5cGVtYXBzLgoKCSAgICAtIEFkZCBwcm9wZXIgY2xlYW51cCBjb2RlIHRvIHJ1YnkKCgkgICAgLSBNb3JlIHZhbGdyaW5kIGZpeGVzCgoJICAgIC0gU2ltcGxpZnkgdGhlIGlubGluZSB1c2UsIGl0IHNlZW1zIGEgc21hbGwgaW50ZXJmYWNlIG9mCgkgICAgICAyMCwwMDAgbGluZXMgKHBsdXMgbWFueSBtYW55IHRlbXBsYXRlcykgY2FuIGJyZWFrIAoJICAgICAgZ2NjIC1PMyBlYXNpbHkuCgoJICAgIC0gRmluYWxpemUgdGhlIHR5cGVtYXBzIGxpYnJhcnkuIEFsbCB0aGUgb2xkICAqLmkgZmlsZXMKCSAgICAgIChjYXJyYXkuaSwgY3BvaW50ZXIuaSwgZXhjZXB0aW9uLmkpIGhhZCBiZWVuIGltcGxlbWVudGVkCgkgICAgICBpbiB0aGUgbmV3IHR5cGVtYXBzIGxpYnJhcnkuCgkgICAgCgoxMC8xOS8yMDA1OiB3dXp6ZWIKCSAgICBVcGRhdGUgdGhlIFJ1bnRpbWUgVHlwZW1hcCBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwKCjEwLzE4LzIwMDU6IHd1enplYgoJICAgIENoaWNrZW46CgkgICAgICAtIENvcnJlY3RseSBoYW5kbGUgJWlnbm9yZWQgY2xhc3NlcwogICAgICAgICAgICAgIC0gQ29ycmVjdGx5IGNvbnZlcnQgbG9uZywgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nLCBldGMKICAgICAgICAgICAgICAgIHRvIGNoaWNrZW4gcHJpbWl0aXZlcy4gKFRoYW5rcyB0byBGZWxpeCBXaW5rZWxtYW5uKQogICAgICAgICAgICAgIC0gVXNpbmcgYXJnb3V0IHBhcmFtZXRlcnMgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIHdhcyBhCiAgICAgICAgICAgICAgICB3cmFwcGVkIHBvaW50ZXIgY2F1c2VkIGEgbWVtb3J5IGNvcnJ1cHRpb24uICBUaGUgY2hpY2tlbgogICAgICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3IgbW92ZWQgYSBwb2ludGVyIG91dCBmcm9tIHVuZGVyIHVzLgogICAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYnkgcnVubmluZyBhbGwgdGhlIHByb3h5IGNyZWF0aW9uCiAgICAgICAgICAgICAgICBmdW5jdGlvbnMgYXMgY29udGludWF0aW9ucyBhZnRlciB0aGUgd3JhcHBlciBmdW5jdGlvbgogICAgICAgICAgICAgICAgcmV0dXJucy4gIEFzIHBhcnQgb2YgdGhpcywgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlCiAgICAgICAgICAgICAgICBjaGlja2VuZmFzdHByb3h5IGZsYWcgb24gb3V0cHV0IHR5cGVtYXBzLgogICAgICAgICAgICAgIC0gdXNpbmcgLXByb3h5IGFuZCAtbm9jb2xsZWN0aW9uIHRvZ2V0aGVyIHdvcmtzIG5vdwogICAgICAgICAgICAgICAgQmVmb3JlLCBpdCB3YXMgbm90IGV4cG9ydGluZyB0aGUgZGVzdHJ1Y3RvciBpbiB0aGUgcHJveHkKICAgICAgICAgICAgICAgIHdyYXBwZXIuCgoxMC8xOC8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBBZGRlZCB0aGUgVW5pZmllZCBUeXBlbWFwIExpYnJhcnkgKFVUTCkuIEl0IHVuaWZpZXMgdGhlIHR5cGVtYXBzIGZvcgoKIAkgICAgICAgIHB5dGhvbiwgcnVieSwgdGNsCgoJICAgIGFuZCBpbiB0aGUgcHJvY2VzcywgZml4ZXMgc2V2ZXJhbCBwcm9ibGVtcyBpbiBlYWNoIG9mIHRoZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0byB3b3JrIGluIGEgImNhbm9uaWNhbCIgd2F5IG5vdyBlc3RhYmxpc2hlZCBpbgoJICAgIHRoZSB0eXBlbWFwIGxpYnJhcnkKCSAgICAKCSAgICAgICBTV0lHL0xpYi90eXBlbXBhcwoKCSAgICBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVuaWZpY2F0aW9uIGlzIHRoYXQgZXZlcnl0aGluZwoJICAgIGNvbXBpbGVzIGFuZCBydW5zIGluc2lkZSB0aGUgdGVzdC1zdWl0ZSBhbmQgZXhhbXBsZXMKCSAgICBkaXJlY3Rvcmllcy4gQW5kIGZvciB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRoYW4gcGFzcyB0aGUgcHJpbWl0aXZlX3R5cGVzLmkgY2FzZS4KCgkgICAgQWxzbywgd2UgaGF2ZSBhIHVuaWZvcm0gd2F5IHRvIHRyZWF0IHRoZSBlcnJvcnMsIGZvciBleGFtcGxlCgkgICAgaWYgeW91IGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgPj4+IGZyb20gcHJpbWl0aXZlX3R5cGVzIGltcG9ydCAqCiAgICAgICAgICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMCkKICAgICAgICAgICAgICAxMAoJICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMDAwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToJCSAgICAgIAoJICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CQkJICAgIAoJICAgICAgT3ZlcmZsb3dFcnJvcjogaW4gYXJndW1lbnQgMSBvZiB0eXBlICd1bnNpZ25lZCBjaGFyJwoKCSAgICB5b3UgZ2V0IHRoZSBzYW1lIGV4Y2VwdGlvbiBpbiBhbGwgdGhlIHRocmVlIGxhbmd1YWdlcy4KCSAgICAKCSAgICBBbmQgd2VsbCwgbWFueSBtb3JlIGdvb2QgdGhpbmdzIHdpbGwgY29tZSBmcm9tIHRoaXMKCSAgICB1bmlmaWNhdGlvbiwgZm9yIGV4YW1wbGUsIHByb3BlciBzdXBwb3J0IG9mIHRoZSBTVEwvU1REIGNsYXNzZXMKCSAgICBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCBob3BlZnVsbHksIHdlIGNhbiBrZWVwCgkgICAgYWRkaW5nIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgVGhlIGhhcmRlc3QgcGFydCwgd3JpdGluZyBhIGNvbW1vbiB0eXBlbWFwIGxpYnJhcnkKCSAgICB0aGF0IHN1aXRlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGxhbmd1YWdlcywgaXMgZG9uZSwKCSAgICBhbmQgYWRkaW5nIGFub3RoZXIgbGFuZ3VhZ2Ugc2hvdWxkIG5vdyBiZSBlYXN5LiAKCgkgICAgU3RpbGwgdGhlIGdsb2JhbCB1bmlmaWNhdGlvbiBpcyBub3QgY29tcGxldGUsIHRoZSBTVEwvU1REIAoJICAgIHBhcnQgaXMgbmV4dCwgYW5kIHByb2JhYmx5IGFzIHdlbGwgYXMgYWRkaW5nIG9uZSBvciB0d28gbW9yZQoJICAgIGxhbmd1YWdlcy4KCgkgICAgSWYgeW91IGFyZSBjdXJpb3VzLCBsb29rIGF0IHRoZSBweXRob24sIHJ1YnkgYW5kL29yIHRjbAoJICAgIGRpcmVjdG9yaWVzIHRvIHNlZSB3aGF0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBuZXcKCSAgICBjb21tb24gdHlwZW1hcHMgbGlicmFyeS4gIFN0aWxsLCB0aGUgZmluYWwgd2F5IHRvCgkgICAgaW50ZWdyYXRlIGEgbmV3IGxhbmd1YWdlIGNvdWxkIGNoYW5nZSBhcyB3ZSBtb3ZlIHRvCgkgICAgaW50ZWdyYXRlIHRoZSBTVEQvU1RMLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUnVieS9UY2wgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBiZWhhdmlvciwgc3BlY2lhbGx5IGluIHJ1YnkgYW5kIHRjbC4KClZlcnNpb24gMS4zLjI3IChPY3RvYmVyIDE1LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHR5cGVzYWZlIGVudW0gd3JhcHBpbmcgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwogICAgICAgICAgICBvdmVybG9hZCBhIG1ldGhvZCB3aXRoIDIgZGlmZmVyZW50IGVudW0gdHlwZXMuCgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVmZWF0dXJlKCJpbW11dGFibGUiLCIwIikgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBzZXR0ZXJzCiAgICAgICAgICAgIGZvciBjb25zdGFudHMuCgogICAgICAgICAgICBSZXN0b3JlZCAlaW1tdXRhYmxlIGFuZCAlbWFrZWRlZmF1bHQgdG8gY2xlYXIgdGhlIGZlYXR1cmUgYXMgaXQKICAgICAgICAgICAgYmVoYXZlZCBpbiBTV0lHLTEuMy4yNSBhbmQgZWFybGllci4KCjEwLzE0LzIwMDU6IG1tYXR1cwogICAgICAgICAgICBGaXggYnVnIGluIGFub255bW91cyB0eXBlZGVmIHN0cnVjdHVyZXMgd2hpY2ggd2FzIGxlYWRpbmcgdG8KICAgICAgICAgICAgc3RyYW5nZSBiZWhhdmlvdXIuCgoxMC8xMy8yMDA1OiBtbWF0dXMKCSAgICBTZXZlcmFsIG1pbm9yIGNoYW5nZXM6CgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSB3Y2hhcl90IHR5cGUgc3VwcG9ydAoJICAgIC0gQWRkIGEgd2FybmluZyBmb3Igd2hlbiB5b3UgZGVmaW5lIHRoZSAnaW4nIHR5cGVtYXAgYnV0CgkgICAgICB5b3UgZG9uJ3QgZGVmaW5lIHRoZSAndHlwZWNoZWNrJyBvbmUuIFZlcnkgY29tbW9uIG1pc3Rha2UuCgkgICAgLSBBZGQgcHJvcGVyIGRlZmF1bHQgcnVsZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMsIG5vdyB5b3UKCSAgICAgIGNhbiBkZWZpbmUgYSB0eXBlbWFwIHN1Y2ggYXM6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICgoKikoQU5ZKSkgey4uLn0KCgkgICAgICBUaGF0IHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBwb2ludGVyIHRvIGZ1bmN0aW9ucy4gVGhlCgkgICAgICBydWxlIGluIEMrKyBhbHNvIGFwcGx5IHRvIHRoZSBmdW5jdGlvbiAncmVmZXJlbmNlJywgaWUsCgkgICAgICBpbiBib3RoIGNhc2VzCgoJICAgICAgICB0eXBlZGVmICBpbnQgKCpmcHRyKShpbnQgYSk7CgkgICAgICAgIHR5cGVkZWYgIGludCAoZnVuYykoaW50IGEpOwoKCSAgICAgIFRoaXMgd2FzIG5lZWRlZCBzaW5jZSBpdCBzZWVtcyB0byBiZSAnaWxsZWdhbCcgaW4gQysrIHRvCgkgICAgICBkbyBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGZwdHIpOwoKCSAgICAgIGFuZCBwcm9iYWJseSwgYXMgZm9yIG1lbWJlciBmdW5jdGlvbnMsIGl0IGlzIG5vdAoJICAgICAgd2FycmFudGllZCB0aGF0IHRoZSBwb2ludGVyIHNpemVzIHdpbGwgbWF0Y2guCgoJICAgIC0gQWRkIHRoZSAjZXJyb3IvI3dhcm5pbmcgZGlyZWN0aXZlcyB0byBzd2lnJ3MgY3BwLgoKCSAgICAtIEFkZCB0aGUgbm9ibG9jayBvcHRpb24gZm9yIHR5cGVtYXBzLCB3aGljaCBpcyB1c2VkIGFzCiAgICAgICAgICAgICAgZm9sbG93czogc3VwcG9zZWQgeW91IGEgdHlwZW1hcCwgbGlrZSB0aGlzCgoJICAgICAgCgkgICAgICAldHlwZW1hcChpbixub2Jsb2NrPTEpIEhlbGxvIHsJCQkgICAKCSAgICAgICAgIC4uLi4KICAgICAgICAgICAgICB9CgoJICAgICAgdGhlbiB0aGUgdHlwZW1hcCB3aWxsIGJlIGluc2VydGVkIHdpdGhvdXQgdGhlIGJsb2NrCgkgICAgICBpbXBvc2VkIGJ5IHRoZSBicmFja2V0cywgc2ltaWxhciB0bwoKCSAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIi4uLiIKCgkgICAgICBTbywgd2h5IHlvdSBkb24ndCBqdXN0IHVzZSB0aGUgcXVvdGUgc3R5bGU/LCBiZWNhdXNlOgoJICAgICAgCgkgICAgICAgICAxLi0gVGhlIHF1b3RlIHN0eWxlIGRvZXNuJ3QgZ2V0IHByZXByb2Nlc3NlZCwgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxPSBTV0lHX21hY3JvKCQxKTsiCgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiCgoJCSAzLi0gWW91IGNhbid0IG1ha2UgZW1hY3MgYW5kL29yIG90aGVyIGVkaXRvcnMKCQkgICAgIHRvIGluZGVudCBpbnNpZGUgYSBzdHJpbmchLiAKCgoJICAgICAgU28sIHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJsb2NrPywgYmVjYXVzZSBhbiBleHRyYQoJICAgICAgYmxvY2sgd2hlbiBub3QgbmVlZGVkIChubyBsb2NhbCB2YXJpYWJsZXMgaW4gaXQpOgoKCSAgICAgICAgICAxLi0gbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQKICAgICAgICAgICAgICAgICAgMi4tIG1ha2VzIHRoZSBjb2RlIGxhcmdlcgogICAgICAgICAgICAgICAgICAzLi0gb3IgaW4gc2hvcnQsIGZvciB0aGUgc2FtZSByZWFzb24gd2UgaGF2ZSB0aGUgcXVvdGUgc3R5bGUuCgpWZXJzaW9uIDEuMy4yNiAoT2N0b2JlciA5LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkZWQgJ3Rocm93cycgdHlwZW1hcHMuCgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlCiAgICAgICAgICAgIGZpcnN0IG5vbi1pZ25vcmVkIGNsYXNzIGluIHRoZSBwdWJsaWMgYmFzZSBjbGFzcyBsaXN0IGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlLgogICAgICAgICAgICBieSB0aGUgcHJveHkgY2xhc3MuIFByZXZpb3VzbHksIGlmIHRoZSBmaXJzdCBjbGFzcyBpbiB0aGUgbGlzdCB3YXMgaWdub3JlZCwgdGhlbgogICAgICAgICAgICB0aGUgcHJveHkgY2xhc3Mgd291bGRuJ3QgaGF2ZSBhbnkgYmFzZSBjbGFzc2VzLgoKMTAvMDcvMjAwNTogbW1hdHVzCgkgICAgIFVwZGF0ZSBtb3JlIGZlYXR1cmVzIHRvIGZvbGxvdyBuZXcgY29udmVudGlvbiwgaW5jbHVkaW5nOgoKCSAgICAgICBjYWxsYmFjawoJICAgICAgIHJlZi91bnJlZgoJICAgICAgIGV4Y2VwdAoJICAgIAoJICAgICBBbGwgb2YgdGhlbSB1c2Ugbm90IG9ubHkgdGhlIGZlYXR1cmUgYXMgYSBmbGFnLCBidXQgYWxzbwoJICAgICBhcyBjb2RlIHZhbHVlLiBUbyBkZWFsIHdpdGggdGhvc2UgZmVhdHVyZXMsIHdlIHVzZSBub3cKCSAgICAgR2V0RmxhZ0F0dHIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gR2V0RmxhZywgYnV0IGluc3RlYWQgb3IKCSAgICAgcmV0dXJuaW5nIDEgb3IgMCwgaXQgcmV0dXJucyB0aGUgYXR0ciB2YWx1ZSwgaWYgaGFwcGVucwoJICAgICB0byBiZSBkaWZmZXJlbnQgb2YgIjAiIG9mIGNvdXJzZS4KCgkgICAgIE5vdyB0aGVyZSBhcmUgYWxzbyBtb3JlIHVuaWZvcm0gZGlyZWN0aXZlIG5hbWVzIGZvciB0aGUgCgkgICAgIG9uZXMgYmFzZWQgaW4gZmVhdHVyZXMsIGZvciBleGFtcGxlLCBmb3IgdGhlIG9sZAoJICAgICAlbmV3b2JqZWN0IGRpcmVjdGl2ZSBub3cgd2UgaGF2ZSB0aHJlZSBkaXJlY3RpdmVzIGRlZmluZWQ6CgkgICAgIAoKCSAgICAgI2RlZmluZSAlbmV3b2JqZWN0ICAgICAgICAlZmVhdHVyZSgibmV3IikKCSAgICAgI2RlZmluZSAlbm9uZXdvYmplY3QgICAgICAlZmVhdHVyZSgibmV3IiwiMCIpCgkgICAgICNkZWZpbmUgJWNsZWFybmV3b2JqZWN0ICAgJWZlYXR1cmUoIm5ldyIsIiIpCgoJICAgICBhbmQgc28gb24gZm9yIGFsbCB0aGUgb3RoZXIgZmVhdHVyZSBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8zMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHNvbWUgZmVhdHVyZXMuIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1hbnkKICAgICAgICAgICAgZmVhdHVyZXMgb25jZSB0aGV5IGhhZCBiZWVuIGVuYWJsZWQuIFRoaXMgd2FzIGZvciBtb3N0IGZlYXR1cmVzIHRoYXQgYmVoYXZlIGFzCiAgICAgICAgICAgIGZsYWdzLiBUaGVzZSBmZWF0dXJlcyBub3cgd29yayBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIpICAgICAgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMSIpICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjAiKSAgICAgICAgIC8vIGRpc2FibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiIikgICAgICAgICAgLy8gY2xlYXJzIHRoZSBmZWF0dXJlCgogICAgICAgICAgICBJbiBmYWN0IGFueSBub24tZW1wdHkgdmFsdWUgb3RoZXIgdGhhbiAiMCIgd2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgKGxpa2UgQyBib29sZWFuIGxvZ2ljKS4KICAgICAgICAgICAgUHJldmlvdXNseSAiMSIsICIwIiBvciBhbnkgb3RoZXIgbm9uLWVtcHR5IHZhbHVlIHdvdWxkIGVuYWJsZSB0aGUgZmVhdHVyZSBhbmQgaXQgd291bGQKICAgICAgICAgICAgb25seSBiZSBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSBmZWF0dXJlIGJ5IGNsZWFyaW5nIGl0IChhc3N1bWluZyB0aGVyZSB3YXMgbm8gZ2xvYmFsIGVuYWJsZSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBhZmZlY3RlZDoKCiAgICAgICAgICAgICAgYWxsb3dleGNlcHQKICAgICAgICAgICAgICBjb21wYWN0ZGVmYXVsdGFyZ3MKICAgICAgICAgICAgICBjbGFzc2ljICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgY3M6Y29uc3QgICAgICAgICAgICAgICAoQyMpCiAgICAgICAgICAgICAgZGlyZWN0b3IKICAgICAgICAgICAgICBleGNlcHRpb25jbGFzcyAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgaWdub3JlCiAgICAgICAgICAgICAgaW1tdXRhYmxlCiAgICAgICAgICAgICAgamF2YTpjb25zdCAgICAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBqYXZhOmRvd25jYXN0ICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGt3YXJncwogICAgICAgICAgICAgIG1vZGVybiAgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBuZXcKICAgICAgICAgICAgICBub2F1dG9kb2MgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbm9kZWZhdWx0CiAgICAgICAgICAgICAgbm9kaXJlY3RvcgogICAgICAgICAgICAgIG5vcmVmCiAgICAgICAgICAgICAgbm90YWJzdHJhY3QKICAgICAgICAgICAgICBub3VucmVmCiAgICAgICAgICAgICAgbm92YWx1ZXdyYXBwZXIKICAgICAgICAgICAgICBweXRob246bWF5YmVjYWxsICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgcHl0aG9uOm5vbmR5bmFtaWMgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG1vZHVsYTM6bXVsdGlyZXR2YWwgICAgKE1vZHVsYTMpCiAgICAgICAgICAgICAgcHJlZGljYXRlICAgICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB0cmFja29iamVjdHMgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHZhbHVld3JhcHBlcgoKICAgICAgICAgICAgSXQgaXMgbm93IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB0byBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcyBpbiBhIGhlYWRlciBmaWxlLCBleGNlcHQgZm9yIGEKICAgICAgICAgICAgZmV3IHRhcmdldHRlZCBtZXRob2RzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIHNvbWVfZnVuY3Rpb24oaW50LCBkb3VibGUpOyAvLyBkbyBub3QgaWdub3JlIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczsgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgQ2xhc3MKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczo6bWV0aG9kOyAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJpZ2hlYWRlci5oIgoKICAgICAgICAgICAgUmVtb3ZlZCAlcHl0aG9uZHluYW1pYyAtIGl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVXNlICVweXRob25ub25keW5hbWljIGluc3RlYWQuCiAgICAgICAgICAgIFJlbW92ZWQgJWZlYXR1cmUoIm5va3dhcmdzIikgLSBpdCB3YXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgIC0gdXNlICVmZWF0dXJlKCJrd2FyZ3MiLCIwIikgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMjUvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gQWRkICJ0aHJvd3MiIHR5cGVtYXBzLgoKMDkvMjQvMjAwNTogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XSBBZGRzIG5ldyAldHJhY2tvYmplY3RzIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXBzIEMrKyBvYmplY3RzIHRvCiAgICAgICAgICAgIFJ1Ynkgb2JqZWN0cy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBpbXBsZW1lbnQKICAgICAgICAgICAgbWFyayBmdW5jdGlvbnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIHJlZmVyIHRvIHRoZSB1cGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCiAgICAgICAgICAgIAowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGF0Y2ggMTExNjQzMSBmcm9tIEpvc2ggQ2hlcnJ5LiBGaXhlcyBub24gbWVtYmVyIGZ1bmN0aW9ucyBpbmFkdmVydGVudGx5CiAgICAgICAgICAgIGJlaW5nIGNhbGxlZCBpbnN0ZWFkIG9mIG1lbWJlciBmdW5jdGlvbnMuCgowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCBmcm9tIE1hcmsgR29zc2FnZSB0byBhZGQgc3VwcG9ydCBmb3IgTHVhLTUuMSwgc3RkOjpzdHJpbmcsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yLCBzdGQ6OmV4Y2VwdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCjA5LzE0LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCAtbm9jcHBjYXN0LiBOb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KCSAgICBhbHdheXMgdXNlIHRoZSBjcHBjYXN0IG9wZXJhdG9ycy4gQmVmb3JlIHRoYXQgd2FzIHRoZSBjYXNlCgkgICAgb25seSB3aGVuIHlvdSB1c2VkIHRoZSAtY3BwY2FzdCBvcHRpb24uCgogICAgICAgICAgICBJZiB0aGlzIHNlZW1zIHRvIGJyZWFrIHlvdXIgY29kZS4uLiB5b3VyIHdlbGNvbWUhLCBpdAoJICAgIG1lYW5zIGl0IHdhcyBicm9rZW4gYmVmb3JlLCBhbmQgeW91IG5ldmVyIG5vdGljZS4gCgoJICAgIElmIHlvdSB0aGluZyB0aGUgZXJyb3IgaXMgZHVlIHRvIG9uZSBvZiB0aGUgU1dJRyB0eXBlbWFwcywKCSAgICBzZW5kIHVzIGFuIGV4YW1wbGUuCgoJICAgIFVzZSAtbm9jcHBjYXN0IG9ubHkgd2l0aCB2ZXJ5IG9sZCBDKysgY29tcGlsZXJzIHRoYXQKCSAgICBkbyBub3Qgc3VwcG9ydCB0aGUgY3BwY2FzdCBvcGVyYXRpb25zLiAKCgkgICAgU28sIGhlcmUgYXBwbGllczoKCgkJVGhpcyBjaGFuZ2UgZG9lc24ndCBicmVhayBjb21wYXRpYmlsaXR5LCBpdCB3YXMgYnJva2VuIGJlZm9yZS4KCjA5LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9yIG1ldGhvZHMgd2hlbiBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhcyBhCiAgICAgICAgICAgIHBhcmFtZXRlci4KCjA5LzExLzIwMDU6IG1tYXR1cwogICAgICAgICAgICBBZGRpbmcgdGhlIG1vZHVsZSBvcHRpb24gdG8gdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBOb3cgeW91CiAgICAgICAgICAgIGNhbiB1c2UgaXQgYXMKCgkgICAgICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCSAgICB3aGVyZSBzdWJmaWxlIGNvdWxkIChvciBub3QpIGRlZmluZSB0aGUgbW9kdWxlIG5hbWUgdmlhCgkgICAgdGhlICVtb2R1bGUgZGlyZWN0aXZlLiBUaGUgbW9kdWxlIG9wdGlvbiB0YWtlIHByZWNlZGVuY2UKCSAgICBhbmQgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdHMgdGhhbiBoYXZpbmcgdGhlIGRpcmVjdGl2ZSAKCgkgICAgICAgICVtb2R1bGUgQmlnTW9kdWxlICAKCgkgICAgaW5zaWRlIHRoZSBpbXBvcnRlZCBmaWxlIGZvby5pLgoKCSAgICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9uIGluIG1haW5seSB0d28gY2FzZXM6CgoJICAgIDEuLSBZb3UgdXNlZCB0aGUgLW1vZHVsZSBvcHRpb24gd2hlbiB5b3UgZ2VuZXJhdGVkIHRoZQogICAgICAgICAgICAgICAgbW9kdWxlIHRvIGJlIGltcG9ydGVkLCBhbmQgaGVuY2UgdGhlIG1vZHVsZSBuYW1lIGluCiAgICAgICAgICAgICAgICB0aGUgaW1wb3J0ZWQgJW1vZHVsZSBkaXJlY3RpdmUgaXMgbm90IHJlYWxseSB1c2VmdWwuCgoJICAgIDIuLSBUaGUgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydCBpcyB2ZXJ5IGxhcmdlLCBhbmQgaXQKICAgICAgICAgICAgICAgIGhhcyBzZXZlcmFsIC5pLy5oIGZpbGVzLiBUaGVuLCBpZiB5b3UganVzdCBvbmUgdG8KICAgICAgICAgICAgICAgIGltcG9ydCBhIGNsYXNzIG9yIHNvIGZyb20gdGhlIG1vZHVsZSwgc2F5cyAnZm9vJywgYW5kCiAgICAgICAgICAgICAgICBub3QgdGhlIGVudGlyZSBtb2R1bGUgdmlhIGltcG9ydGluZyB0aGUgbWFpbgogICAgICAgICAgICAgICAgQmlnTW9kdWxlLmkgZmlsZSwgdGhlbiB5b3UganVzdCBkbzoKCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmgKCiAgIAkgICAgICAgIG9yCgkJCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkJd2hlcmUgZm9vLmkgY29udGFpbnMgdGhlICdmb28nIGRlY2xhcmF0aW9uIGFuZCBtYXliZSBhCgkJY291cGxlIG9mIGV4dHJhICVpbmNsdWRlIGRpcmVjdGl2ZXMsIGFzIG5lZWRlZC4KCgkgICAgCjA5LzExLzIwMDU6IG1tYXR1cwoJICAgIEZpeCBidWcgIzEyODI2MzcsIGFib3V0IHRoZSAtbW9kdWxlIG9wdGlvbiBub3QgaGF2aW5nIGVmZmVjdAoJICAgIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgbmVlZGVkLgoKMDkvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgV2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHR5cGVtYXBzIHVzZWQgZm9yIHRoZQogICAgICAgICAgICBzZXQgd3JhcHBlcnMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBnZXQgd3JhcHBlcnMuIEkgZG91YnQgdGhpcyB3YXMgYQogICAgICAgICAgICBwcm9ibGVtIGZvciBhbnkgbGFuZ3VhZ2VzIGV4Y2VwdCBmb3IgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgbnVsbCBhdHRyaWJ1dGUKICAgICAgICAgICAgaW4gdGhlIG91dCB0eXBlbWFwIChDIyBvbmx5KS4KCjA5LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMgd2hlbiBmaWxlcyBmYWlsIHRvIG9wZW4uCgowOS8wNi8yMDA1OiBtbWF0dXMgCgoJICAgIEFsbG93IGEgJWRlZmluZSBhIG1hY3JvIGluc2lkZSBhbm90aGVyICVkZWZpbmUgbWFjcm8sIGZvciBleGFtcGxlCgoJICAgICAgJWRlZmluZSBoZWxsbyhuYW1lLCBUeXBlKQoJICAgICAgJWRlZmluZSBuYW1lICMjIGEoVHlwZSkKCSAgICAgICV0eXBlbWFwKGluKSBUeXBlICJoZWxsbzsiCgkgICAgICAlZW5kZGVmCgkgICAgICAlZW5kZGVmCgkgICAgICAKCSAgICBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgbmV3IGZlYXR1cmVzIGluIHlvdXIgb3duIHR5cGVtYXBzIGxpYnJhcnksIHNlZQoJICAgIHB5dGhvbi9jc3RyaW5nLmksIHB5dGhvbi9jd3N0cmluZy5pIGFuZCBweXRob24vY3dzdHJiYXNlLmkuCSAgICAKCiAgICAgICAgICAgIFtQeXRob25dIE5vcm1hbGl6ZSB0aGUgY3N0cmluZy5pIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmcmFnbWVudHMsIGFuZCBhZGQKICAgICAgICAgICAgY3dzdHJpbmcuaSwgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2FtZSB0eXBlbWFwcyBidXQgZm9yIHdjaGFyX3Qgc3RyaW5ncy4KCgkgICAgW1B5dGhvbl0gQnVnIGZpeGVkOiAxMjQ3NDc3LCAxMjQ1NTkxLCAxMjQ5ODc4IGFuZCBvdGhlcnMuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gSW1wbGVtZW50IHN1cHBvcnQgZm9yIFNXSUdUWVBFKiBESVNPV04gdHlwZW1hcCAobGlrZSBpbiBQeXRob24pIGZvcgogICAgICAgICAgICBiZXR0ZXIgY29udHJvbCBvZiBtZW1vcnkgbWFuYWdlbWVudCwgZWcgd2hlbiBhZGRpbmcgYW4gb2JqZWN0IGNyZWF0ZWQgaW4gUnVieQogICAgICAgICAgICB0byBhIEMrKyBjb250YWluZXIuIFBhdGNoICMxMjYxNjkyIGZyb20gQ2hhcmxpZSBTYXZhZ2UuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSA2NCBiaXQgcGxhdGZvcm0gZml4ZXMgZm9yIHRoZSB2YXJhcmdzIGhhbmRsaW5nIGluIFNXSUdfR2V0QXJncy4gVGhpcyBpcyBhbgogICAgICAgICAgICBpbXByb3ZlZCBmaXggZm9yIGJ1ZyAjMTAxMTYwNCBhcyBzdWdnZXN0ZWQgYnkgSmVyZW15IExpbi4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEJ1ZyAjMTI0MDQ2OSAtICVuZXdvYmplY3Qgc3VwcG9ydCBmb3IgVGNsLiBQYXRjaCBmcm9tIEJvYiBNYXJpbmllci4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBCdWcgIzEyNTQ0OTQgLSBGaXggZm9yIGdsb2JhbCBuYW1lc3BhY2UgcG9sbHV0aW9uIGJ5IHBlcmwgaGVhZGVyIGZpbGVzCiAgICAgICAgICAgIChib29sIGRlZmluZSkgcHJldmVudGVkIFNUTCBoZWFkZXJzIGZyb20gYmVpbmcgdXNlZCBvbiBzb21lIHN5c3RlbXMsIGVnCiAgICAgICAgICAgIFdpbmRvd3Mgd2l0aCBWaXN1YWwgU3R1ZGlvLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMTI0MDkzNyAtIFJlZGVmaW5pdGlvbiBvZiBfX2ludDY0IHR5cGVkZWYgZm9yIEludGVsIGNvbXBpbGVycy4KCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEJ1ZyAjMTI1MTgzMiAtICBDKysgdGVtcGxhdGUgbWF5IGdlbmVyYXRlIGludmFsaWQgWE1MIGZpbGUKCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFN1cHBvcnQgYWRkZWQgZm9yIEx1YS4gUGF0Y2ggIzEyNDI3NzIgZnJvbSBNYXJrIEdvc3NhZ2UuCiAgICAgICAgICAgIEl0IHN1cHBvcnRzIG1vc3QgQy9DKysgZmVhdHVyZXMgKGZ1bmN0aW9ucywgc3RydWN0LCBjbGFzc2VzLCBhcnJheXMsIHBvaW50ZXJzLAogICAgICAgICAgICBleGNlcHRpb25zKSwgYXMgd2VsbCBhcyBsb3RzIG9mIGRvY3VtZW50YXRpb24gYW5kIGEgZmV3IHRlc3QgY2FzZXMgJiBleGFtcGxlcy4KCjA4LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEZpeCBpbmNvcnJlY3QgeG1sIGVzY2FwaW5nIGluIGJhc2UgY2xhc3MgbmFtZSB3aGVuIGJhc2UgY2xhc3MgaXMgYSB0ZW1wbGF0ZS4KCjA4LzEzLzIwMDU6IGVmdXp6eW9uZQoJICAgIFtDTElTUF0gQWRkZWQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgZW51bXMuIERvZXMgbm90IGFkZHMgdGhlIHJldHVybiB0eXBlIGRlY2xhcmF0aW9uCgkgICAgdG8gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sIGlmIGEgZnVuY3Rpb24gcmV0dXJucyB2b2lkLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIE5ldyBsYW5ndWFnZSBtb2R1bGUsIENvbW1vbiBMaXNwIHdpdGggVUZGSSwgZnJvbSBVdHotVXdlIEhhdXMuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgRml4IHRoZSBMaXNwIHMtZXhwcmVzc2lvbiBvdXRwdXQgbW9kdWxlOyBpdCBubyBsb25nZXIgY29tcGxhaW5zIGFib3V0ICJ1bmtub3duIHRhcmdldHMiLgoKMDcvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBTVEwgd3JhcHBlcnMgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSB1c2VyJ3MgJWV4Y2VwdGlvbiBkaXJlY3RpdmUKICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgU1RMIHdyYXBwZXIgbWV0aG9kcy4gUHJldmlvdXNseSB0aGUgZm9sbG93aW5nIGdsb2JhbCAlZXhjZXB0aW9uCiAgICAgICAgICAgIGRpcmVjdGl2ZSB3b3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24geyAKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmVwbGFjaW5nICVleGNlcHRpb24gZGlyZWN0aXZlcyBmb3Igc3BlY2lmaWMgU1RMIHdyYXBwZXIKICAgICAgICAgICAgbWV0aG9kcyB3aXRoIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGRlY2xhcmVkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHMuIHRocm93cyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgbm93IHN1cHBsaWVkIGZvciBoYW5kbGluZyB0aGUgU1RMIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBUaGVzZSBjYW4gYWxzbyBiZSBlYXNpbHkKICAgICAgICAgICAgb3ZlcnJpZGRlbiwgZm9yIGV4YW1wbGUgdGhlIHN0ZDo6b3V0X29mX3JhbmdlIGV4Y2VwdGlvbiwgd2hpY2ggaXMgdXNlZCBhIGxvdCBpbiB0aGUgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzLCBjYW4gYmUgY3VzdG9taXNlZCBlYXNpbHk6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfdmVjdG9yLmkiCiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBzdGQ6Om91dF9vZl9yYW5nZSB7CiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RJbnQpIHN0ZDo6dmVjdG9yPGludD47CgowNy8yMi8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NMSVNQXSBUaGUgY2xpc3AgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gSXQgY2FuIG9ubHkgaGFuZGxlIEMsIGNsaXNwIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0cyBmZmkgYmluZGluZ3MgdG8gQysrLgogICAgICAgICAgICAgIC0gSXQgaGFzIHR3byBvcHRpb25zLCAoYSkgLWV4dGVybi1hbGwgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzIGZvciBhbGwgZnVuY3Rpb25zCiAgICAgICAgCWFuZCB2YXJpYWJsZXN0aW9ucywgKGIpIC1nZW5lcmF0ZS10eXBlZGVmIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyAiZGVmLWMtdHlwZSIKCSAgICAgICAgd3JhcHBlcnMgZm9yIHR5cGVkZWZzCgkgICAgICAtIENhbiBoYW5kbGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLCBjb21wbGV4IHR5cGVzIHN1Y2ggYXMgbi1kaW1lbnNpb25hbCBhcnJheXMgb2YgCgkgCXBvaW50ZXJzIG9mIGRlcHRoIGQKCSAgICAgIC0gR2VuZXJhdGVzIHdyYXBwZXJzIGZvciBjb25zdGFudHMgYXMgd2VsbCBhcyB2YXJpYWJsZXMKCSAgICAgIC0gQ29ycmVjdGx5IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzIGluIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwoJICAgICAgLSBDcmVhdGVzIGEgZGVmcGFja2FnZSAiZGVjbGFyYXRpb24iIHdpdGggdGhlIG1vZHVsZSBuYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUsIHRoZSBjcmVhdGVkIAoJICAgIAlwYWNrYWdlIGV4cG9ydHMgYm90aCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcwoJICAgICAgLSB0cmllcyB0byBndWVzcyB3aGVuIHNob3VsZCBhIHBvaW50ZXIgdmFyaWFibGUgYmUgZGVjbGFyZWQgYXMgYy1wdHIgb3IgYy1wb2ludGVyCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIENoYW5nZXMgdG8gc3VwcG9ydCBDIyBzdHJ1Y3RzIHJldHVybmVkIGJ5IHZhbHVlLiBUaGUgY2hhbmdlcyByZXF1aXJlZCBhcmU6CiAgICAgICAgICAgICAgLSBVc2luZyBhbiBvcHRpb25hbCAnbnVsbCcgYXR0cmlidXRlIGluIHRoZSBvdXQgdHlwZW1hcC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgdGhlbiBpdCBpcyB1c2VkIGZvciB0aGUgJG51bGwgc3BlY2lhbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCiAgICAgICAgICAgICAgLSBUaGUgY3R5cGUgdXNlZCBpbiB0aGUgQy9DKysgd3JhcHBlcnMgaXMgbm8gbG9uZ2VyIGluaXRpYWxpc2VkIHRvIDAgb24gZGVjbGFyYXRpb24uCiAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgY2hhbmdlcyBmaXggdGhlIHNpdHVhdGlvbnMgd2hlcmUgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhc3NpZ24gMCB0byB0aGUKICAgICAgICAgICAgcmV0dXJuZWQgc3RydWN0LiBNYXJzaGFsbGluZyBzdHJ1Y3RzIGFzIHZhbHVlIHR5cGVzIHN0aWxsIHJlcXVpcmVzIHVzZXIgZGVmaW5lZCB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGFuIGV4YW1wbGUuCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBTV0lHX2V4Y2VwdGlvbiB1c2FnZSB0byB3b3JrIHdpdGggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBlbXB0eSBtYWNybwogICAgICAgICAgICBhcmd1bWVudHMuIFVuZm9ydHVuYXRlbHkgdGhpcyBmaXggd2lsbCBzdG9wIHVzYWdlIG9mIFNXSUdfZXhjZXB0aW9uIGJlaW5nIHVzZWQgd2l0aGluIHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgdXNlICIiIG9yICV7ICV9IGRlbGltaXRlcnMsIGJ1dCBjb250aW51ZXMgdG8gd29yayB3aXRoIHR5cGVtYXBzIHVzaW5nIHt9IGRlbGltaXRlcnMuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50IG9yIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIG1ldGhvZHMgaW5zdGVhZAogICAgICAgICAgICBhcyBTV0lHX2V4Y2VwdGlvbiBpcyByZWFsbHkgaW50ZW5kZWQgYXMgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYWNybyBmb3IgdGhlIFNXSUcgbGlicmFyeSB3cml0ZXJzLgoKMDcvMTYvMjAwNTogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2Ugc3BlY2lmaWMgZm9yZWlnbiB0eXBlcyByYXRoZXIgdGhhbiAoKiA6dm9pZCkuIAoJICAgIFVzZSAqc3dpZy1pZGVudGlmaWVyLWNvbnZlcnRlciouCgowNi8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGdW5jdGlvbnMgZGVjbGFyZWQgYXMgJ2V4dGVybicgbm8gbG9uZ2VyIGhhdmUgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhZGRlZCB0byB0aGUgCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZXMuIFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIFNXSUcgZG9lcyBub3QgZ2V0IHRoaXMgcmlnaHQsIGVnIGJ1ZyAjMTIwNTg1OSAoZXh0ZXJuCiAgICAgICAgICAgIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlKS4gQWxzbyBTV0lHIGNhbm5vdCBnZXQgbm9uLXN0YW5kYXJkCiAgICAgICAgICAgIGNhbGxpbmcgY29udmVudGlvbnMgY29ycmVjdCwgZWcgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSB1c3VhbGx5IGhhbmRsZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIERMTElNUE9SVCBleHRlcm4gU1REQ0FMTCB2b2lkIGZ1bmN0aW9uKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFNXSUcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVzOgoKICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZnVuY3Rpb24oaW50KTsKCiAgICAgICAgICAgIFRvIHdoaWNoIHRoZXJlIGlzIG5vIHNvbHV0aW9uIGFzIFNXSUcgZG9lc24ndCBoYW5kbGUgbm9uLXN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbnMuIFRoZSBleHRyYQogICAgICAgICAgICAnZXh0ZXJuJyBmdW5jdGlvbiB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlzIHN1cGVyZmx1b3VzIHVubGVzcyBhIHVzZXIgaGFzIGZvcmdvdHRlbiB0byBhZGQgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIGRlY2xhcmF0aW9uIGludG8gdGhlIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlIC1ub2V4dGVybiBjb21tYW5kbGluZSBhcmd1bWVudCBpcyBub3cgcmVkdW5kYW50IGFuZCBhIG5ldyBjb21tYW5kbGluZSBhcmd1bWVudCAtYWRkZXh0ZXJuIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyLiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdW5sZXNzIHRoZSBoZWFkZXIgZmlsZQogICAgICAgICAgICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB3YXMgaW5hZHZlcnRlbnRseSBub3QgYWRkZWQgdG8gdGhlIHdyYXBwZXJzLiBUbyBmaXggdGhpcwogICAgICAgICAgICBhZGQgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGludG8geW91ciB3cmFwcGVycywgRm9yIGV4YW1wbGUsIHJlcGxhY2U6CgogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwoKICAgICAgICAgICAgd2l0aDoKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA2LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgTW9kdWxhMywgT2NhbWxdCiAgICAgICAgICAgIFRoZSBpbnRlcm1lZGlhcnkgZnVuY3Rpb24gbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgbWF0Y2ggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgc28gdGhhdCAlZXh0ZW5kIGZvciBhIG1lbWJlciB2YXJpYWJsZSB3b3JrcwogICAgICAgICAgICB1bmlmb3JtbHkgYWNyb3NzIGFsbCBsYW5ndWFnZSBtb2R1bGVzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBFeHRlbmRNZSB7CiAgICAgICAgICAgICAgICBWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgRXh0ZW5kTWVfVmFyX3NldChFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgRXh0ZW5kTWVfVmFyX2dldChFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbWV0aG9kcyBpbXBsZW1lbnRpbmcgdGhlIGdldC9zZXQgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgZ2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGlzIGFsc28gY2hhbmdlcyB0aGUgbmFtZSBvZiB2YXJpYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIC1ub3Byb3h5LgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgbmFtZXMgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHRoZSAtb2xkdmFybmFtZXMgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgpWZXJzaW9uIDEuMy4yNSAoSnVuZSAxMSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xMS8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggaGFuZGxpbmcgb2YgYW5vbnltb3VzLWVudW0gdmFyaWFibGVzLgoKMDYvMTAvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGZvciBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIGJ5CgkgICAgY29weS1vZi12YWx1ZS4gIEZpeCBmb3IgZ2xvYmFsICJjb25zdCBjaGFyICoiIHZhcmlhYmxlcy4KCSAgICBGaXggdGVzdGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzLCBhcnJheXNfZ2xvYmFsLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciB3aGVuIGEgYmFzZSBjbGFzcyBkZWZpbmVzIGEgc3ltYm9sIGFzIGEgbWVtYmVyIHZhcmlhYmxlIGFuZCBhIGRlcml2ZWQgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICB0aGUgc2FtZSBzeW1ib2wgYXMgYSBtZW1iZXIgbWV0aG9kLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgLSB3aGVuIGEgbWV0aG9kIGhhcyBwcm90ZWN0ZWQgYWNjZXNzIAogICAgICAgICAgICBpbiBiYXNlIGFuZCBwdWJsaWMgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3MuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNjYzNjMgLSBGb2xsb3cgY29udmVudGlvbiBvZiByZWxlYXNlIHRhcmJhbGwgbmFtZSBtYXRjaGluZyBkaXJlY3RvcnkgbmFtZS4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4ICMxMjExMzUzIC0gdHlwZXNhZmUgZW51bXMgKGFuZCBKYXZhIHByb3BlciBlbnVtcykgd3JhcHBlcnMgd2hlbiBlbnVtIHZhbHVlCiAgICAgICAgICAgIGlzIG5lZ2F0aXZlLgoKMDUvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kZXJuaXNlZCBhbmQgdGlkaWVkIHVwIFdpbmRvd3MgbWFjcm9zIC0tPiBTV0lHRVhQT1JULCBTV0lHU1REQ0FMTC4gVGhleSBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgICAgICBieSB1c2VycyB2aWEgLUQgY29tcGlsZXIgZGlyZWN0aXZlcyBpZiBuZWVkIGJlLgoKMDUvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgJWNzbWV0aG9kbW9kaWZpZXJzIGNhbiBiZSBhcHBsaWVkIHRvIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIG1ldGhvZHMgbm93LgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgJ3B1YmxpYycgbW9kaWZpZXIgdGhhdCBTV0lHIGdlbmVyYXRlcywgJWNzbWV0aG9kbW9kaWZpZXJzIHdpbGwgYWxzbwogICAgICAgICAgICByZXBsYWNlIHRoZSB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgdGhhdCBTV0lHIHRoaW5rcyBpcyBhcHByb3ByaWF0ZS4gVGhpcyBmZWF0dXJlIGlzCiAgICAgICAgICAgIHVzZWZ1bCBmb3Igc29tZSBvYnNjdXJlIGNhc2VzIHdoZXJlIFNXSUcgbWlnaHQgZ2V0IHRoZSBtb2RpZmllcnMgaW5jb3JyZWN0LCBmb3IgZXhhbXBsZQogICAgICAgICAgICB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIGFuZCBvdmVycmlkaW5nIGEgbWV0aG9kIGluIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgY29uc3RydWN0b3JzIHRvIHN0ZDo6cGFpciB3cmFwcGVycyAoc3RkX3BhaXIuaSkgZm9yIGFsbCBsYW5ndWFnZXMuCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHN0ZDo6cGFpciB3cmFwcGVycyBpbiBzdGRfcGFpci5pCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBDIyAnbmV3JyBhbmQgJ292ZXJyaWRlJyBtb2RpZmllcnMgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBhIEMrKyBjbGFzcyBpbmhlcml0cyBtZXRob2RzCiAgICAgICAgICAgIHZpYSBhIEMrKyAndXNpbmcnIGRlY2xhcmF0aW9uLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgcHJldmlvdXNseSBiZWluZyBpZ25vcmVkIGluIGNsYXNzZXMgdGhhdCBpbmhlcml0ZWQgbWV0aG9kcwogICAgICAgICAgICBmcm9tICd1c2luZycgZGVjbGFyYXRpb25zLCBlZyBjYWxscyB0byBEZXJpdmVkOjpiYXIgYmVsb3cgd2lsbCBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8KICAgICAgICAgICAgYSB0YXJnZXQgbGFuZ3VhZ2UgZXhjZXB0aW9uL2Vycm9yLCBsaWtlIGl0IGFsd2F5cyBoYXMgZG9uZSBmb3IgQmFzZTo6QmFyLgoKICAgICAgICAgICAgY2xhc3MgQmFzZSB7CiAgICAgICAgICAgICAgdmlydHVhbCBiYXIoKSB0aHJvdyAoc3RkOjpzdHJpbmcpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgewogICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmJhcjsKICAgICAgICAgICAgfTsKCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZXRlY3RpbmcgdmlydHVhbCBtZXRob2RzIGluICVleHRlbmQgZm9yIHRoZSAtZnZpcnR1YWwgb3B0aW9uIGFuZCBDIyBvdmVycmlkZSBhbmQgbmV3CiAgICAgICAgICAgIG1ldGhvZCBtb2RpZmllcnMuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAnbmV3JyBtb2RpZmllciBpcyBub3cgZ2VuZXJhdGVkIG9uIHRoZSBwcm94eSBtZXRob2Qgd2hlbiBhIG1ldGhvZCBpbiBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgaXMgbm90IHBvbHltb3JwaGljIGFuZCB0aGUgc2FtZSBtZXRob2QgZXhpc3RzIGluIHRoZSBkZXJpdmVkIGNsYXNzIChpZSBpdCBoaWRlcwogICAgICAgICAgICB0aGUgYmFzZSBjbGFzcycgbm9uLXZpcnR1YWwgbWV0aG9kKS4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ZXMgdG8gZGV0ZWN0aW9uIG9mIGNvdmFyaWFudCByZXR1cm4gdHlwZXMgLSB3aGVuIHRoZSBjbGFzcyBoaWVyYXJjaHkgaXMgbW9yZQogICAgICAgICAgICB0aGFuIDIgY2xhc3NlcyBkZWVwLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwcyBtb3ZlZCBmcm9tIHN0ZF9zdHJpbmcuaSB0byBzdGRfd3N0cmluZy5pCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGNyYXNoIGluIERvaFN0cnN0ciwgYnVnICMxMTkwOTIxCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBGaXggZm9yIG1ldGhvZHMgd2l0aCBzaW1pbGFyIG5hbWVzIHdoZW4gc2hvd2luZyBsaXN0IG9mIG5hbWVzIG9uIGVycm9yIC0gYnVnICMxMTkxODI4LgogICAgICAgICAgICBQYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gbG9uZyBsb25nIG92ZXJsb2FkaW5nIGZpeCAtIGJ1ZyAjMTE5MTgzNSwgcGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzExOTY3NTUgdG8gcmVtb3ZlIGRlYnVnIGZyb20gc3dpZ3RjbDguc3dnLgoKMDUvMTkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCAtZnZpcnR1YWwgb3B0aW9uXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyB3aGVuIGEKICAgICAgICAgICAgdmlydHVhbCBtZXRob2QncyByZXR1cm4gdHlwZSB3YXMgYSB0eXBlZGVmIGluIGVpdGhlciB0aGUgYmFzZSBvciBkZXJpdmVkIGNsYXNzLiBBbHNvIGVuc3VyZXMgdGhlCiAgICAgICAgICAgIG1ldGhvZCBpcyBlbGltaW5hdGVkIHdoZW4gdXNpbmcgdGhlIC1mdmlydHVhbCBvcHRpb24uIEZvciBleGFtcGxlLCBEZXJpdmVkLm1ldGhvZCBub3cgaGFzIHRoZSBDIwogICAgICAgICAgICBvdmVycmlkZSBrZXl3b3JkIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQqIEludGVnZXJQdHI7CgogICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgSW50ZWdlclB0ciBtZXRob2QoKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgaW50ICogbWV0aG9kKCkgY29uc3Q7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFtDI10gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IGJlaW5nIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgdmlydHVhbCBtZXRob2RzIHdoZW4gYSBiYXNlIGNsYXNzCiAgICAgICAgICAgIGlzIGlnbm9yZWQgd2l0aCAlaWdub3JlLgoKMDUvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIHJlbW92ZSAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5ncyBpbiBDIHdyYXBwZXJzIHdoZW4gY29tcGlsaW5nIEMgY29kZSB3aXRoICdnY2MgLVdhbGwgLWZzdHJpY3QtYWxpYXNpbmcnLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIE1pY2hhZWwgQ2FoaWxsLiBUaGlzIG1vZGlmaWVzIG1hbnkgb2YgdGhlIGNhc3RzIHNsaWdodGx5LCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikmamFyZzE7CiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSh2b2lkICopJmphcmcxOwoKMDUvMTIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBDIyBhdHRyaWJ1dGVzLiBDIyBhdHRyaWJ1dGVzIGNhbiBiZSBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIDEpIE9uIGEgQy9DKysgdHlwZSBiYXNpcyBieSBzcGVjaWZ5aW5nIGFuIGluYXR0cmlidXRlcyBhbmQvb3Igb3V0YXR0cmlidXRlcyB0eXBlbWFwIGF0dHJpYnV0ZQogICAgICAgICAgICAgICBpbiB0aGUgaW10eXBlIG9yIGNzdHlwZSB0eXBlbWFwcyAoZm9yIEMjIHJldHVybiB0eXBlIG9yIEMjIHBhcmFtZXRlciB0eXBlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICAyKSBPbiBhIHdyYXBwZWQgbWV0aG9kIG9yIHZhcmlhYmxlIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgZmVhdHVyZSAoJWZlYXR1cmUpLgogICAgICAgICAgICAzKSBPbiBhIHdyYXBwZWQgcHJveHkgY2xhc3Mgb3IgZW51bSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIHR5cGVtYXAuCgogICAgICAgICAgICBFeGFtcGxlcyBhcmUgaW4gdGhlIEMjIGRvY3VtZW50YXRpb24gKENTaGFycC5odG1sKS4KCjA0LzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBjb25maWd1cmUgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoZSBkZWZhdWx0IG1heGltdW0gY29tcGlsZXIgd2FybmluZyBhcwogICAgICAgICAgICB0aGV5IGNvdWxkbid0IGJlIHJlbW92ZWQgZXZlbiB3aGVuIG92ZXJyaWRpbmcgQ0ZMQUdTIGFuZCBDWFhGTEFHUyB3aXRoIGNvbmZpZ3VyZQogICAgICAgICAgICAoLi9jb25maWd1cmUgQ0ZMQUdTPSBDWFhGTEFHUz0pLiBUbyB0dXJuIHRoZSBtYXhpbXVtIHdhcm5pbmdzIG9mZiwgcnVuOiAgCgogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1tYXhpbXVtLWNvbXBpbGUtd2FybmluZ3MKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHdoaWNoIHJld29ya3MgdGhlIEphdmEgY29uc3RydWN0b3IgYW5kIGZpbmFsaXplL2Rlc3RydWN0b3IgdHlwZW1hcHMsCiAgICAgICAgICAgIGZvciBkaXJlY3RvcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3ZlcmFsbCBKYXZhIHR5cGVtYXBzLiBBZGRlZCB0aGUgZGlyZWN0b3JfdGFrZSBhbmQgCiAgICAgICAgICAgIGRpcmVjdG9yX3JlbGVhc2UgdHlwZW1hcHMgdG8gZW11bGF0ZSBvdGhlciBtb2R1bGVzJyBfX2Rpc293bl9fIGZ1bmN0aW9uYWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeGVkIHByb2JsZW1zIGR1ZSB0byB0aGUgb3ZlciBlYWdlciBnYXJiYWdlIGNvbGxlY3Rvci4gT2NjYXNpb25hbGx5IHRoZQogICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3b3VsZCBjb2xsZWN0IGEgQyMgcHJveHkgY2xhc3MgaW5zdGFuY2Ugd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQKICAgICAgICAgICAgaW4gdW5tYW5hZ2VkIGNvZGUgaWYgdGhlIG9iamVjdCB3YXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGEgd3JhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5IHRoaXMgY2F1c2VkIGhhdm9jIGFzIHRoZSBDIyBwcm94eSBjbGFzcyBjYWxscyB0aGUgQysrIGRlc3RydWN0b3IKICAgICAgICAgICAgd2hlbiBpdCBpcyBjb2xsZWN0ZWQuIFByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzIG5vdyB1c2UgYSBIYW5kbGVSZWYsCiAgICAgICAgICAgIHdoaWNoIGhvbGRzIGFuIEludFB0ciwgaW5zdGVhZCBvZiBhIHBsYWluIEludFB0ciB0byBtYXJzaGFsIHRoZSBDKysgcG9pbnRlciB0byB1bm1hbmFnZWQKICAgICAgICAgICAgY29kZS4gVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoaXMKICAgICAgICAgICAgbW9kaWZpY2F0aW9uLgoKICAgICAgICAgICAgVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSBzd2lnQ1B0ciBpcyBub3cgb2YgdHlwZSBIYW5kbGVSZWYKICAgICAgICAgICAgaW5zdGVhZCBvZiBJbnRQdHIgYW5kIGNvbnNlcXVlbnRseSB0aGUgZ2V0Q1B0ciBtZXRob2QgcmV0dXJuIHR5cGUgaGFzIGFsc28gY2hhbmdlZC4gVGhlIG5ldAogICAgICAgICAgICBlZmZlY3QgaXMgdGhhdCBhbnkgY3VzdG9tIHdyaXR0ZW4gdHlwZW1hcHMgbWlnaHQgaGF2ZSB0byBiZSBtb2RpZmllZCB0byBzdWl0ZS4gQWZmZWN0ZWQgdXNlcnMKICAgICAgICAgICAgc2hvdWxkIG5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgbmV3ICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgaW10eXBlIHR5cGVtYXAgYXMgdGhlCiAgICAgICAgICAgIGlucHV0IHR5cGUgaXMgbm93IGEgSGFuZGxlUmVmIGFuZCB0aGUgb3V0cHV0IHR5cGUgaXMgc3RpbGwgYW4gSW50UHRyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgYXN5bW1ldHJpYyB0eXBlIG1hcnNoYWxsaW5nIGFkZGVkLiBTb21ldGltZXMgdGhlIG91dHB1dCB0eXBlIG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRpZmZlcmVudCB0byB0aGUgaW5wdXQgdHlwZS4gU3VwcG9ydCBmb3IgdGhpcyBjb21lcyBpbiB0aGUgZm9ybSBvZiBhIG5ldyBvcHRpb25hbCAnb3V0JwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBjdHlwZSwgaW10eXBlIGFuZCBjc3R5cGUgdHlwZW1hcHMuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgbm90CiAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgaXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwLCBhcyBoYXMgYWx3YXlzIHByZXZpb3VzbHkgYmVlbiB0aGUgY2FzZS4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgIHRoZW4gdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igb3V0cHV0IHR5cGVzIGFuZCB0aGUgdHlwZSBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gdGhlIHR5cGVtYXAgaXRzZWxmIGlzIHVzZWQgZm9yIHRoZSBpbnB1dCB0eXBlLiBBbiBvdXRwdXQgdHlwZSBpcyBhIHJldHVybiB2YWx1ZSBmcm9tCiAgICAgICAgICAgIGEgd3JhcHBlZCBtZXRob2Qgb3Igd3JhcHBlZCBjb25zdGFudCBhbmQgYW4gaW5wdXQgdHlwZSBpcyBhIHBhcmFtZXRlciBpbiBhIHdyYXBwZWQgbWV0aG9kLgoKICAgICAgICAgICAgQW4gZXhhbXBsZSBzaG93cyB0aGF0IGNoYXIgKiBjb3VsZCBiZSBtYXJzaGFsbGVkIGluIGRpZmZlcmVudCB3YXlzLCAKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW10eXBlLCBvdXQ9IkludFB0ciIpIGNoYXIgKiAic3RyaW5nIgogICAgICAgICAgICAgIGNoYXIgKiBmdW5jdGlvbihjaGFyICopOwoKICAgICAgICAgICAgVGhlIG91dHB1dCB0eXBlIGlzIHRodXMgSW50UHRyIGFuZCB0aGUgaW5wdXQgdHlwZSBpcyBzdHJpbmcuIFRoZSByZXN1bHRpbmcgaW50ZXJtZWRpYXJ5IEMjIGNvZGUgaXM6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBmdW5jdGlvbihzdHJpbmcgamFyZzEpOwoKMDQvMjIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IGdlbmVyYXRpb24gb2YgImRlZmluZS1tZXRob2QiIGZvciBtZXRob2RzIG9mCgkgICAgY2xhc3NlcyB3aXRoIGEgY29uc3RydWN0b3IuICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjA0LzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEZvciB3cmFwcGVkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgKHVzaW5nIGFyZ291dCksCgkgICAgU1dJRyBDSElDS0VOIG5vdyByZXR1cm5zIHRoZW0gYXMgbXVsdGlwbGUgdmFsdWVzIGluc3RlYWQgb2YgYXMKCSAgICBhIGxpc3QuICBUaGV5IGNhbiB0aGVuIGJlIGFjY2Vzc2VkIHVzaW5nIChjYWxsLXdpdGgtdmFsdWVzKS4KCjA0LzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgKyBBZGRlZCBhIHdob2xlIGJ1bmNoIG9mIG5ldyBfcnVubWUgc2NyaXB0cyBpbnRvIHRoZSBjaGlja2VuIHRlc3QKICAgICAgICAgICAgc3VpdGUuICBBbHNvIGZpeCBzb21lIGJ1Z3MgdGhlc2UgbmV3IHNjcmlwdHMgdHVybmVkIHVwLgoKICAgICAgICAgICAgKyBBZGRlZCBvcHRpbWl6YXRpb24gd2hlbiByZXR1cm5pbmcgYSB3cmFwcGVkIHByb3h5IGNsYXNzLiAgQmVmb3JlLAogICAgICAgICAgICBhIG1pbm9yIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgaW52b2tlZCBldmVyeSB0aW1lIGEgZnVuY3Rpb24gcmV0dXJuZWQuCgoJICAgICsgQWxsIHRoZSBjaGlja2VuIEV4YW1wbGVzIHNob3VsZCBub3cgcnVuIGNvcnJlY3RseQoKMDQvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB0eXBlbWFwIG1hdGNoaW5nIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzbyB0aGF0IHN0ZDo6c3RyaW5nIHZhcmlhYmxlcyBjYW4gYmUgZWFzaWx5IG1hcnNoYWxsZWQgd2l0aAogICAgICAgICAgICBhIEMjIHN0cmluZyBwcm9wZXJ0eSB1c2luZzoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9zdHJpbmcuaSIKICAgICAgICAgICAgICAlYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp2YXJpYWJsZV9uYW1lIH07CiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZTsKCiAgICAgICAgICAgIChSZWNhbGwgdGhhdCBhbGwgY2xhc3MgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHBvaW50ZXJzKQoKMDQvMDUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBBZGRlZCBFeGFtcGxlcy9jaGlja2VuL2VnZywgYW4gZXhhbXBsZSBvbiBob3cgdG8gYnVpbGQgYSBjaGlja2VuCgkgICAgICBleHRlbnNpb24gbGlicmFyeSBpbiB0aGUgZm9ybSBvZiBhbiBlZ2cuICBBbHNvIHVwZGF0ZWQgdGhlCgkgICAgICBkb2N1bWVudGF0aW9uIG9uIHRoZSBkaWZmZXJlbnQgbGlua2luZyBvcHRpb25zLgoKCSAgICArIGNoaWNrZW4gdGVzdC1zdWl0ZSBub3cgaGFzIHN1cHBvcnQgdG8gY2hlY2sgU1dJRyB3aXRoIHRoZSAtcHJveHkKCSAgICAgIGFyZ3VtZW50IGlmIHRoZXJlIGV4aXN0cyBhIF9wcm94eV9ydW5tZS5zcyBmaWxlLgoKCSAgICArIE1vcmUgZml4ZXMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCAtcHJveHkKCjAzLzMxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFR1cm5lZCBvbiBleHRyYSB0ZW1wbGF0ZSBmZWF0dXJlcyBmb3IgYWxsIGxhbmd1YWdlcyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHByZXZpb3VzbHkgb25seSBhdmFpbGFibGUgdG8gUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBlbmFibGVzIHR5cGVtYXBzIGRlZmluZWQgd2l0aGluIGEgdGVtcGxhdGVkIGNsYXNzIHRvIGJlIHVzZWQgYXMKICAgICAgICAgICAgZXhwZWN0ZWQuIFJlcXVpcmVzICV0ZW1wbGF0ZSBvbiB0aGUgdGVtcGxhdGVkIGNsYXNzLCAldGVtcGxhdGUoKSB3aWxsCiAgICAgICAgICAgIGFsc28gcGljayB1cCB0aGUgdHlwZW1hcHMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vPFQ+ICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb19pKSBGb288aW50PjsKICAgICAgICAgICAgICAldGVtcGxhdGUoKSBGb288ZG91YmxlPjsKICAgICAgICAgICAgICAKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSB0aGUgcHJvcGVyICdpbicgdHlwZW1hcHMgd2hlcmV2ZXIgRm9vPGludD4gYW5kIEZvbzxkb3VibGU+CiAgICAgICAgICAgIGFyZSB1c2VkLgoKMDMvMzAvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gUGF0Y2ggZnJvbSBIYW5zIE9lc3RlcmhvbHQgZm9yIHN1cHBvcnRpbmcgTXpTY2hlbWUgMzB4LgoKMDMvMjkvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBSZWFsbG93IG9sZGVyIHZlcnNpb25zIG9mIGNoaWNrZW4gKDEuNDAgdG8gMS44OSkgYnkgcGFzc2luZyAtbm9jb2xsZWN0aW9uCgkgICAgICBhcmd1bWVudCB0byBTV0lHCgkgICAgKyAlaW1wb3J0IG5vdyB3b3JrcyBjb3JyZWN0bHkgd2l0aCB0aW55Y2xvcy4gIChkZWNsYXJlICh1c2VzIC4uLikpIHdpbGwgYmUKCSAgICAgIGV4cG9ydGVkIGNvcnJlY3RseS4KCSAgICArIFRpbnlDTE9TIHByb3h5IGNsYXNzZXMgbm93IHdvcmsgY29ycmVjdGx5IHdpdGggb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICAgIGFuZCBjb25zdHJ1Y3RvcnMuCgowMy8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9yb3V0IHR5cGVtYXBzLiBKYXZhIGRpcmVjdG9ycwogICAgICAgICAgICByZXF1aXJlIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwcyBsaWtlIHRoZSBvdGhlciBsYW5ndWFnZXMgbm93LiBUaGUgbmV3CiAgICAgICAgICAgIHR5cGVtYXBzIHByb3ZpZGUgZml4ZXMgZm9yIG1ldGhvZHMgd2hlcmUgdGhlIHJldHVybiB0eXBlIGlzIHJldHVybmVkCiAgICAgICAgICAgIGJ5IHJlZmVyZW5jZSAodGhpcyBjYW5ub3QgYXV0b21hdGljYWxseSBiZSBtYWRlIHRocmVhZCBzYWZlIHRob3VnaCkuCgowMy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBFbnVtIGNhc3RpbmcgZml4ZXMuIFZpc3VhbCBDKysgZGlkbid0IGxpa2UgdGhlIEMgdHlwZSBjYXN0aW5nIFNXSUcgcHJvZHVjZWQKICAgICAgICAgICAgd2hlbiB3cmFwcGluZyBDKysgZW51bSByZWZlcmVuY2VzLCBhcyByZXBvcnRlZCBieSBBZG1pcmUgS2FuZGF3YXN2aWthLgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFNGICMxMTI0NDkwLiBGaXggUGVybCBtYWNybyBjbGFzaGVzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbydzIFNUTCBzdHJpbmcsCiAgICAgICAgICAgIHNvIG5vdyBwcm9qZWN0cyBjYW4gI2luY2x1ZGUgPHN0cmluZz4uCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAldmFyYXJncyB3aGljaCBnb3QgYnJva2VuIHdpdGggdGhlIHJlY2VudCBkZWZhdWx0IGFyZ3VtZW50IGNoYW5nZXMuCiAgICAgICAgICAgIEFsc28gd29ya3MgZm9yIEphdmEgYW5kIEMjIGZvciB0aGUgZmlyc3QgdGltZSBub3cuCgowMy8xNy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICsgRml4IGEgd2hvbGUgYnVuY2ggb2YgYnVncyBpbiB0aGUgY2hpY2tlbiBtb2R1bGUuICBUaGUgZW50aXJlCiAgICAgICAgICAgICAgdGVzdCBzdWl0ZSBub3cgY29tcGlsZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgdGVzdHMgdGhhdCByZXF1aXJlCgkgICAgICBzdGRfdmVjdG9yLmksIHN0ZF9kZXF1ZS5pLCBhbmQgc28gb24sIHdoaWNoIGNoaWNrZW4gZG9lcyBub3QgaGF2ZSB5ZXQuCgoJICAgICsgQWRkIHN1cHBvcnQgZm9yICVleGNlcHRpb24gYW5kICV0eXBlbWFwKGV4Y2VwdGlvbnMpLiAgRXhjZXB0aW9ucyBhcmUKCSAgICAgIHRocm93biB3aXRoIGEgY2FsbCB0byAoYWJvcnQpIGFuZCBjYW4gYmUgaGFuZGxlZCBieSAoaGFuZGxlLWV4Y2VwdGlvbnMpCgowMy8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9ycy4gTW9kaWZpY2F0aW9ucyB0byB0aGUgdHlwZW1hcHMKICAgICAgICAgICAgZ2l2aW5nIHVzZXJzIGZpbmUgY29udHJvbCBvdmVyIG1lbW9yeSBvd25lcnNoaXAgYW5kIGxpZmV0aW1lIG9mIGRpcmVjdG9yIGNsYXNzZXMuCiAgICAgICAgICAgIERpcmVjdG9yIGNsYXNzZXMgbm8gbG9uZ2VyIGxpdmUgZm9yZXZlciBieSBkZWZhdWx0IGFzIHRoZXkgYXJlIG5vdyBjb2xsZWN0YWJsZQogICAgICAgICAgICBieSB0aGUgR0MuCgowMy8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gQWRkIHN1cHBvcnQgZm9yIGFkZGluZyBmaW5hbGl6ZXJzIGdhcmJhZ2UgY29sbGVjdGVkIG9iamVjdHMuCgkgICAgRnVuY3Rpb25zIHRoYXQgcmV0dXJuIG5ldyBvYmplY3RzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IGFuZAoJICAgIGlucHV0IGFyZ3VtZW50cyB3aGljaCBjb25zdW1lIChvciB0YWtlIG93bmVyc2hpcCkgb2YgYSBwb2ludGVyIHNob3VsZAoJICAgIGJlIG1hcmtlZCB3aXRoIHRoZSBESVNPV04gdHlwZW1hcC4KCgkgICAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgY29ycmVjdGx5IGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZAoJICAgIHRvIGEgZnVuY3Rpb24sIGFuZCByYWlzaW5nIGFuIGVycm9yIGlmIHRoZSB3cm9uZyBudW1iZXIgYXJlIHBhc3NlZC4KCjAzLzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBBZGQgLS13aXRob3V0LWFsbGxhbmcgb3B0aW9uIHRvIGNvbmZpZ3VyZS5pbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKICAgICAgICAgICAgcGFzc2luZyBhbGwgdGhlIC0td2l0aG91dC1weXRob24gLS13aXRob3V0LXBlcmw1IGV0Yy4uLiB0aGF0IE1hdHRoaWFzIGFkZGVkLgoKMDMvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gTWVtb3J5IGxlYWsgZml4IGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGNsYXNzZXMvc3RydWN0cyBieSB2YWx1ZS4KCjAzLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggZm9yIFBlcmwgaW5jb3JyZWN0bHkgdGFraW5nIG1lbW9yeSBvd25lcnNoaXAgZm9yIHJldHVybiB0eXBlcyB0aGF0CiAgICAgICAgICAgIGFyZSB0eXBlZGVmcyB0byBhIHN0cnVjdC9jbGFzcyBwb2ludGVyLiBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVmFyaW91cyBleGNlcHRpb24gY2hhbmdlcyBmb3IgdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGVzZSBub3cgbW9yZQogICAgICAgICAgICBhY2N1cmF0ZWx5IG1pcnJvciB0aGUgc2FtZSBleGNlcHRpb25zIHRoYXQgU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCB0aHJvdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgYWZ0ZXIgYW55IG9mIHRoZSBzdGQ6OnZlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHRocm93IGFuIGV4Y2VwdGlvbi4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gV2hlbiBudWxsIGlzIHBhc3NlZCBmb3IgYSBDKysgcmVmZXJlbmNlIG9yIHZhbHVlIHBhcmFtZXRlciwgdGhlIAogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duIGhhcyBiZWVuIGNvcnJlY3RlZCB0byBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaW5zdGVhZAogICAgICAgICAgICBvZiBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIGFzIHJlY29tbWVuZGVkIGluIHRoZSAuTkVUIEZyYW1ld29yayBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIHR1cm4gYSBDKysgZXhjZXB0aW9uIGludG8gYW4gQXBwbGljYXRpb25FeGNlcHRpb24sCiAgICAgICAgICAgIG5vdCBhIFN5c3RlbUV4Y2VwdGlvbiBub3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE51bWVyb3VzIGNoYW5nZXMgaW4gQyMgZXhjZXB0aW9uIGhhbmRsaW5nIGhhdmUgYmVlbiBtYWRlIG92ZXIgdGhlIHBhc3QKICAgICAgICAgICAgZmV3IHdlZWtzLiBBIHN1bW1hcnkgZm9sbG93czoKCiAgICAgICAgICAgIFRoZSB3YXkgaW4gd2hpY2ggQysrIGV4Y2VwdGlvbnMgYXJlIG1hcHBlZCB0byBDIyBleGNlcHRpb25zIGlzIHF1aXRlIGRpZmZlcmVudC4KICAgICAgICAgICAgVGhlIGNoYW5nZSBpcyB0byBmaXggQyMgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZSBDKysgZXhjZXB0aW9uIHN0YWNrIGlzIGNvcnJlY3RseQogICAgICAgICAgICB1bndvdW5kIGFzIHByZXZpb3VzbHkgQysrIGV4Y2VwdGlvbnMgd2VyZSBiZWluZyB0aHJvd24gYWNyb3NzIHRoZSBDIFBJbnZva2UgbGF5ZXIKICAgICAgICAgICAgaW50byB0aGUgbWFuYWdlZCB3b3JsZC4KCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIGF0dHJpYnV0ZXMgKGNhbnRocm93IGFuZCBleGNvZGUpIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIHRvIGNvbnRyb2wgdGhlCiAgICAgICAgICAgIG1hcHBpbmcgb2YgQysrIHRvIEMjIGV4Y2VwdGlvbnMuIEVzc2VudGlhbGx5IGEgY2FsbGJhY2sgaW50byB0aGUgdW5tYW5hZ2VkIHdvcmxkCiAgICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcGVuZGluZyBleGNlcHRpb24uIFRoZSBleGNlcHRpb24gdG8gdGhyb3cgaXMgc3RvcmVkIGluIHRocmVhZCBsb2NhbAogICAgICAgICAgICBzdG9yYWdlIChzbyB0aGUgYXBwcm9hY2ggaXMgdGhyZWFkLXNhZmUpLiBUaGUgdHlwZW1hcHMgYXJlIGV4cGVjdGVkIHRvIHJldHVybgogICAgICAgICAgICBmcm9tIHVubWFuYWdlZCBjb2RlIGFzIHNvb24gYXMgdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGlzIHNldC4gQW55IHBlbmRpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBhcmUgY2hlY2tlZCBmb3IgYW5kIHRocm93biBvbmNlIG1hbmFnZWQgY29kZSBzdGFydHMgZXhlY3V0aW5nLiBUaGVyZSBzaG91bGQKICAgICAgICAgICAgYmUgbWluaW1hbCBpbXBhY3Qgb24gZXhlY3V0aW9uIHNwZWVkIGR1cmluZyBub3JtYWwgYmVoYXZpb3VyLiBGdWxsIGRldGFpbHMgd2lsbCBiZQogICAgICAgICAgICBkb2N1bWVudGVkIGluIENTaGFycC5odG1sLgoKICAgICAgICAgICAgVGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oKSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZQogICAgICAgICAgICBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCgpIGFuZCBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb24oKQogICAgICAgICAgICBmdW5jdGlvbnMuIFRoZSBvcmlnaW5hbCBuYW1lIGhhcyBiZWVuIGRlbGliZXJhdGVseSBjaGFuZ2VkIHRvIGJyZWFrIG9sZCBjb2RlIGFzCiAgICAgICAgICAgIHRoZSBvbGQgYXBwcm9hY2ggd2FzIHNvbWV3aGF0IGZsYXdlZC4gQW55IHVzZXIgZGVmaW5lZCBleGNlcHRpb25zIHRoYXQgZm9sbG93IHRoZQogICAgICAgICAgICBzYW1lIHBhdHRlcm4gYXMgdGhlIG9sZCBhcHByb2FjaCBzaG91bGQgYWxzbyBiZSBmaXhlZC4KCiAgICAgICAgICAgIE51bWVyb3VzIG5ldyAuTkVUIGZyYW1ld29yayBleGNlcHRpb25zIGFyZSBub3cgYXZhaWxhYmxlIGZvciBlYXN5IHRocm93aW5nIGZyb20gCiAgICAgICAgICAgIHVubWFuYWdlZCBjb2RlLiBUaGUgY29tcGxldGUgbGlzdCBpczogCgogICAgICAgICAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBBcml0aG1ldGljRXhjZXB0aW9uLCBEaXZpZGVCeVplcm9FeGNlcHRpb24sIAogICAgICAgICAgICAgIEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiwgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIAogICAgICAgICAgICAgIE51bGxSZWZlcmVuY2VFeGNlcHRpb24sIE91dE9mTWVtb3J5RXhjZXB0aW9uLCBPdmVyZmxvd0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgU3lzdGVtRXhjZXB0aW9uLCBBcmd1bWVudEV4Y2VwdGlvbiwgQXJndW1lbnROdWxsRXhjZXB0aW9uIGFuZAogICAgICAgICAgICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8wNS8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBGaXggc2V2ZXJhbCBtZW1vcnkgbGVha3MgYXJvdW5kLiBFdmVuIHdoZW4gd2Ugc3Vydml2ZSAga25vd25pbmcKCSAgICBzd2lnIGlzIGEgbWVtb3J5IGxlYWsgZmFjdG9yeSwgaXQgd2FzIGEgbGl0dGxlIG91dCBvZgoJICAgIGNvbnRyb2wuIFRvIHJ1biBzdGRfY29udGFpbmVycy5pIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZSwKCSAgICBzd2lnIHdhcyB1c2luZyB+MjYwTUIsIG5vdyBpdCB1c2VzICdvbmx5JyB+NDBNQiwgd2hpY2ggaXMKCSAgICB0aGUgc2FtZSBhbW1vdW50IHRoYXQgZysrIHVzZXMsIHNvLCBpcyBub3QgdGhhdCBiYWQuCgkgICAgSW4gdGhlIHByb2Nlc3MsIEkgZm91bmQgYSBjb3VwbGUgb2YgZXh0cmEgRGVsZXRlcywgd2hpY2gKCSAgICBpbiBzb21lIGNhc2VzIGNvdWxkIHRyaWdnZXIgc2VnLiBmYXVsdHMgYW5kL29yCgkgICAgRE9IL2Fzc2VydHMuCgkgICAgCgkgICAgW3B5dGhvbl0gQmV0dGVyIHN1cHBvcnQgZm9yIGRpcmVjdG9ycyArIGV4Y2VwdGlvbi4gTW9yZQoJICAgIHZlcmJvc2UgZXJyb3JzIGFuZCBhZGRlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYW5kbGVyLgoKCSAgICBbcHl0aG9uXSBGaXggbWVtb3J5IGxlYWsgZm9yIHRoZQoKCSAgICAJICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPiAKCgkgICAgY2FzZSxyZXBvcnRlZCBieSBCbyBQZW5nLgoKCSAgICBbcHl0aG9uXSBGaXggU3dpZ1B5T2JqZWN0IGNvbXBhcmUgcHJvYmxlbSByZXBvcnRlIGJ5CgkgICAgQ2FtZXJvbiBQYXRyaWNrLiAKCgkgICAgW3B5dGhvbl0gRml4IHNldmVyYWwgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIAoJICAgIGZvciBnbnUtZ2NjLCBJbnRlbCBhbmQgVkM3LjEgIGNvbXBpbGVycy4KCgowMi8yNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byB1c2UgQ1NTIGFuZCA8ZGl2PiBpbnN0ZWFkIG9mIDxibG9ja3F1b3RlPgoJICAgIEkgdXNlZCBhIHNjcmlwdCB0byBjb252ZXJ0IHRoZSBkb2NzLCBhbmQgaXQgc2V0IGFsbCB0aGUgYm94IGNsYXNzZXMKCSAgICB0byBiZSAiY29kZSIuICBUaGVyZSBhcmUgYWN0dWFsbHkgNCBkaWZmZXJlbnQgY2xhc3NlcywKCSAgICAic2hlbGwiLCAiY29kZSIsICJ0YXJnZXRsYW5nIiwgYW5kICJkaWFncmFtIi4gIFdlIG5lZWQgdG8gZ28gdGhyb3VnaAoJICAgIGFuZCBjb252ZXJ0IHRoZSBkaXZzIGRlcGVuZGluZyBvbiB3aGF0IHRoZXkgY29udGFpbi4KCjAyLzIzLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRlZCBvcHRpb24gLW5vcnR0aSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgbmF0aXZlCgkgICAgQysrIFJUVEkgd2l0aCBkaXJlY3RvcnMgKGR5bmFtaWNfY2FzdDw+IGlzIG5vdCB1c2VkKS4KCgkgICAgQWRkIG1vcmUgY29kZSBmb3IgZGlyZWN0b3JzIHRvIGRldGVjdCBhbmQgcmVwb3J0IGVycm9ycyBpbgoJICAgIHRoZSBweXRob24gc2lkZS4KCgkgICAgRXh0ZW5kIHRoZSB1c2Ugb2YgU1dJR0lOVEVSTiB3aGVuZXZlciBpcyBwb3NzaWJsZS4KCgkgICAgUmVtb3ZlIHRlbXBsYXRlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFZDNy4xLgoKCSAgICBSZW1vdmUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgZ2NjL2crKy4gRmluYWxseSB5b3UgY2FuCgkgICAgY29tcGlsZSB1c2luZwoKCSAgICAgICBnKysgLVcgLVdhbGwgLWMgbXltb2R1bGVfd3JhcC5jeHgKCgkgICAgYW5kIG5vIHNwdXJpb3VzIGVycm9ycyB3aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlcgoJICAgIGNvZGUuCgowMi8yMy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBBZGRlZCAtZXh0ZXJuYWwtcnVudGltZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkdW1wCgkgICAgb3V0IGFsbCB0aGUgY29kZSBuZWVkZWQgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgcnVudGltZSBzeXN0ZW0sCgkgICAgYW5kIGl0IHJlcGxhY2VzIGluY2x1ZGluZyB0aGUgZmlsZXMgZGlyZWN0bHkuICBUaGlzIGNoYW5nZSBhZGRzCgkgICAgdHdvIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB0byB0aGUgTGFuZ3VhZ2UgY2xhc3MsIHdoaWNoIGFyZSB1c2VkCgkgICAgdG8gZmluZCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgcnVudGltZSBjb2RlLiAgSSBhbHNvIHVwZGF0ZWQKCSAgICBhbGwgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSBydW50aW1lIHRvIGltcGxlbWVudCB0aGVzZSB0d28gZnVuY3Rpb25zLgoKMDIvMjIvMjAwNTogbW1hdHVzIAoJICAgIEZpeCAldGVtcGxhdGUgKyBwcml2YXRlIGVycm9yIFNGIzEwOTk5NzYuCgowMi8yMS8yMDA1OiBtbWF0dXMgCgoJICAgIEZpeCBzd2lncnVuLnN3ZyB3YXJuaW5ncyByZXBvcnRlZCB3aGVuIHVzaW5nICJnY2MgLVcgLVdhbGwiCgkgICAgKHN0YXRpYy9pbmxpbmUgbm90IHVzZWQgaW4gZnJvbnQgb2YgYSBmdW5jdGlvbgoJICAgIGRlY2xhcmF0aW9uKSwgYW5kIGFkZCBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZAoJICAgIHVudXNlZCB3YXJuaW5ncyBlbHNld2hlcmUuCgoJICAgIEZpeCB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3MuCgoJICAgIFtQeXRob25dIFVzZSBuZXcgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQgd2FybmluZ3MgaW4KCSAgICBTV0lHSU5URVJOIG1ldGhvZHMuCgoJICAgIFtQeXRob25dIEZpeCBQeU9TX3NucHJpbnRmIGZvciBweXRob24gdmVyc2lvbnMgPCAyLjIgKFNGICMxMTA0OTE5KS4KCgkgICAgW1B5dGhvbl0gRml4IG1hcC9tdWx0aW1hcCB0byBhbGxvdyBlbXB0eSBtYXBzIChyZXBvcnRlZCBieQogIAkgICAgUGhpbGlwcGUgSGV0cm95KS4KCgkgICAgW0RvY3NdIEFkZCBzb21lIGRvY3VtZW50YXRpb24gdG8gUHl0aG9uLmh0bWwgYW5kCgkgICAgU1dJR1BsdXMuaHRtbCwgaW5jbHVkaW5nIGZvciBleGFtcGxlIHRoZSBmYWN0IHRoYXQKCSAgICAnZnJpZW5kcycgYXJlIG5vdyBzdXBwb3J0ZWQuCgowMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUEhQXSBQYXRjaCBmcm9tIE9sbHkgQmV0dHMsIHNvIHRoYXQgd3JhcHBlcnMgY29tcGlsZSB3aXRoIFplbmQgdGhyZWFkIHNhZmV0eSBlbmFibGVkLgoKMDIvMTcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4IGluIHNvbWUgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBtb2R1bGVzIHdoZW4gdXNpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgaW4gY29uc3RydWN0b3JzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlIHdhcyBub3QgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUKICAgICAgICAgICAgQysrIG9iamVjdCBtZW1vcnkgd2hlbiBhbnkgb2YgdGhlIGNvbnN0cnVjdG9ycyB0aGF0IHVzZSBkZWZhdWx0IGFyZ3VtZW50cyB3YXMgY2FsbGVkLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzExMTUwNTU6IEZhaWxlZCBtYWtlIGluc3RhbGwuIFBhdGNoIGZyb20gUm9iIFN0b25lLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGICMxMTIzNDE2IGZyb20gUGF1bCBNb29yZS4gQ29ycmVjdCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgU1RSSU5HQVJSQVkKICAgICAgICAgICAgdHlwZW1hcHMgaW4gdmFyaW91cy5pLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRGlzYWJsZWQgdHlwZW1hcCBzZWFyY2ggY2hhbmdlcyBmb3Igbm93IChzZWUgZW50cnkgMTkvMTIvMjAwNCkuIEl0IGJyZWFrcwogICAgICAgICAgICBvbGQgdHlwZW1hcHMsIGxlbmd0aGVucyB0aGUgZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMjUlIGFuZCBpbnRyb2R1Y2VzCiAgICAgICAgICAgIGluY29uc2lzdGVuY2llcy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIHN3aWcgLWhlbHAgZm9sbG93cyBvdGhlciBzb2Z0d2FyZSBieSBwcmludGluZyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBzd2lnIC12ZXJzaW9uIGFsc28gZGlzcGxheXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgQmVoYXZpb3VyIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggZm9yIHRoZSBsZXNzIGNvbW1vbmx5IHVzZWQgb3JkZXJpbmcgb2YgJWluY2x1ZGUgYW5kICNpbmNsdWRlLCBzbwogICAgICAgICAgICB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcy4gQnVnIHJlcG9ydGVkIGJ5IHJlcG9ydGVkIGJ5IE1heCBCb3dzaGVyLgogICAgICAgICAgICAgICVpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV9IAoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBTV0lHX2V4Y2VwdGlvbiBtYWNybyB3aWxsIG5vdyByZXR1cm4gZnJvbSB1bm1hbmFnZWQgY29kZSAvIG5hdGl2ZSBjb2RlCiAgICAgICAgICAgIGFzIHNvb24gYXMgaXQgaXMgY2FsbGVkLiBGaXhlcyBwb3NzaWJsZSBKVk0gY3Jhc2hlcyBhbmQgb3RoZXIgY29kZSB1bmV4cGVjdGVkbHkKICAgICAgICAgICAgYmVpbmcgZXhlY3V0ZWQuIE5vdGUgU1dJR19leGNlcHRpb24gaXMgb25seSBvY2Nhc2lvbmFsbHkgdXNlZCBieSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgd3JpdGVycywgYW5kIGlzIGJlc3QgYXZvaWRlZCBieSBTV0lHIHVzZXJzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBUeXBlbWFwcyBjYW4gbm93IGJlIHRhcmdldGVkIGF0IGdsb2JhbCB2YXJpYWJsZSBuYW1lcwogICAgICAgICAgICBhbmQgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBuYW1lcy4gUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgZm9yIAogICAgICAgICAgICB0aGUgc2V0dGVycyB3ZXJlIGlnbm9yZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IGdsb2JhbGludCAiLi4uIgogICAgICAgICAgICAgIGludCBnbG9iYWxpbnQ7CgowMi8xMy8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGQgJXR5cGVjaGVjayBmb3IgU1dJR1RZUEUsIGFkZCAldHlwZWNoZWNrIGZvciBwdHJkaWZmX3QsIGZpeAoJICAgIHR5cGVtYXBzIGZvciBzaXplX3QuCgoJICAgIFtQaWtlXSBNZXJnZSBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiBmb3IgaW1wcm92ZWQgUGlrZSBjb25maWd1cmF0aW9uLgoKMDIvMTIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBjb25maWd1cmUgc3dpdGNoZXMgLS13aXRob3V0LXRjbCwgLS13aXRob3V0LXB5dGhvbiBldGMuIGFsbG93IHRvCiAgICAgICAgICAgIGRpc2FibGUgdGhlIHNlYXJjaCBmb3IgaW5zdGFsbGVkIGxhbmd1YWdlcy4KCjAxLzMxLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIEFkZCBEb2hTb3J0TGlzdCB0byBET0gKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW06CiAgICAgICAgICAgICAgICsgU3BlZWQuIFR5cGUgbG9hZGluZyBpcyBub3cgTyhuIGxvZyBuKSBpbnN0ZWFkIG9mIE8oTl4yKSwgd2hpY2gKCSAgICAgICAgIGZvciBsYXJnZSBtb2R1bGVzIGlzIGEgaHVnZSBpbXByb3ZlbWVudC4KICAgICAgICAgICAgICAgKyBBIHdob2xlIGJ1bmNoIG9mIGZ1bmN0aW9ucyBpbiBzd2lncnVuLnN3ZyBubyBsb25nZXIgbmVlZCB0aGUgCiAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2xpc3RfaGFuZGxlIHBhc3NlZCB0byB0aGVtLiAgVGhlIG9ubHkgb25lIGxlZnQgaXMgCgkJIFR5cGVRdWVyeS4gIFRoaXMgYWxzbyBtYWtlcyBydW50aW1lLnN3ZyBhIGxvdCBzbWFsbGVyLgoJICAgICAgICsgU3BsaXQgdXAgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlIGludG8gdHdvIHN0cnVjdHVyZXMKCSAgICAgICAgIChzd2lnX3R5cGVfaW5mbyBhbmQgc3dpZ19jYXN0X2luZm8pCgkgICAgICAgKyBTdG9yZSBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbyByYXRoZXIgdGhhbiBqdXN0IHRoZSB0eXBlCgkgICAgICAgICBuYW1lIHN0cmluZyBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgY2FzdHMuIEZpcnN0IG9mZiwgdGhpcyBtYWtlcwoJICAgICAgICAgdGhlIGd1aWxlIG1vZHVsZSBhIGxpdHRsZSBmYXN0ZXIsIGFuZCBzZWNvbmQsIHRoZQoJICAgICAgICAgU1dJR19UeXBlQ2xpZW50RGF0YSgpIGZ1bmN0aW9uIGlzIGZhc3RlciB0b28uIAoJICAgICAgICsgQWRkIHRoZSBpZGVhIG9mIGEgbW9kdWxlIGludG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlLCBhbGwgdGhlCgkgICAgICAgICB0eXBlcyB3ZXJlIHN0b3JlZCBpbiBvbmUgaHVnZSBsaW5rZWQgbGlzdC4gTm93LCBhbm90aGVyIGxldmVsIGlzCgkgICAgICAgICBhZGRlZCwgYW5kIHRoZSB0eXBlIHN5c3RlbSBzdG9yZXMgYSBsaW5rZWQgbGlzdCBvZiBtb2R1bGVzLCBlYWNoCgkgICAgICAgICBvZiB3aGljaCBzdG9yZXMgYW4gYXJyYXkgb2YgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIGl0LgoJICAgICAgICsgRm9yIG1vcmUgaW5mb3JtYXRpb24gb2YgaG93IHRoZSBydW50aW1lIHR5cGUgc3lzdGVtIG5vdyB3b3JrcywKCSAgICAgICAgIHBsZWFzZSBzZWUgRG9jL01hbnVhbC90eXBlbWFwcy5odG1sIGFuZCBEb2MvRGV2ZWwvcnVudGltZS50eHQKCQkgCgkgICAgLSBVcGRhdGUgYWxsIGxhbmd1YWdlIG1vZHVsZXMgdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBUaGUgY2hhbmdlcwoJICAgICAgdG8gZWFjaCBsYW5ndWFnZSBtb2R1bGUgYXJlIG1pbm9yLiAgQWxsIGxhbmd1YWdlcyBhcmUgbm93IGFibGUgdG8KCSAgICAgIHVzZSBydW50aW1lLnN3ZyBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZQoJICAgICAgb25seSBweXRob24gYW5kIHBlcmwgZGlkLgoKCSAgICAtIFtndWlsZSwgbXpzY2hlbWUsIG9jYW1sLCBhbmQgcGhwNF0gIFRoZXNlIGxhbmd1YWdlcyBvcGVuZWQgdXAgdGhlCgkgICAgICBpbml0IGZ1bmN0aW9uIGluc2lkZSB0aGUgLmN4eCBjb2RlLCBhbmQgYW55IGNvZGUgaW4gdGhlIC5zd2cgZmlsZXMKCSAgICAgIGluIHRoZSBpbml0IHNlY3Rpb24gd2FzIGluc2lkZSB0aGlzIGZ1bmN0aW9uLiAgVGhpcyB3YXMgYSBwcm9ibGVtCgkgICAgICBmb3Igc3dpZ2luaXQuc3dnLCB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIFNXSUdfaW5pdAoJICAgICAgZnVuY3Rpb24gaXMgb3BlbmVkLiAgVGh1cyBJIGNoYW5nZWQgdGhlc2UgbGFuZ3VhZ2VzIHRvIGJlIGxpa2UKCSAgICAgIHB5dGhvbiBvciBwZXJsLCB3aGVyZSB0aGUgaW5pdCBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgLnN3ZwoJICAgICAgZmlsZS4KCSAgICAgIAoJICAgIC0gW1J1YnldIEluc3RlYWQgb2YgbW92aW5nIHRoZSBpbml0IGZ1bmN0aW9uIHRvIHRoZSAuc3dnIGZpbGUsIEkKCSAgICAgIGFkZGVkIGEgbmV3IHNlY3Rpb24gaW5pdGJlZm9yZWZ1bmMsIGFuZCB0aGVuIGFkZGVkCgkgICAgICAlaW5zZXJ0KGluaXRiZWZvcmVmdW5jKSAic3dpZ2luaXQuc3dnIgoKCSAgICAtIFtNelNjaGVtZV0gRml4IGVudW1zIGFuZCBmaXggRXhhbXBsZXMvTWFrZWZpbGUuaW4gc28gdGhhdCBpZgoJICAgICAgbXVsdGlwbGUgLUkgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIElOQ0xVREVTIHZhcmlhYmxlLCBlYWNoCgkgICAgICBnZXRzIGEgKytjY2YuCgoJICAgIC0gW0d1aWxlIEdIXSBVcGRhdGUgR3VpbGUgR0ggdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBTZWUKCSAgICAgIERvYy9NYW51YWwvR3VpbGUuaHRtbCBmb3IgaG93IHNtb2JzIGFyZSBub3cgdXNlZC4KCjAxLzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IHR5cGVtYXAgY2FsbGVkICdjc2NvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuCgogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXAgY2FsbGVkICdqYXZhY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4gQW5vdGhlciB0eXBlbWFwIG5hbWVkICdqYXZhY29uc3RydWN0X2RpcmVjdG9yJwogICAgICAgICAgICBpcyB1c2VkIGluc3RlYWQgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgYSBkaXJlY3RvciBjbGFzcy4KCiAgICAgICAgICAgIFtDIywgSmF2YV0gSWYgYSBDKysgY2xhc3MgZGlkIG5vdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYSBwcm90ZWN0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRy4gVGhpcyBzZWVtcyBpcyB1bm5lY2Vzc2FyeSBhbmQgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICAgICBhbmQgdGhlcmVieSBnaXZpbmcgdGhlIHVzZXIgYWxtb3N0IGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGNvZGUgYWxvbmcgd2l0aCB0aGUKICAgICAgICAgICAgbmV3IHR5cGVtYXBzIGFib3ZlLgoKMTkvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtEaXNhYmxlZCwgc2VlIGVudHJ5IDAyLzE1LzIwMDRdCiAgICAgICAgICAgIC0gRml4IHR5cGVtYXAgc2VhcmNoLCBub3cgdGhlICJvdXQiIHR5cGVtYXAgc2VhcmNoIGlzIGRvbmUgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpICAgLT4gIGludCAqRm9vOjpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqRm9vOjpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICoKCiAgICAgICAgICAgICAgIHRoZW4sIG5vdyB5b3UgY2FuIGJlIG1vcmUgc3BlY2lmaWMsIGFuZCBkZWZpbmUKCiAgICAgICAgICAgICAgLyogYXBwbHkgb25seSBmb3IgICdGb286OmZvbycgbWV0aG9kICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBGb286OmZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgLyogYXBwbHkgZm9yIGFsbCAnZm9vJyBmdW5jdGlvbnMvbWV0aG9kcyAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogZm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgaW50ICpmb28oaW50ICpiYXIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgkgIAoKMTUvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIC0gTW9yZSBmaXhlcyBmb3IgdGVtcGxhdGVzIGFuZCB0ZW1wbGF0ZSBkZWZhdWx0IGFyZ3MuCiAgICAgICAgICAgICAgU2VlIHRlbXBsYXRlX2RlZmF1bHQuaSBmb3Igc2NhcnkgY2FzZXMgdGhhdCBub3cgYXJlIAogICAgICAgICAgICAgIHN1cHBvcnRlZCwgYmVzaWRlcyB0aGUgYWxyZWFkeSB1Z2x5IFNUTC9zdGQgY2FzZXMuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC0gQ29zbWV0aWNzIGFuZCBtb3JlIHVzZSBvZiAnY29uc3QnIHdoZXJlIGl0IHdhcyBpbXBsaWNpdC4KICAgICAgICAgICAgLSBPdGhlciBmaXhlcyBmb3IgT1NTLCB3aGljaCBpcyBub3cgd29ya2luZyBhZ2FpbiB3aXRoIDEuMy4yNS4KCQpWZXJzaW9uIDEuMy4yNCAoRGVjZW1iZXIgMTQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzEyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gRml4IGEgYnVuY2ggb2YgYnVncyByZWxhdGluZyB0byAtcHJveHkgc3VwcG9ydAoJICAgICAgKyBub24tY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIG1lbWJlciBjbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgYWRkZWQgYSAtbm91bml0IGFyZ3VtZW50LCB3aGljaCBkb2VzIG5vdCBleHBvcnQgdGhlIChkZWNsYXJlICh1bml0IC4uLikpCgkgICAgICArIGNvcnJlY3RseSBpbnN0YWxsIHN3aWdjbG9zcHJlZml4LnNjbQoJICAgICAgKyBjb25zdGFudHMgKGVudW1zLCBkZWZpbmVzKSBub3cgY29ycmVjbHkgZXhwb3J0IHdoZW4gdXNpbmcgLXByb3h5CgoxMi8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25maWd1cmUgZml4IGZvciB3aGVuIG1vcmUgdGhhbiBvbmUgdmVyc2lvbiBvZiBqbmlfbWQuaCBpcyBmb3VuZAogICAgICAgICAgICBpbiB0aGUgSmF2YSBpbmNsdWRlIGRpcmVjdG9yeSAod2FzIGdlbmVyYXRpbmcgbG90cyBvZiBzZWQgZXJyb3IKICAgICAgICAgICAgbWVzc2FnZXMpLgoKMTIvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIGFycmF5c19qYXZhLmkgc28gdGhhdCBvbmUgY2FuIGFwcGx5IHRoZSBhcnJheQogICAgICAgICAgICB0eXBlbWFwcyB0byBmdW5jdGlvbnMgdGFraW5nIHBvaW50ZXJzIGFzIGlucHV0LCBlZwoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgJWFwcGx5IGludFtdIHtpbnQqfTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAqYSk7CgoxMi8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgbW9kcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuIE5ldyB0eXBlbWFwcwogICAgICAgICAgICBkaXJlY3RvcmRpc2Nvbm5lY3QgYW5kIGRpcmVjdG9yZGlzY29ubmVjdF9kZXJpdmVkIGZvciB0aGUgCiAgICAgICAgICAgIHN3aWdEaXJlY3RvckRpc2Nvbm5lY3QoKSBtZXRob2QuIEFsc28gZml4IHRvIGdldCB0aGUgamF2YXBhY2thZ2UKICAgICAgICAgICAgdHlwZW1hcCB3b3JraW5nIGFnYWluLgoKMTIvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBGaW5pc2hpbmcgdGhlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzICsgc3BlY2lhbGl6YXRpb25zLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBOb3cgd2UgdXNlIHRoZSBuZXcgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyBpbiB0aGUgc3RkL1NUTCBsaWJyYXJ5LiBUaGF0IG1lYW5zIHRoZSBpbnRlcm5hbAoJICAgICAgc3dpZyBmaWxlcyBhcmUgZ2V0dGluZyB1Z2xpZXIgc2luY2Ugd2Ugbm93IHN1cHBvcnQgdGhlCgkgICAgICBvcmlnaW5hbCBkZWNsYXJhdGlvbnM6CgoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPCBfVHAgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQkuLi4uCgkJfTsKCSAgICAgIAkgICAgIAogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5ID4sCgkgICAgICAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHAgPiA+ID4KICAgICAgICAgICAgICAgIGNsYXNzIG1hcCB7CgkJLi4uLgoJCX07CiAKICAgICAgICAgICAgICBhbmQgdGhlIHVzZXIgY2FuIHVzZSB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcwoKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBzdGQ6OmFsbG9jYXRvcjxpbnQ+ID47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgTXlBbGxvY2F0b3I8aW50PiA+OwoKICAgICAgICAgICAgICBOb3cgd2UgYXJlIGNsb3NlciB0byB0aGUgY2xlYW5pbmcvcmV3cml0aW5nIG9mIHRoZQoJICAgICAgcHl0aG9uIHN0ZC9TVEwgc3VwcG9ydCwgc3VjaCB0aGF0IHdlIHJlY292ZXIgc3VwcG9ydCBmb3IKCSAgICAgIE1TVkMrKyA2LjAsIGFuZCB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwoJICAgICAgdG9vLgoKCjEyLzAyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgdXNpbmcgYSBtZW1iZXIgZW51bQogICAgICAgICAgICBhbmQgdHlwZXNhZmUvcHJvcGVyIGVudW1zIGVuYWJsZWQuCgoxMi8wMS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0eXBlbWFwcyB0byB3b3JrIHdpdGggdGVtcGxhdGVzIGFuZCBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzLCBpZQoKCSAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQiA9IGludD4KICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgfTsKCgkgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxpbnQ+ICp7Li4ufQoJICAgICAgICV0eXBlbWFwKG91dCkgRm9vPGludCxpbnQ+ICp7Li4ufQoKCSAgICAgICBGb288aW50PiAqIGZvbyggRm9vPGludD4gKmYxLCBGb288aW50LGludD4gKmYyKTsKCgkgICAgICBub3cgJ2YxJywgJ2YyJyBhbmQgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlIHRoZSBwcm92aWRlZAoJICAgICAgdHlwZW1hcHMgcHJvcGVybHkuCgoJICAgICAgVGhpcyBpcyBoaWdobHkgbmVlZGVkIGZvciBwcm9wZXIgU1RMIHN1cHBvcnQsIHNlZSBuZXcgCgkgICAgICBzdGRfYmFzaWNfc3RyaW5nLmksIHN0ZF9zc3RyZWFtLmksIGV0Yy4KCgkgICAgLSBBZGRlZCBzdGRfc3N0cmVhbS5pLCBhbmQgZml4IHN0ZF9iYXNpY19zdHJpbmcuaSB0byB1c2UKCSAgICAgIHRoZSBuZXcgdHlwZW1hcHMgKyB0ZW1wbGF0ZSBkZWYuIGFyZyBtZWNoYW5pc20uIEFsc28sCgkgICAgICBhZGRlZCB0aGUgbmVlZGVkIHN0ZF9hbGxvYy5pLiBOb3csIGFsbCB0aGUgY29udGFpbmVycwoJICAgICAgY2FuIGJlIG1vZGlmaWVkIHRvIHN1cHBvcnQgc3RkOjphbGxvY2F0b3IsIGxpa2UgaW46CgkgICAgICAKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQSA9IHN0ZDo6YWxsb2NhdG9yPFQgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQlwdWJsaWM6CgkJLi4uLgoJCX07CgkgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG9ubHkgY29tcGxldGVkIGJ5IG5vdyBmb3IgYmFzaWNfc3RyaW5nLgoKCSAgICAtIEZpeCBmb3Igc21hcnQgcG9pbnRlcnMgKyBtZW1iZXJzICsgZXh0ZW5zaW9uczoKCgkgICAgICAlZXh0ZW5kIEZvbyB7CgkgICAgICAgIGludCBleHRlbnNpb24oaW50IGksIGludCBqKSB7IHJldHVybiBpOyB9CgkJaW50IGV4dGVuc2lvbigpIHsgcmV0dXJuIDE7IH0KCSAgICAgIH0KCgkgICAgICAlaW5saW5lICV7CgoJICAgICAgY2xhc3MgRm9vIHsKCSAgICAgIHB1YmxpYzoKCQlpbnQgeTsKCQlzdGF0aWMgY29uc3QgaW50IHo7CgkgICAgICB9OwogIAoJICAgICAgY2xhc3MgQmFyIHsKCSAgICAgICAgRm9vICpmOwoJICAgICAgcHVibGljOgoJICAgICAgICBCYXIoRm9vICpmKSA6IGYoZikgeyB9CgkJRm9vICpvcGVyYXRvci0+KCkgewoJCSAgcmV0dXJuIGY7CgkJfQoJICAgICAgfTsKCgkgICAgICBub3cgeW91IGNhbiAKCSAgICAgCgkgICAgICBmID0gRm9vKCkKCSAgICAgIGYueSA9IDMKCSAgICAgIGEgPSBmLnoKCSAgICAgIGYtPmV4dGVuc2lvbigpCiAKCSAgICAgIGIgPSBCYXIoZikKCSAgICAgIGIueSA9IDMKCSAgICAgIGEgPSBiLnoKCSAgICAgIGItPmV4dGVuc2lvbigpCgoJICAgIC0gT3RoZXIgc21hbGwgZXJyb3JzIGZpeGVzLCBtb3N0bHkgcHl0aG9uLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGJ1ZyBmaXhlcyBzbyB0aGF0IHRoZSBjb3JyZWN0IGphdmEgdHlwZXMKICAgICAgICAgICAgYW5kIGNhbm9uaWNhbGl6ZWQgdHlwZXMgaW4gdGhlIEpOSSBjb2RlIGFyZSBlbWl0dGVkLiBVc2Ugb2YgdGhlCiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGVzIGluIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBub3cKICAgICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBub24tZGlyZWN0b3IgdHlwZW1hcHMuIFRoZSB0eXBlcyB1c2VkIGZvciAKICAgICAgICAgICAgdHlwZW1hcCBsb29rdXBzIGFyZSBhbHNvIGNvcnJlY3RlZCBpbiBhIGZldyBwbGFjZXMuIElmIHlvdSAKICAgICAgICAgICAgcHJldmlvdXNseSBoYWQgeW91ciBvd24gZGlyZWN0b3IgdHlwZW1hcHMsIGVuc3VyZSB0aGV5IGFyZSB1c2luZyB0aGUKICAgICAgICAgICAgY29ycmVjdCBDKysgdHlwZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbnN0IGVudW0gU1dJR1RZUEUgJiB0eXBlbWFwcyBhZGRlZC4gVGhlc2Ugd3JhcCBjb25zdCBlbnVtIHJlZmVyZW5jZXMKICAgICAgICAgICAgYXMgaWYgdGhleSB3ZXJlIHBhc3NlZCBieSB2YWx1ZS4gQ29uc3QgZW51bSByZWZlcmVuY2VzIHRodXMgd29yayB0aGUKICAgICAgICAgICAgc2FtZSBhcyBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgY29uc3QgZG91YmxlICYsIAogICAgICAgICAgICBjb25zdCBpbnQgJiBldGMuIFR5cGVtYXBzIGFkZGVkIGZvciBKYXZhLCBDIywgUnVieSwgVGNsLCBQZXJsIGFuZCBQaWtlLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgc3BlY2lhbCB2YXJpYWJsZTogJCpqYXZhY2xhc3NuYW1lLCBzaW1pbGFyIHRvICRqYXZhY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCAkJmphdmFjbGFzc25hbWUuIFRoZSBuZXcgb25lIHJlbW92ZXMgYSBwb2ludGVyIGZyb20gdGhlIEMgdHlwZSBiZWZvcmUKICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBKYXZhIGNsYXNzIG5hbWUuIE9uZSBvciBtb3JlIG9mICRqYXZhY2xhc3NuYW1lLAogICAgICAgICAgICAkJmphdmFjbGFzc25hbWUgb3IgJCpqYXZhY2xhc3NuYW1lIG1heSBub3cgYXBwZWFyIGluIGEgdHlwZW1hcC4gTGlrZXdpc2UgZm9yCiAgICAgICAgICAgIEMjIHVzaW5nIGNzY2xhc3NuYW1lIGluc3RlYWQgb2YgamF2YWNsYXNzbmFtZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBsYXN0IHZlc3RpZ2VzIG9mIGVudW1zIGJlaW5nIGhhbmRsZWQgYXMgaW50ZWdlcnMgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICBpbnRlcm5hbHMuIFRoZSB3cmFwcGVyIG1ldGhvZHMgdXNlIHRoZSBlbnVtIHR5cGUgcmF0aGVyIHRoYW4gYW4gaW50CiAgICAgICAgICAgIG5vdy4gVGhlIG5ldCByZXN1bHQgaXMgYWRkZWQgdHlwZSBzYWZldHkgZm9yIGVudW1zIHdoZW4gaGFuZGxlZCBhcwogICAgICAgICAgICBwb2ludGVycywgcmVmZXJlbmNlcyBldGMuIFByZXZpb3VzbHkgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGEgbWV0aG9kCiAgICAgICAgICAgIHRha2luZyBhIHBvaW50ZXIgdG8gYW4gZW51bSwgYSBwb2ludGVyIHRvIGFuIGludCBvciBhIHBvaW50ZXIgdG8gYW4KICAgICAgICAgICAgZW51bSBvZiBzb21lIG90aGVyIHR5cGUgY291bGQgaW5hZHZlcnRhbnRseSBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZC4KICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGVudW0gaXMgbm8gbG9uZ2VyIGJhc2VkIG9uCiAgICAgICAgICAgIGFuIGludCwgYnV0IHRoZSBlbnVtIHR5cGUgaW5zdGVhZC4gQW5vbnltb3VzIGVudW1zIGFyZSBzdGlsbCBoYW5kbGVkCiAgICAgICAgICAgIGFzIGludGVnZXJzLgoKICAgICAgICAgICAgVGhlIGNvbnNlcXVlbmNlIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2UgdXNlcnMgaW4gY29ycmVjdCB1c2FnZSBvZiBlbnVtcwogICAgICAgICAgICBzaG91bGQgbm90IGJlIG5vdGljZWFibGUuIFRoZXJlIGlzIG5vIGNoYW5nZSBmb3IgYW55IG9mIHRoZSBsYW5ndWFnZXMKICAgICAgICAgICAgd2hlcmUgZW51bXMgYXJlIHBhc3NlZCBieSB2YWx1ZSAtIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2lsbAogICAgICAgICAgICBzdGlsbCBhY2NlcHQgYW4gaW50ZWdlciBmb3IgYW4gZW51bSB2YWx1ZSBhbmQgdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgIGxhbmd1YWdlcyBzdGlsbCB1c2UgZWl0aGVyIHR5cGVzYWZlIGVudW1zLCBpbnRlZ2VycyBvciBwcm9wZXIgZW51bXMKICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgY29uZmlndXJlcy4gRm9yIEphdmEgYW5kIEMjIHVzZXJzIGEgY2hhbmdlCiAgICAgICAgICAgIGluIHRoZSB0eXBld3JhcHBlciBjbGFzcyBuYW1lIGhhcyBvY2N1cnJlZCAoZm9yIGVudW0gcG9pbnRlcnMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMgZXRjKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IG9uZT0xLCB0d28gfTsKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMqIG51bWJlcigpOwoKICAgICAgICAgICAgSW4gSmF2YSBhbmQgQyMgdGhpcyBtdXN0IG5vdyBiZSBjb2RlZCBhcwoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX051bWJlcnMgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICByYXRoZXIgdGhhbgoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX2ludCBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvMjAwNDogd3NmdWx0b24vbW1hdHVzCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgZGVwcmVjYXRlZCB3YXJuaW5nIGZvciAlbmFtZSBhbmQgcmVtb3ZlIHJlbWFpbmluZyAlbmFtZQogICAgICAgICAgICB1c2FnZSBpbiB0aGUgU1dJRyBsaWJyYXJpZXMuCgoxMS8yMS8wNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgdGhlIFB5U3dpZ09iamVjdCB0byBiZSB1c2VkIGZvciBjYXJyeWluZwoJICAgICAgdGhlIGluc3RhbmNlIEMvQysrIHBvaW50ZXJzLiBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZgoJICAgICAgc3RyaW5nIGFuZCBQeUNPYmplY3RzLgoKCSAgICAgIFRoZSBuZXcgUHlTd2lnT2JqZWN0IGlzIGV2ZW4gc2FmZXIgdGhhbiBQeUNPYmplY3QsIGFuZAoJICAgICAgbW9yZSBmcmllbmRseSB0aGFuIHBsYWluIHN0cmluZ3M6CgoJICAgICAgbm93IHlvdSBjYW4gZG8KCgkgICAgICAgIHByaW50IGEudGhpcwoJCTxTd2lnIE9iamVjdCBhdCBfMDA2OTE2MDhfcF9BPgoKCQlwcmludCBzdHIoYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EKCgkJcHJpbnQgbG9uZyhhLnRoaXMpCgkJMTM1Njg2NDAwCgoJCXByaW50ICIlcyAweCV4IiAlIChhLnRoaXMsIGEudGhpcykKCQlfMDA2OTE2MDhfcF9BIDB4ODE2NjkwMAoKCSAgICAgIHRoZSBsYXN0IG9uZSBpcyB2ZXJ5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyB0aGUgQy9DKysKCSAgICAgIHNpZGUsIHNpbmNlIGlzIHRoZSBwb2ludGVyIHZhbHVlIHlvdSB3aWxsIHVzdWFsbHkgZ2V0CgkgICAgICBmcm9tIHRoZSBkZWJ1Z2dlci4KCgkgICAgICBBbHNvLCBpZiB5b3UgaGF2ZSBzb21lIG9sZCBjb2RlIHRoYXQgdXNlcyB0aGUgc3RyaW5nCgkgICAgICByZXByZXNlbnRhdGlvbiAiXzAwNjkxNjA4X3BfQSIsIHlvdSBjYW4gdXNlIGl0IG5vdyBhZ2FpbgoJICAgICAgdXNpbmcgJ3N0cihwdHIpJywgb3IgYnkgY2FsbGluZyAnc3RyID0gUHlPYmplY3RfU3RyKG9iaiknCgkgICAgICBpbiB0aGUgQy9DKysgc2lkZS4KIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgbWFpbmx5IGZvciBub3N0YWxnaWMgc3dpZyB1c2VycyB0aGF0IG1pc3MKCSAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGJ1dCBhbHNvIGFsbG93cyB0byBzYXkgYWdhaW4KCgkgICAgICAgIGlmIGEudGhpcyA9PSBiLnRoaXM6CgkJICByZXR1cm4gImEgaXMgYiIKCgkgICAgICBhbmQgd2VsbCwgc2luY2UgdGhlIGNoYW5nZSB3ZXJlIHJlYWxseSBzaW1wbGUsIG1heWJlIGluCgkgICAgICB0aGUgZnV0dXJlIHdlIHdpbGwgYmUgYWJsZSB0byBkbwogICAKCQluZXh0ID0gYS50aGlzICsgMQoKCSAgICAgIG9yIGFkZCBuYXRpdmUgcHl0aG9uIGl0ZXJhdGlvbiBvdmVyIG5hdGl2ZSBDL0MrKyBhcnJheXMsCgkgICAgICBpZSwgbm8gbmVlZCB0byBjcmVhdGUvY29weSBuZXcgdHVwbGVzIHdoZW4gcmV0dXJuaW5nIGFuZAoJICAgICAgYXJyYXkgb3IgdmVjdG9yLgoKCSAgICAgIEFsc28sIGEgUHlTd2lnUGFja2VkIG9iamVjdCB3YXMgYWRkaW5nIHRvIGNhcnJ5IGEgbWVtYmVyCgkgICAgICBtZXRob2QgcG9pbnRlciwgYnV0IHRoaXMgaXMgcHJvYmFibHkgYSB0ZW1wb3Jhcnkgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzk4Mjc1MyBmcm9tIEZhYnJpY2UgU2FsdmFpcmU6IEFkZHMgZGVwZW5kZW5jaWVzIGdlbmVyYXRpb24gZm9yCiAgICAgICAgICAgIGNvbnN0cnVjdGluZyBtYWtlZmlsZXMuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtTUYgLU1EIC1NTUQgdG8gd29yawogICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IG9wdGlvbnMgLU0gYW5kIC1NTS4gVGhlc2Ugb3B0aW9ucyBhcmUgbmFtZWQgdGhlIHNhbWUKICAgICAgICAgICAgYW5kIHdvcmsgdGhlIHNhbWUgYXMgaW4gZ2NjLgoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWlnbm9yZS8lcmVuYW1lIGNoYW5nZXMgZm9yIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB0byBtaXJyb3IKICAgICAgICAgICAgJWZlYXR1cmUgYmVoYXZpb3VyLiBTZWUgcHJldmlvdXMgZW50cnkuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIGZpbmUgdHVuaW5nIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLiBBbnkgJWZlYXR1cmUgdGFyZ2V0aW5nIGEgbWV0aG9kIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2lsbCBhcHBseSB0byBhbGwgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlmIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlCiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUsIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBtYXRjaCB0aGF0IGV4YWN0CiAgICAgICAgICAgIHdyYXBwZXIgbWV0aG9kIG9ubHkgYW5kIG5vdCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHdpbGwgYXBwbHkgdGhlIGZlYXR1cmUgdG8gYWxsIHRocmVlIHdyYXBwZXIgbWV0aG9kcywgdGhhdCBpczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBvbmx5IGFwcGx5IHRvIHRoaXMgd3JhcHBlciBtZXRob2Q6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKCiAgICAgICAgICAgYW5kIG5vdCB0aGVzZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1ha2UgJWZlYXR1cmUgbW9yZSBwb3dlcmZ1bCB0byBlYXNlIHRoZSBtaWdyYXRpb24KICAgICAgICAgICB0byBuZXcgZGVmYXVsdCBhcmd1bWVudHMgd3JhcHBpbmcgYXBwcm9hY2guCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIElmIHlvdSBwcmV2aW91c2x5IGhhZCBhICVmZWF0dXJlIGFuZCBkaWRuJ3Qgc3BlY2lmeSB0aGUgZGVmYXVsdCBhcmd1bWVudHMsCiAgICAgICAgICAgeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhlbSBpbiBub3cgb3IgeW91IGNhbiBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91cgogICAgICAgICAgIGJ5IHVzaW5nICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKS4KCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcHMgZm9yIHN0ZDo6dmVjdG9yIGFkZGVkIGludG8gc3RkX3ZlY3Rvci5pLiBUaGUgcHJveHkgY2xhc3NlcwogICAgICAgICAgICBnZW5lcmF0ZWQgYXJlIG1vZGVsbGVkIG9uIHRoZSAuTkVUIEFycmF5TGlzdCBjbGFzcy4gVGhpcyBpc24ndCBxdWl0ZQogICAgICAgICAgICByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbiB5ZXQsIGJ1dCB3aWxsIHdvcmsgd2l0aCB2ZWN0b3JzIG9mIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBhbmQgc29tZSBjbGFzc2VzLgoKMTAvMy8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0dVSUxFXSBUaGUgLXNjbSBpbnRlcmZhY2UgaXMgbm93IHRoZSBkZWZhdWx0LiAgVGhlIG9sZCBHSCBpbnRlcmZhY2UgY2FuCgkgICAgc3RpbGwgYmUgZW5hYmxlZCBieSBwYXNzaW5nIC1naCB0byBTV0lHLgoKMTAvMi8yMDA0OiBtbWF0dXMKCgkgICAgLSBNb3JlIGZpeGVzIGZvciBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMuCgkgICAgICBBcyBhbiBleHRyYSBib251cywgd2UgZ2V0ICV0ZW1wbGF0ZSBzdXBwb3J0IGZvciBzdGF0aWMvbWVtYmVycyBjbGFzcwoJICAgICAgbWV0aG9kcywgaWUsIG5vdyB5b3UgY2FuIHNheToKCgkgICAgICAgIG5hbWVzcGFjZSBzcGFjZSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEJCQkgICAgCgkgICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CSAgICAKCSAgICAgICAgICAgc3RhdGljIHZvaWQgZm9vVChZIHkpIHsgfQoJICAgICAgICAgfTsJCgkJfQkJCSAgICAKCSAgICAgIAkgICAgICAJCQkgICAgCgkgICAgICAgIHN0cnVjdCBCCQkJICAgIAoJICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JCSAgICAKCSAgICAgICAgICB2b2lkIGJhclQoWSB5KSB7fSAKCSAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKCgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8ZG91YmxlPjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxpbnQ+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGNoYXI+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8ZG91YmxlPjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGludD47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxjaGFyPjsKCgkgICAgICBhbmQgY2FsbAoKCSAgICAgICAgQS5mb28oMSkKCQliID0gQigpCgkJYi5iYXIoMSkKCSAgICAgIAoJICAgICAgbm90ZSB0aGUgbWV0aG9kcyBhcmUgZW1pdHRlZCBpbnNpZGUgdGhlIGNsYXNzZXMsCgkgICAgICBhbmQgaGVuY2UsIHRoZSAldGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gdGhlICdtZW1iZXInCgkgICAgICBtZXRob2QgbmFtZSwgbm90IGEgZ2xvYmFsIG5hbWVzcGFjZSBuYW1lLgoKMTAvMzEvMjAwNDogbW1hdHVzCgkgICAgLSBTb2x2ZSBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMsIGFzIGluCgoJICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgIHN0cnVjdCBCYXI7CgkJIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHN0cnVjdCBmb286OkJhciA6IEZvbyB7CiAgICAgICAgICAgICAgIH07CgoJICAgICAgIHNlZSBuYW1lc3BhY2VfY2xhc3MuaSBmb3IgbW9yZSBleGFtcGxlcy4KCiAgICAgICAgICAgIC0gRml4ICV0ZW1wbGF0ZSBkaXJlY3RpdmUgdG8gcHJvcGVybHkgdXNlIG5hbWVzcGFjZXMsCiAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSBjYXNlOgoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewoJCSAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCQkgICAgICAgc3RydWN0IFB0ciB7fTsKICAgICAgICAgICAgICAgICAgIH0KCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsJCSAgCgkJICAgICAgIHN0cnVjdCBPYmoxIHt9OwoJCSAgICAgICB0eXBlZGVmIFB0cjxPYmoxPiBPYmoxX3B0cjsKICAJCSAgICAgICAldGVtcGxhdGUoT2JqMV9wdHIpIFB0cjxPYmoxPjsgCgkJICAgfQkJCQkgIAoJCSAgIAkJCQkgIAoJCSAgIG5hbWVzcGFjZSB0d28gIAoJCSAgIHsKCQkgICAgICAgc3RydWN0IE9iajIge307CQoJCSAgICAgICB0eXBlZGVmIG9uZTo6UHRyPE9iajI+IE9iajJfcHRyOwoJCSAgICAgICAldGVtcGxhdGUoT2JqMl9wdHIpIG9uZTo6UHRyPE9iajI+OwoJCSAgIH0KCgkgICAgICB0aGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIG5hbWVzcGFjZSBuYW1lICdvbmUnIHRvIGNyZWF0ZQogICAgICAgICAgICAgIGEgbmFtZXNwYWNlIG5vZGUgdG8gZW1pdCB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICBqdXN0IGFzIGJlZm9yZSwgYnV0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSByZXNvbHZlZAogICAgICAgICAgICAgIGFuZCBxdWFsaWZpZWQgaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlICgnb25lJyBvciAndHdvJykuCiAgICAgICAgICAgICAgVGhpcyBpcyBzYW1lIHdheSB0aGF0IHR5cGVkZWYgd29ya3MuIAoKCSAgICAgIFRoaXMgcmVzb2x2ZSB0aGUgc21hcnRfcG9pbnRlcl9uYW1lc3BhY2UyLmkgY2FzZSwgYW5kIGF0CiAgICAgICAgICAgICAgdGhlIHNhbWUgdGltZSwgc2V2ZXJhbCBvdGhlciBvbmVzIHdoZXJlIGJlZm9yZSBzd2lnIHdhcwogICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlCgoJICAgICAgICAiQ2FuJ3QgaW5zdGFudGlhdGUgdGVtcGxhdGUgJ3h4JyBpbnNpZGUgbmFtZXNwYWNlICd5eSciCgkgICAgICAKCSAgICAgIGVycm9yIG1lc3NhZ2UuIEluIGZhY3QsIHRoYXQgZXJyb3IgZG9lc24ndCBleGlzdAoJICAgICAgYW55bW9yZS4gWW91IGNhbiBvbmx5IGdldCBhbiBlcnJvciBpZiB5b3UgdXNlIGEgYmFkCgkgICAgICBuYW1lc3BhY2UgbmFtZSBvciBzby4KCjEwLzMwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW3J1YnldIERpcmVjdG9ycyBmaXhlczoKCSAgICAgIC0gZW51bXMgYW5kIHN0ZDo6c3RyaW5ncyBhcmUgd29ya2luZyBub3cgKHNldmVyYWwKCSAgICAgICAgcmVwb3J0cyBpbiBidWcgdHJhY2sgc3lzdGVtKQoJICAgICAgLSBhZGRlZCBwYXRjaCAxMDI1ODYxIGZvciBkaXJlY3RvciArIGV4Y2VwdGlvbnMKCQkKICAgICAgICAgICAgICAqKiogQXR0ZW50aW9uICoqKjogcnVieSB3aXRoIGRpcmVjdG9ycyArIHByb3RlY3RlZAogICAgICAgICAgICAgIG1lbWJlcnMgd29yayB3aXRoIHZlcnNpb24gMS43Ky4gT2xkZXIgdmVyc2lvbnMgc2VlbXMgdG8KICAgICAgICAgICAgICBoYXZlIGEgYnJva2VuIHNpZ25hdHVyZSBmb3IncmJfcHJvdGVjdCcuCgkJCgkgICAgICBJZiB5b3UgbmVlZCB0byB1c2UgYW4gb2xkIHZlcnNpb24sIGxvb2sgYXQKCgkgICAgICBodHRwOi8vZXhjcnVieS5zb3VyY2Vmb3JnZS5uZXQvZG9jcy9odG1sL3J1YnlfX2hhY2tzXzhocHAtc291cmNlLmh0bWwKICAJICAgICAgZm9yIHdvcmthcm91bmRzLgoJICAgICAgCiAgICAgICAgICAgIC0gW3J1YnldIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIGluIHR5cGVtYXAgKGJ1ZyAxMDM3MjU5KQoKCSAgICAtIFt0Y2xdIEZpeCAoZW51bXN8Y29uc3RhbnRzKSArIG5hbWVzcGFjZSBvcHRpb24gCgkgICAgICAgICAgICAocmVwb3J0ZWQgYnkgamFzb24ubS5zdXJwcmlzZUBpbnRlbC5jb20pLgoKICAgICAgICAgICAgLSBbcGVybF0gQWRkIHBhdGNoIDk2MjE2OCBmb3IgbXVsdGlwbGUgaW5oZXJldGFuY2UKCSAgICAKCSAgICAtIEZpeCAnZGVmaW5lZCcgYXMgdmFyaWFibGUgbmFtZS4KCjEwLzI5LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGdsb2JhbCBzY29wZSBvcGVyYXRvciB1c2VkIGZvciBmcmllbmQgbWV0aG9kczoKCiAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBmcmllbmQgdm9pZCA6Omdsb2JhbHNjb3BlKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMTAvMjgvMjAwNDptbWF0dXMKCSAgICAtIEFkZGVkIG1vZHVsZSBhbmQgc3dpZyBvcHRpb24gInRlbXBsYXRlcmVkdWNlIiB0byBmb3JjZSBzd2lnCgkgICAgICB0byByZWR1Y2UgYW55IHR5cGUgbmVlZGVkIHdpdGggdGVtcGxhdGVzLCBpZSwgaW4gdGhlc2UgY2FzZXMKCiAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0ZW1wbGF0ZXJlZHVjZSIpIHRlc3QKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEEgeyB9OwoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludDsKCSAgICAgICAgJXRlbXBsYXRlKEFfSW50KSBBPEludD4gID09PiAgJXRlbXBsYXRlKEFfSW50KSBBPGludD4KCiAgICAgICAgICAgICAgICB0eXBlZGVmIEIqIEJwOwoJICAgICAgICAldGVtcGxhdGUoQV9CcCkgQTxCcD4gID09PiAgJXRlbXBsYXRlKEFfQnApIEE8Qio+CgogICAgICAgICAgICAgIHN3aWcgcmVkdWNlcyB0aGUgdHlwZXMgSW50IGFuZCBCcCB0byB0aGVpciBwcmltaXRpdmVzCiAgICAgICAgICAgICAgaW50IGFuZCBCKi4gVGhpcyBpcyBjbG9zZXIgdG8gdGhlIHVzdWFsIGNvbXBpbGVyCiAgICAgICAgICAgICAgcmVzb2x1dGlvbiBtZWNoYW5pc20sIGFuZCBpdCBpcyByZWFsbHkgbmVlZGVkIHNvbWV0aW1lcwogICAgICAgICAgICAgIHdoZW4geW91IG1peCB0ZW1wbGF0ZXMgKyB0eXBlZGVmcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgICBEb24ndCB1c2UgaXQgaWYgeW91IGRvbid0IGhhdmUgYW55IHByb2JsZW0gYWxyZWFkeSwKCSAgICAgIHNpbmNlIHRoZSB0eXBlIHJlZHVjdGlvbiBjYW4gaW50ZXJmZXJlIHdpdGggc29tZQoJICAgICAgdXNlciB0eXBlbWFwcywgc3BlY2lhbGx5IGlmIHlvdSBkZWZpbmVkIHNvbWV0aGluZyBsaWtlCgoJCSAgIHR5cGVkZWYgaW50IEludDsKCQkgICAldHlwZW1hcChpbikgSW50IC4uLjsKCiAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLCB3aGVuIHlvdSB1c2UgdGhlICJ0ZW1wbGF0ZXJlZHVjZSIgb3B0aW9uLAoJICAgICAgc3dpZyB3aWxsIGlnbm9yZSB0aGUgdXNlciB0eXBlbWFwLCBzaW5jZSB0aGUgInR5cGVkZWYgaW50IEludCIKCSAgICAgIHdpbGwgdGFrZSBwcmVjZWRlbmNlLCBhbmQgdGhlIHVzdWFsICJpbnQiIHR5cGVtYXAgd2lsbCBiZQoJICAgICAgYXBwbGllZC4gCgoJICAgICAgTm90ZSB0aGF0IHRoZSBwcmV2aW91cyBjYXNlIGlzIG5vdCBjb21tb24sIGFuZCBzaG91bGQgYmUKCSAgICAgIGF2b2lkZWQsIGllLCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIGEgdHlwZWRlZiBhbmQgYQoJICAgICAgdHlwZW1hcCBhdCB0aGUgc2FtZSB0aW1lLCBzcGVjaWFsbHkgaWYgeW91IGFyZSBnb2luZyB0bwoJICAgICAgdXNlIHRlbXBsYXRlcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgLSBEaXJlY3RvcnM6CgoJICAgICAgICB2aXJ0dWFsIGRlc3RydWN0b3IgaXMgYWx3YXlzIGVtaXR0ZWQgbm93LCB0aGlzIGRvZXNuJ3QKCSAgICAgICAgY2F1c2UgYW55IGhhcm0sIGFuZCBjb3VsZCBzb2x2ZSBzb21lIG5hc3R5IGFuZAoJICAgICAgICBteXN0ZXJpb3VzIGVycm9ycywgbGlrZSB0aGUgb25lIG1lbnRpb25lZCBieSBTY290dC4KCgkJYWxzbyB0aGUgZGVzdHJ1Y3RvciBpcyBub3QgaW4tbGluZWQsIHNvLCB0aGF0IGNhbiBzb2x2ZQoJCXNvbWUgb3RoZXIgbXlzdGVyaW91cyBlcnJvcnMgd2hlbiBtaXhpbmcgZGlyZWN0b3JzICsKCQlpbXBvcnRzICsgZW1iZWRkZWQgYXBwbGljYXRpb25zICsgc29tZSBzcGVjaWZpYyBjb21waWxlcnMuCgkJCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUgd2l0aCBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBhZGRlZC4KCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcCBmaXhlcyBpbiBzdGRfc3RyaW5nLmkgZnJvbSBSdXNzZWxsIEtlaXRoLU1hZ2VlLgoKMTAvMjUvMjAwNDogbW1hdHVzIAoKCSAgICAtIFVzaW5nICsgbmFtZXNwYWNlIGlzIHdvcmtpbmcgbm93ICh1c2luZ19uYW1lc3BhY2UuaSkuCgoJICAgIC0gRGVyaXZlZCArIG5lc3RlZCBjbGFzc2VzIGlzIHdvcmtpbmcgbm93CgkgICAgICAoZGVyaXZlcl9uZXN0ZWQuaSksIGJ1dCBvZiBjb3Vyc2UsIHdlIGFyZSBzdGlsbCB3YWl0aW5nCgkgICAgICBmb3IgdGhlIG5lc3RlZCBjbGFzcyBzdXBwb3J0LgoJICAgIAoJICAgIC0gRGlyZWN0b3JzOgoJICAgICAgLSB1bm5hbWVkIHBhcmFtZXRlcnMgc3VwcG9ydCwKCgkgICAgICAtIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBzdXBwb3J0IChhdXRvbWF0aWMgYW5kIHdpdGgKICAgICAgICAgICAgICAgIGRpcnByb3QgbW9kZSksCgoJICAgICAgLSBkZXRlY3Rpb24gb2YgcmVhbGx5IG5lZWRlZCBwcm90ZWN0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAobWVtYmVycyBhbmQgY29uc3RydWN0b3JzKSBub3cgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LgogICAgICAgICAgICAgICAgRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZSAnZGlycHJvdCcgbW9kZSwgc3dpZyB3aWxsCiAgICAgICAgICAgICAgICB3cmFwIHdoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCAoYW5kIHByb3RlY3RlZCkgZm9yIHRoZQogICAgICAgICAgICAgICAgY29kZSB0byBjb21waWxlLgoJCQoJCXdoYXQgaXMgcHVibGljLCBhcyB1c3VhbCwgaXMgYWx3YXlzIHdyYXBwZWQsIGFuZCBpZgoJCXlvdSB1c2UgdGhlICdkaXJwb3J0JwoJCQoKCSAgICAtIEZpbmFsIGZpeGVzIGZvciB0aGUgT1NTIHRvIGNvbXBpbGUgd2l0aCBTV0lHIDEuMy4yMyAobXkKCSAgICAgIHZlcnkgdmVyeSB1Z2x5IEMrKyArIHRlbXBsYXRlcyArIGV2ZXJ5dGhpbmcgbW91bnRlcnMgd3JhcCkuCgoxMC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLWRsbGltcG9ydC4gVGhpcyBlbmFibGVzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBETEwgZm9yIHRoZSBEbGxJbXBvcnQgYXR0cmlidXRlLiBOb3JtYWxseSB0aGlzIG5hbWUKICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgbW9kdWxlIG5hbWUsIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzOgoKICAgICAgICAgICAgICBzd2lnIC1jc2hhcnAgLWRsbGltcG9ydCB4eXogZXhhbXBsZS5pCgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGZvciBhbGwgdGhlIHdyYXBwZWQgUEludm9rZSBtZXRob2RzOgoKICAgICAgICAgICAgICBbRGxsSW1wb3J0KCJ4eXoiLCBFbnRyeVBvaW50PSIuLi4iKV0KICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiAuLi4KCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmcm9tIG1hbnkgZGlmZmVyZW50IFNXSUcgaW52b2NhdGlvbnMgY2FuIHRodXMgYmUgY29tcGlsZWQKICAgICAgICAgICAgaW50byBvbmUgRExMLgoKICAgICAgICAgICAgQSBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkZGxsaW1wb3J0IGNhbiBhbHNvIGJlIHVzZWQgaW4gdHlwZW1hcHMsIHByYWdtYXMsCiAgICAgICAgICAgIGZlYXR1cmVzIGV0Yy4gVGhpcyB3aWxsIGdldCB0cmFuc2xhdGVkIGludG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSAtZGxsaW1wb3J0CiAgICAgICAgICAgIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHRoZSBtb2R1bGUgbmFtZS4KCjEwLzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTA0OTQ5NiBmcm9tIFNjb3R0IE1pY2hlbCBmaXhlcyBkaXJlY3RvcnMgbWV0aG9kcyB3aXRoIAogICAgICAgICAgICBlbnVtcyB3aGVuIHdyYXBwZWQgd2l0aCB0eXBlc2FmZSBvciBwcm9wZXIgSmF2YSBlbnVtcy4KCjEwLzIxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyBpbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgKFB5dGhvbiwgUnVieSwgT2NhbWwpLgoKMTAvMjEvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctY3BsdXNjYXN0JyBvcHRpb24gdG8gZW5hYmxlIHRoZSAnbmV3JwoJICAgICAgQysrIGNhc3Rpbmcgb3BlcmF0b3JzLCBzdWNoIGFzICdzdGF0aWNfY2FzdCcsIGluc2lkZSB0aGUKCSAgICAgIHR5cGVtYXBzLiBCeSBkZWZhdWx0IHN3aWcgdXNlIHRoZSBvbGQgQyBjYXN0IHN0eWxlLCBldmVuCgkgICAgICB3aGVuIHBhcnNpbmcgQysrLgoJICAgICAgCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbmV3X3Z3bScgb3B0aW9uIHRvIGVuYWJsZSB0aGUgbmV3CiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciBtb2RlLiBOb3cgdGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICB0aGF0IHRoZSB0eXBlbWFwcyBhcmUgcmVhbGx5IHNhZmUgZm9yIGFueSBmdXR1cmUKICAgICAgICAgICAgICBzb2x1dGlvbiwgYnV0IHlvdSBjYW4gdXNlIGl0IGlmIHlvdSBoYXZlIGEgdmVyeSBzdHJhbmdlCiAgICAgICAgICAgICAgZXJyb3Igd2l0aCBkZWZhdWx0IGNvc250cnVjdG9ycyBtaXNzaW5nICsgJWFwcGx5ICsKICAgICAgICAgICAgICAldHlwZW1hcCwgYW5kIGlmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlscyAoc2VlCiAgICAgICAgICAgICAgdmFsdXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFsdGVybmF0aXZlIGFuZCBjdXJyZW50CiAgICAgICAgICAgICAgc29sdXRpb25zKS4gSWYgeW91IGFyZSBhIHVzZXIgdGhhdCBkb24ndCBrbm93IHdoYXQgaXMKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBkb24ndCBldmVuIHRyeSBpdC4KCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbm9oJyBvcHRpb24gdG8gYmUgdXNlZCB3aXRoIGRpcmVjdG9ycwoJICAgICAgYW5kIHdoZW4geW91IHByZWZlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQoJICAgICAgZGlyZWN0b3IgaGVhZGVyIGZpbGUuIElmIG5vdCB1c2VkLCBzd2lnIHdpbGwgd29yayBhcwoJICAgICAgdXN1YWwgZ2VuZXJhdGluZyBib3RoIHRoZSB3cmFwLmN4eCBhbmQgd3JhcC5oIGZpbGVzLiBJZgoJICAgICAgeW91IHVzZSBpdCwgc3dpZyB3aWxsIG9ubHkgZ2VuZXJhdGUgd3JhcC5jeHguCgoxMC8yMS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBJZiB5b3UgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRSB3aGVuIGNvbXBpbGluZyBhIHdyYXBwZXIgZmlsZSwKCSAgICAgIHRoZSBydW50aW1lIHR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBnaXZlbiB0eXBlIHRhYmxlIG5hbWUuCgkgICAgICBVc2luZyB0aGlzLCB5b3UgY2FuIHNlcGVyYXRlIGRpZmZlcmVudCBtb2R1bGVzIHRvIHNoYXJlIHRoZWlyCgkgICAgICBvd24gdHlwZSBzeXN0ZW1zLiAgLURTV0lHX1RZUEVfVEFCTEU9TXl0YWJsZQoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19TVEFUSUNfUlVOVElNRSB0aGVuIHRoZSB0eXBlIGluZm9ybWF0aW9uCgkgICAgICB3aWxsIGJlIHN0YXRpYyB0byB0aGlzIHdyYXBwZXIuICBOb3RoaW5nIHdpbGwgYmUgc2hhcmVkIHdpdGggYW55CgkgICAgICBvdGhlciBtb2R1bGVzCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX0xJTktfUlVOVElNRSwgdGhlbiBpbnN0ZWFkIG9mIHVzaW5nCgkgICAgICB0aGUgbmV3IHdheSBvZiBzaGFyaW5nIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB3cmFwcGVyIHdpbGwgZXhwZWN0CgkgICAgICB0byBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgTGliL2xpbmtydW50aW1lLmMgZmlsZS4gIEFueSBtb2R1bGVzIGNvbXBpbGVkCgkgICAgICB3aXRoIFNXSUdfTElOS19SVU5USU1FIGFuZCBsaW5rZWQgYWdhaW5zdCBsaW5rcnVudGltZS5jIHdpbGwgYWxsCgkgICAgICBzaGFyZSB0eXBlIGluZm9ybWF0aW9uLgoKMTAvMjAvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBJbml0aWFsIGZpeCBmb3IgcHl0aG9uL2ltcG9ydCBleGFtcGxlLiBQbGVhc2UKCSAgICAgIHVwZGF0ZSB0aGUgTWFrZWZpbGUgKGF1dG9jb25mLCBjb25maWd1cmUsIGV0YywgZXhwZXJ0KSwKCSAgICAgIHNpbmNlIG5vdyBwcm9iYWJseSBpcyBvbmx5IHdvcmtpbmcgd2l0aCBnKyssIGljYyBhbmQgYQoJICAgICAgZmV3IG90aGVyIGNvbXBpbGVycyB0aGF0IGhhdmUgdGhlIC1zaGFyZWQgb3B0aW9uLgoKCSAgICAgIFdlIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlCgkgICAgICB2aXJ0dWFsIGRlc3RydWN0b3JzLiBPbGQgYW5kIHVzdWFsbHkgZm9yZ290dGVuIEMrKwoJICAgICAgcmVxdWlyZW1lbnQuCgkgICAgICAKCSAgICAgIFNhbWUgZml4IG5lZWQgdG8gYmUgdXNlZCBpbiBwZXJsLCBJIHRoaW5rLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBGaXggZ2VuZXJhdGlvbiBvZiBoZWFkZXIgZmlsZSBmb3IgZGlyZWN0b3JzLAogICAgICAgICAgICAgIG5vdyBkaXJlY3RvcnMuc3dnIGlzIGFsc28gaW5jbHVkZWQsIHNvLCBpdCBjYW4gYmUgcmVhbGx5CgkgICAgICB1c2VkIGZyb20gQysrLCBhbmQgaXQgc29sdmVzIHNvbWUgcHJvYmxlbSB3aXRoIGNvbXBpbGVyCgkgICAgICB0aGF0IHJlcXVpcmUgdGhhdCwgZXZlbiB3aXRoIHRoZSBzaW1wbGUgc3dpZyBpbmNsdXNpb24uICAKCiAgICAgICAgICAgIC0gW1B5dGhvbl0gUmVvcmRlcmluZyB0aGUgbWV0aG9kcyBhbmQgbW92aW5nIHNvbWUgYm9kaWVzCiAgICAgICAgICAgICAgb3V0c2lkZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgaXMgbmVlZGVkIGR1ZSB0bwogICAgICAgICAgICAgIHNvbWUgZ2NjLTIuOTYgaW50ZXJuYWwgY29tcGlsZXIgZXJyb3JzLiBJdCBzZWVtcyB0aGUKICAgICAgICAgICAgICBQWVRIT04gY2xhc3MgaXMgZ2V0dGluZyB0b28gbGFyZ2UgdG8gYmVlbiBkZWNsYXJlZCBhbmQKICAgICAgICAgICAgICBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIC0gQWRkIHRoZSAtb2ggb3B0aW9uIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGhlYWRlciBmaWxlIG5hbWUKICAgICAgICAgICAgICBpZiBuZWVkZWQ6CgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDIC1vaCB0ZXN0LkhICgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG1haW5seSBuZWVkZWQgd2hlbiB1c2luZyBkaXJlY3RvcnMsIGFuZCBpZiB0aGUKICAgICAgICAgICAgICBjdXJyZW50IGRlZmF1bHQgaGVhZGVyIGZpbGUgbmFtZSBpcyBub3QgZ29vZCBmb3IgeW91LAogICAgICAgICAgICAgIHdoaWNoIGlzIGdlbmVyYXRlZCBhcyBmb2xsb3c6CSAgICAgIAoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgICAgICAgICAgICAgPT4gdGVzdF93cmFwLmgKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAgPT4gdGVzdC5oCgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgMSkgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBmZWF0dXJlIGFkZGVkLiBUaGlzIGZlYXR1cmUgYWxsb3dzIG9uZQogICAgICAgICAgICAgIHRvIHVzZSB0aGUgZGVmYXVsdCBhcmd1bWVudCBjb2RlIGdlbmVyYXRpb24gdGhhdCB3YXMgdXNlZCBpbgogICAgICAgICAgICAgIFNXSUctMS4zLjIyIGFuZCBlYXJsaWVyIHZlcnNpb25zLiBJdCBwcm9kdWNlcyBtb3JlIGNvbXBhY3Qgd3JhcHBlcnMKICAgICAgICAgICAgICBhcyBvbmx5IG9uZSB3cmFwcGVyIG1ldGhvZCBpcyBnZW5lcmF0ZWQgZm9yIGFueSBtZXRob2Qgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgICAgYXJndW1lbnRzLiBTbyB0aGUgYWR2YW50YWdlIGlzIGl0IGdlbmVyYXRlcyBsZXNzIGNvZGUgYnV0IGhhcyB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBsaW1pdGF0aW9ucywgbGlrZSBpdCBpdCBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGNhbm5vdCBiZSB0YWtlbiBhZHZhbnRhZ2Ugb2YgaW4gdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgICAgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkuIEl0IGlzIGltcGxlbWVudGVkIHZpYSB0aGUgdXN1YWwgJWZlYXR1cmUgbWVjaGFuaXNtOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKTsKCiAgICAgICAgICAgIDIpIEtleXdvcmQgYXJndW1lbnRzIChrd2FyZ3MpIGFyZSB3b3JraW5nIGFnYWluIGZvciBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBpbiB0aGUgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBpdCwgaWUsIFB5dGhvbiBhbmQgUnVieS4gVGhlIG5ldyBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50IHdyYXBwaW5nIGFwcHJvYWNoIHVzaW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBjYW5ub3Qgc3VwcG9ydCBrd2FyZ3MKICAgICAgICAgICAgICAgc28gdGhlIGNvbXBhY3QgZGVmYXVsdCBhcmd1bWVudCBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4KICAgICAgICAgICAgICAga3dhcmdzIGFyZSBzcGVjaWZpZWQsIGJ5ICVmZWF0dXJlKCJrd2FyZ3MiKS4KCiAgICAgICAgICAgIDMpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgYXJlIGFsc28gYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiB3cmFwcGluZwogICAgICAgICAgICAgICBDIChub3QgQysrKSBjb2RlLiBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlIGJpemFycmUgbm90aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGZvciBDIGNvZGUuCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMgaW4gbmFtZXNwYWNlcyBhbHNvIHdvcmtpbmcgbm93LgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaW4gbmFtZXNwYWNlcyB0b28uCgoxMC8xOS8yMDA0OiBtbWF0dXMKCgkgICAgLSBBbGxvdyB0byBkaXNhYmxlIHRoZSBuZXcgU3dpZ1ZhbHVlV3JhcHBlciBtZWNoYW5pc20sCgkgICAgICBpZiB5b3UgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGxhbmd1YWdlIG1haW4uCgoJCSAvKiBUdXJuIG9uIHNhZmUgdmFsdWUgd3JhcHBlciB1c2UgbW9kZSAqLwogICAgICAgICAgICAgICAgIFN3aWdfdmFsdWVfd3JhcHBlcl9tb2RlKDEpOwoKCSAgICAgIAoJICAgICAgTm93IGlzIG9ubHkgYWN0aXZlIGluIHB5dGhvbi4gQWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICAgIGFyZSB1c2luZyB0aGUgb2xkIHJlc29sdXRpb24sIGJ1dCB0aGV5ICBjYW4gYWxzbyB1c2UgdGhlCgkgICAgICAidmFsdWV3cmFwcGVyIi8ibm92YWx1ZXdyYXBwZXIiIGZlYXR1cmVzIHRvIGZpeCBzb21lCgkgICAgICBvZiB0aGUgb2xkIGJyb2tlbiBjYXNlcy4gTm90ZSwgaG93ZXZlciwgIHRoYXQgbm90IGFsbCAKCSAgICAgIHRoZSBicm9rZW4gY2FzZXMgY2FuIGJlIHNvbHZlZCBpbiB0aGF0IHdheS4KCgkgICAgICBUaGUgbmV3IG1lY2hhbmlzbSBzZWVtcyB0byBiZSB3b3JraW5nIGZpbmUgaW4gcGVybCwgcnVieQoJICAgICAgYW5kIHRjbCwgYnV0IGZhaWxpbmcgaW4gc29tZSB0eXBlbWFwcyBpbiBqYXZhLgoKCSAgICAgIEhlbmNlLCBpcyB1cHRvIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRvIHRlc3QgaXQsIGFuZAoJICAgICAgZGVjaWRlIHRvIGVuYWJsZSBpdCBvciBub3QuCgoJICAgICAgTG9vayBhdCB0aGUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBleGFtcGxlcy4KCgkgICAgLSBGaXggbW9yZSBTd2lnVmFsdWVXcmFwcGVyIGNhc2VzIHdoZW4gdGhlIG5ldyBtZWNoYW5pc20KCSAgICAgIGlzIGFjdGl2ZS4gTm93IGl0IGFsc28gY2hlY2sgZm9yIGxvY2FsIHR5cGVtYXAKCSAgICAgIHZhcmlhYmxlcywgc2VlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgYW4gZXhhbXBsZSB3aGVuCgkgICAgICB0aGlzIGlzIG5lZWRlZC4gQnV0IGFnYWluLCB0aGlzIGV4dHJhIGNoZWNraW5nIHdpbGwgb25seQoJICAgICAgYmUgYWN0aXZhdGVkIHdoZW4gdXNpbmcgdGhlIG5ldyB2YWx1ZSB3cmFwcGVyIG1vZGUuCgoJICAgIC0gW1B5dGhvbl0gRml4IHZhcmlhYmxlIHdyYXBwaW5nIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlCgkgICAgICBhc3NpZ24gb3BlcmF0b3JzLiBJdCBzaG91bGQgYmUgZWFzeSB0byBmaXggaW4gYWxsIHRoZSAKCSAgICAgIG90aGVyIG1vZHVsZXMsIGluc3RlYWQgb2YgY2hlY2tpbmcKCgkgICAgICAgICBpZiAoIUdldGF0dHIobiwiaW1tdXRhYmxlIikpIC4uLgoJCgkgICAgICB5b3UgbmVlZCB0byB2ZXJpZnkKCgkgICAgICAgICBpZiAoaXNfYXNzaWduYWJsZShuKSkgLi4uCgoJICAgICAgTG9vayBhdCB0aGUgcHJpdmF0ZV9hc3NpZ24uaSBmb3IgYW4gZXhhbXBsZS4KCjEwLzE4LzIwMDQ6IG1tYXR1cwoJICAgIC0gJWZlYXR1cmVzICJkaXJlY3RvciIvIm5vZGlyZWN0b3IiIG5vdyB3b3JrIGFzIGV4cGVjdGVkLgogICAgICAgICAgICAtIEdlbmVyYWwgZml4ZXMgaW4gJWZlYXR1cmUgdG8gcmVzb2x2ZSBmdW5jdGlvbiBkZWNsCgkgICAgICBwcm9wZXJseSwKCSAgICAgIAoJICAgICAgICAlZmVhdHVyZSgiaGVsbG8iKSBmb28oKTsKCSAgICAgICAgY2hhciBmb28oKSAtPiAgZigpICAgIC8vIHdhcyB3b3JraW5nCgkgICAgICAgIGNoYXIgKmZvbygpIC0+IGYoKS5wICAvLyBpdCB3YXNuJ3QKIAoKICAgICAgICAgICAgLSBUZW1wbGF0ZSArIHNwZWNpYWxpemF0aW9uICsgZGVmYXVsdCB0ZW1wbGF0ZSBhcmdzIG5vdyBpcwoJICAgICAgd29ya2luZywgKGRvbid0IGNvbmZ1c2Ugd2l0aCB0ZW1wbGF0ZSArIGRlZmF1bHQgYXJnCgkgICAgICB2YWx1ZXMsIHRoYXQgd2FzIHNvbHZlZCBiZWZvcmUpLCBub3cgdGhpcyB1Z2x5IGNhc2UgaXMKCSAgICAgIHdvcmtpbmc6CgoJICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQSA9IEFsbG9jPFQ+ID4KCQlzdHJ1Y3QgVmVjdG9yCgkJewoJCSAgIFZlY3RvcihUIGEpe30KCQl9OwkJICAgCgoJCXRlbXBsYXRlIDw+CgkJc3RydWN0IFZlY3Rvcjxkb3VibGU+CgkJewoJCSAgVmVjdG9yKCl7fQoJCSAgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAldGVtcGxhdGUoVl9jKSBWZWN0b3I8Y2hhciwgQWxsb2M8Y2hhcj4gPjsKCSAgICAgICAgJXRlbXBsYXRlKFZfaSkgVmVjdG9yPGludD47ICAgIC8vIHBpY2tzIFZlY3RvcjxpbnQsQWxsb2M8aW50PiA+CgkgICAgICAgICV0ZW1wbGF0ZShWX2QpIFZlY3Rvcjxkb3VibGU+OyAvLyBwaWNrcyB0aGUgc3BlY2lhbGl6YXRpb24KCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgU1RMIHN1cHBvcnQgKGxhdGVyIHdpbGwKICAgICAgICAgICAgICBiZSkuCgoJICAgIC0gRml4IHRoZSB0ZW1wbGF0ZSArIHR5cGVkZWYgZXJyb3JzIGluIHRlc3Qtc3VpdGUsIHdoaWNoCiAgICAgICAgICAgICAgcHJvYmFibHkgd2lsbCBmaXggYW5vdGhlciBncm91cCBvZiBzdHJhbmdlIHRlbXBsYXRlICsKICAgICAgICAgICAgICBuYW1lc3BhY2VzICsgdHlwZWRlZnMgZXJyb3JzLgoKCSAgICAtICV3YXJuZmlsdGVyIGlzIHdvcmtpbmcgYmV0dGVyIG5vdywgcGFyc2VyLnkgdHJpZXMgdG8gdXNlCgkgICAgICB0aGVtIHdoZW4gbmVlZGVkLgoKCSAgICAtICoqKiogTmV3IGRlZmF1bHQgdHlwZSByZXNvbHV0aW9uIG1ldGhvZCAoc3R5cGUuYykgKioqKiogCgoJICAgICAgSXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBtaXhlZCB0eXBlcywgdGhlbiBpdCBnb2VzCgkgICAgICAnYmFja3dhcmQnIGZpcnN0IGRlbGV0aW5nIHRoZSBxdWFsaWZpZXIsIHRoZW4gdGhlIGlubmVyCgkgICAgICB0eXBlcywgZm9yIGV4YW1wbGU6CiAgICAJCSAJCQkJCQkJICAKICAgIAkJIHR5cGVkZWYgQSAqQXB0cjsJCQkJICAKICAgIAkJIGNvbnN0IEFwdHImOwkJCQkJCQogICAgCQkgci5xKGNvbnN0KS5BcHRyICAgICAgIC0+IHIucShjb25zdCkucC5TV0lHVFlQRQkJCiAgICAJCSByLnEoY29uc3QpLnAuU1dJR1RZUEUgLT4gci5wLlNXSUdUWVBFCQkJCiAgICAJCSByLnAuU1dJR1RZUEUgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGVudW0gSGVsbG8ge307CQkJCQkJCiAgICAJCSBjb25zdCBIZWxsbyYgaGk7CQkJCQkKICAgIAkJIHIucShjb25zdCkuSGVsbG8gICAgICAgICAgLT4gci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFCQogICAgCQkgci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFICAtPiByLmVudW0gU1dJR1RZUEUJCQogICAgCQkgci5lbnVtIFNXSUdUWVBFICAgICAgICAgICAtPiByLlNXSUdUWVBFCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgaW50IGFbMl1bNF07CQkJCQkJCiAgICAJCSBhKDIpLmEoNCkuaW50ICAgICAgICAgICAtPiBhKEFOWSkuYShBTlkpLlNXSUdUWVBFCQogICAgCQkgYShBTlkpLmEoQU5ZKS5TV0lHVFlQRSAgLT4gYShBTlkpLmEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuYSgpLlNXSUdUWVBFICAgICAtPiBhKEFOWSkucC5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkucC5TV0lHVFlQRSAgICAgICAtPiBhKEFOWSkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLlNXSUdUWVBFICAgICAgICAgLT4gYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoKS5TV0lHVFlQRSAgICAgICAgICAgIC0+IHAuU1dJR1RZUEUJCQkKICAgIAkJIHAuU1dJR1RZUEUgICAgICAgICAgICAgIC0+IFNXSUdUWVBFICAgICAgICAgICAgICAgICAgICAKCgkgICAgICBiZWZvcmUgaXQgYWx3YXlzIHN0b3BzIGFmdGVyIGZpbmRpbmcgcmVmL3BvaW50ZXIvZW51bS9hcnJheS9ldGMuCgkgICAgICAgCgkgICAgICBOb3csIHRoZW4sIHlvdSBjYW4gZGVmaW5lICh1c2UgYW5kIGFwcGx5KSAnaGlnaGVyJyB0eXBlbWFwcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAob3V0KSBjaGFyIEZJWFNJWkVbQU5ZXQogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgZW51bSBTV0lHVFlQRSYKCSAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFW0FOWV1bQU5ZXQoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAoJilbQU5ZXQoJICAgICAgIAoJICAgICAgSXQgaXMgcG9zc2libGUgd2l0aCB0aGlzIGNoYW5nZSB0aGF0IHByZXZpb3VzIHR5cGVtYXBzCgkgICAgICB0aGF0IHdlcmUgZGVmaW5lZCAoYnV0IGlnbm9yZWQpLCBub3cgd2lsbCBzdGFydCB0byB3b3JrLgoKCSAgICAgIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSBjaGVjayBmb3IgdGhlICcldHlwZW1hcCh2YXJpbikgU1dJR1RZUEVbXScsCgkgICAgICBiZWZvcmUgaXQgd2FzIHVzdWFsbHkgbm90IGRlZmluZWQgKGJ1dCBjaGFyW10gd2FzKSwKCSAgICAgIGFuZCB0aGF0IGNhbiBwcm9kdWNlIHNvbWUgaW5jb25zaXN0ZW5jaWVzLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICAgIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgZm9yIFNUTCwgc2luY2Ugc3RkOjp2ZWN0b3I8ZW51bSBIZWxsbz4gCgkgICAgICBzdGQ6OnZlY3RvcjxBKj4sIGV0Yywgd2lsbCBhbHdheXMgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0CgkgICAgICBtaXggY29uc3QgcmVmZXJlbmNlcyB3aXRoIHRoZSB2ZWN0b3IgdHlwZS4KCgkgICAgICBOb3cgdGhhdCBpcyB3b3JraW5nLCBhbGwgdGhlIHN0ZDo6Y29udGFpbmVyPFQqPgoJICAgICAgc3BlY2lhbGl6YXRpb24gd2lsbCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIHdlbGwsIGluCgkgICAgICB0aGVvcnkuIAoKCSAgICAgIEluIHRoZSBwcmFjdGljZSwgZXZlcnl0aGluIGlzIHdvcmtpbmcgYXMgYmVmb3JlIHVudGlsCgkgICAgICB0aGUgcHJvcGVyIG1peGVkIHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB0aGUgbGlicmFyaWVzCgkgICAgICBzaW1wbGlmaWVkIHRvIHVzZSB0aGVtLgoKCSAgICAtIENoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXh0ZXJuICJqYXZhIi8iZm9ydHJhbiIvImV0YyIsIAoJICAgICAgbm93IHN3aWcgcHJvZHVjZXMgYSB3YXJuaW5nLCBhbmQgdXNlIGV4dGVybiAiQyIgaW5zdGVhZC4KCSAgICAgIFRoZSB3YXJuaW5nIGNhbiBhbHNvIGJlIGRpc2FibGUgd2l0aCB0aGUgIi13IDMxMyIgZmxhZy4KCSAgICAgIChXQVJOX1BBUlNFX1VOREVGSU5FRF9FWFRFUk4pLgoKCSAgICAtIFN3aWdWYWx1ZVdyYXBwZXIgaXMgbm93IG1vcmUgc2VsZWN0aXZlIChsYW5nLmN4eCkuCgogICAgICAgICAgICBbUGVybC9UY2xdCgkgICAgLSBGaXggc29tZSB0eXBlbWFwcyAocGVybC90Y2wpIHRvIHdvcmsgcHJvcGVybHkgd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlci4gVGhpcyB3YXMgbm90IGEgcHJvYmxlbSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBidXQgd2l0aCB0aGUgdHlwZW1hcHMgdGhhdCBub3cgYXJlCgkgICAgICBzYWZlIHRvIHVzZSB3aXRoICVhcHBseS4KCgkgICAgW1B5dGhvbl0KCiAgICAgICAgICAgIC0gRml4ICVjYWxsYmFjay8lcHl0aG9uY2FsbGJhY2sgd29yayBub3cgYXMgYmVmb3JlIGFmdGVyCgkgICAgICB0aGUgZGVmIGFyZ3MgY2hhbmdlcy4gQWxzbywgJWNhbGxiYWNrIG5vdyBpcyBhbiBhbGlhcwoJICAgICAgZm9yICVweXRob25jYWxsYmFjaywgc28sIHRoZXkgZG8gdGhlIHNhbWUuCgoJICAgIFtQeXRob24vUnVieV0KCSAgICAtICVjYWxsYmFjayBpcyBtb3JlIHVzYWJsZSBhbmQgdW5pZm9ybToKCiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpIGZvbygpOyAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpOyAgICAgICAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKDEpIGZvbygpOyAgICAgICAgLy8gb25seSBpbiBweXRob24uCgoxMC8xNy8yMDA0OiBhcnR5CgkgICAgW09DQU1MXQoJICAgIC0gVHdlYWsgdG8gZW51bSB0eXBpbmcgZm9yIHNvdW5kbmVzcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUKCSAgICAgIG1vZHVsZXMuCgkgICAgLSBnbG9iYWwgZnVuY3Rpb25zIGFyZSBub3cgdW5hbWJpZ3VvdXMgaW4gbXVsdGlwbGUgbG9hZGVkIG1vZHVsZXMuCgkgICAgLSBGaXhlZCB0ZXN0IGNhc2UgY29kZSB0byBidWlsZCBtdWx0aW1vZHVsZSB0ZXN0IGNhc2VzIGNvcnJlY3RseS4KCSAgICAtIFRoZXJlIGlzIG5vIHdheSB0byBzaGFyZSBvdmVybG9hZCByZXNvbHV0aW9uIGFjcm9zcyBtb2R1bGVzCgkgICAgICBiZWNhdXNlIG9mIHNvdW5kbmVzcyBpc3N1ZXMuICBJZiB0aGUgdXNlciB3YW50cyB0byBjYWxsIHNvbWUKCSAgICAgIGZ1bmN0aW9uIGZvbyBmcm9tIGFuIGFyYml0cmFyeSBtb2R1bGUgYmFyLCB0aGV5IHdpbGwgaGF2ZSB0bwoJICAgICAgdXNlIEJhci5fZm9vIHRvIGNhbGwgaXQgY29ycmVjdGx5LiAgTGF0ZXIgSSB3aWxsIGZpeCB0aGUgCgkgICAgICBjYW1scDQgbW9kdWxlIHRvIGRvIHNvbWV0aGluZyBjbGV2ZXIgaW4gdGhpcyBjYXNlLiAgCiAgICAgICAgICAgIC0gUHJvbWlkZWQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb2YgY2xhc3MgbWVjaGFuaXNtLgoJICAgIC0gUmVtb3ZlZCBzeW1ib2wgaGFjayBmb3Igb2NhbWwtMy4wNyBhbmQgYmVsb3cgd2hpY2ggaXMgbm90IG5lZWRlZAoJICAgICAgZm9yIG9jYW1sLTMuMDggYW5kIGFib3ZlLgoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDSElDS0VOXQoJICAgIC0gQ29tcGxldGx5IGNoYW5nZSBob3cgY2hpY2tlbi5jeHggaGFuZGxlcyBDTE9TIGFuZCBnZW5lcmljIGNvZGUuCgkgICAgICBjaGlja2VuIG5vIGxvbmdlciBleHBvcnRzIC1jbG9zLnNjbSBhbmQgLWdlbmVyaWMuc2NtLiAgVGhlIGNsb3MKCSAgICAgIGNvZGUgaXMgZXhwb3J0ZWQgZGlyZWN0bHkgaW50byB0aGUgbW9kdWxlLnNjbSBmaWxlIGlmIC1wcm94eSBpcyBwYXNzZWQuCgkgICAgLSBUaGUgY29kZSBub3cgYWx3YXlzIGV4cG9ydHMgYSB1bml0LiAgUnVubmluZyB0aGUgdGVzdC1zdWl0ZSBpcyBub3cKCSAgICAgIG1ham9ybHkgYnJva2VuLCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQuCgkgICAgLSBDTE9TIG5vdyBnZW5lcmF0ZXMgdmlydHVhbCBzbG90cyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzaW1pbGFyIHRvIGhvdwoJICAgICAgR09PUFMgc3VwcG9ydCB3b3JrcyBpbiB0aGUgZ3VpbGUgbW9kdWxlLgoJICAgIC0gY2hpY2tlbiBubyBsb25nZXIgcHJlZml4ZXMgc3ltYm9scyBieSB0aGUgbW9kdWxlIG5hbWUsIGFuZCBubyBsb25nZXIKCSAgICAgIGZvcmNlcyBhbGwgbmFtZXMgdG8gbG93ZXIgY2FzZS4gIEl0IG5vdyBoYXMgLXVzZWNsYXNzcHJlZml4IGFuZCAtY2xvc3ByZWZpeAoJICAgICAgc2ltaWxhciB0byBob3cgZ3VpbGUgaGFuZGxlcyBHT09QUyBuYW1lcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB3b3JraW5nIHdpdGggbmV3IGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgd3JhcHBpbmcgYXBwcm9hY2guIFRoZSBuZXcgYXBwcm9hY2ggbm8gbG9uZ2VyIGZhaWxzIHdpdGggdGhlIGZvbGxvd2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50IHBhdHRlcm4gKHByZXZpb3VzbHkgZmFpbGVkIHdpdGggc29tZSBwcmltaXRpdmUgdHlwZXMsIGxpa2UgCiAgICAgICAgICAgIHVuc2lnbmVkIHByaW1pdGl2ZSB0eXBlcyk6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBmb28oY29uc3QgVCYgdSA9IFQoKSk7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPHVuc2lnbmVkIGludD47CgogICAgICAgICAgICBUaGlzIHJlbGllcyBvbiB0aGUgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHN1cHBvcnQganVzdCBhZGRlZCwgc28gYWxsCiAgICAgICAgICAgIHRoZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgbm9ybWFsIHBhcmFtZXRlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBvdmVybG9hZGluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyB3b3Jrcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXJnZSByYW5nZSBvZiB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgdGhhdCBDKysKICAgICAgICAgICAgc3VwcG9ydHMuCgogICAgICAgICAgICAtIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucywgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCwgY29uc3QgVCAmcik7CgogICAgICAgICAgICAtIEZpeGVzIHdoZXJlIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpcyBub3QgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgeHl6KCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIHh5ejxkb3VibGU+KCk7CgogICAgICAgICAgICAtIEZpeGVzIGZvciBvdmVybG9hZGluZyBvZiBwbGFpbiBmdW5jdGlvbnMgYnkgYSB0ZW1wbGF0ZWQgZnVuY3Rpb246CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwoKICAgICAgICAgICAgLSBPdmVybG9hZGluZyBieSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyBmaXhlZDoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmb28oVCB0KSB7fQogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHZvaWQgZm9vKFQgdCwgVSB1KSB7fQoKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288ZG91YmxlLCBkb3VibGU+OwoKICAgICAgICAgICAgLSBBbGwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBhbHNvIHdvcmtpbmcgaW5jbHVkaW5nIHNwZWNpYWxpemF0aW9ucywgZWc6CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmM8ZG91YmxlPihkb3VibGUgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYyhpbnQgdCk7CgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW1vdmUgdGhlIGFiaWxpdHkgdG8gc2hhcmUgdHlwZSBpbmZvcm1hdGlvbiBieSB1c2luZyBjIGxpbmtpbmcuCiAgICAgICAgICAgICAgQWxsIHR5cGUgc2hhcmluZyBoYXBwZW5zIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgICAgICsgUmVtb3ZlIFNXSUdfTk9JTVBPUlQsIFNXSUdfUlVOVElNRSwgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KICAgICAgICAgICAgICAgICsgRGVwcmVjYXRlIC1ydW50aW1lLCAtbm9ydW50aW1lIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0ZXN0LXN1aXRlIGNvbW1vbi5tayB0byBjb3JyZWN0bHkgYnVpbGQgbXVsdGljcHB0ZXN0CiAgICAgICAgICAgICAgICArIFJlbW92ZSByZWZlcmVuY2UgdG8gcHJlY29tbW9uLnN3ZwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGhlIGd1aWxlX2doIGludGVyZmFjZSB0byBzaGFyZSBkYXRhIGJ5IGEgZ2xvYmFsIHZhciBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgIG9mIGMgbGlua2FnZS4KCiAgICAgICAgICAgIC0gUmVtb3ZlIEFkdmFuY2VkLmh0bWwsIHNpbmNlIGV2ZXJ5dGhpbmcgaW4gaXQgaXMgbm93IG9ic29sZXRlCgoxMC8wOS8yMDA0OiBtbWF0dXMKCSAgICAtIFNwbGl0IHRoZSBweXRob24gc3RkL1NUTCBDKysgbGlicmFyeSBmaWxlcywgbm93CgkgICAgICBhbGwgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IGRlZmluaXRpb25zIGFyZSB1bmRlcgoJICAgICAgdGhlIGRpcmVjdG9yeQoJICAgICAgCgkJTGliL3N0ZAoKCSAgICAgIGFuZCBoZW5jZSwgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMuCgoJICAgIC0gQWRkIG1vcmUgZG9jdW1lbnRhdGlvbiB0byB0aGUgUHl0aG9uIFNUTCwgYW5kCgkgICAgICBjbGVhbiB1bm5lY2Vzc2FyeSBjb2RlLgoKCSAgICAtIEFkZCBpbml0aWFsIEM5OSBjb21wbGV4IHN1cHBvcnQsIGFuZCBzb21lIGZpeGVzCgkgICAgICBmb3IgbG9uZyBkb3VibGUuCgoxMC8wOC8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciBmb3Igb3BhcXVlIHR5cGVzLCBub3cgaXQgaXMgCgkgICAgICBhcHBsaWVkIGZvciBvcGFxdWUgdGVtcGxhdGVzIGFuZCBjbGFzc2VzLCBmb3Igd2hpY2ggd2UKCSAgICAgIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgb3Igbm90IGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgaWUKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoaW50KTsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgU3RpbGwsIGlmIHlvdSBrbm93IHRoYXQgeW91IGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYW5kIGZvciBzb21lIHZlcnkgdmVyeSBwYXJ0aWN1bGFyIHJlYXNvbgogICAgICAgICAgICAgIHlvdSB3YW50IHRvIGF2b2lkIHRoZSBTd2lnVmFsdWVXcmFwcGVyLCBhbmQgeW91IGRvbid0CiAgICAgICAgICAgICAgd2FudCBvciBjYW4ndCBleHBvc2UgdGhlIGNsYXNzIHRvIHN3aWcsIG5vdyB5b3UgY2FuCiAgICAgICAgICAgICAgc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3ZhbHVld3JhcHBlciIpIEE7ICAgIAogICAgICAgICAgICAgICAgIGNsYXNzIEE7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB0aGUgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBidXQgeW91IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSB3cmFwcGVyLCB5b3UKICAgICAgICAgICAgICBjYW4gc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ2YWx1ZXdyYXBwZXIiKSBBOwogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKCk7CgkJICAgLi4uLgogICAgICAgICAgICAgICAgIH07ICAgCiAgICAgIAoJICAgIC0gRml4IGZvciBjaGFyID4gMTI4LCBpZQoKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdGlsZGVfYSA9ICdcMzQxJzsKCiAgICAgICAgICAgIC0gQWRkIHBhdGNoIDEwNDE4NTggZm9yICRsZXh0eXBlLCB3aGljaCBjYXJyaWVzIHRoZSAKICAgICAgICAgICAgICBsaXRlcmFsIHR5cGUgb2YgYSBzeW1ib2wuIFNlZSBsZXh0eXBlLmkgaW4gdGhlCiAgICAgICAgICAgICAgdGVzdC1zdWl0ZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCgoxMC8wNy8yMDA0OiB3c2Z1bHRvbgoJICAgIHtSdWJ5LCBKYXZhXSBGaXggZGlyZWN0b3IgKyAnZW1wdHknIHRocm93cwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIEEoKSB0aHJvdygpOwoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICAgIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoKCjEwLzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbVENMXQogICAgICAgICAgICAtIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsbGlhbSBBLiBIb2ZmbWFuIHByb3BhZ2F0aW5nIGNsaWVudGRhdGEKICAgICAgICAgICAgYmV0d2VlbiBtb2R1bGVzLiAgQWRkZWQgY2xpZW50ZGF0YV9wcm9wLm11bHRpY3BwdGVzdCB0byBjaGVjayBmb3IKICAgICAgICAgICAgdGhpcyBidWcuICBUaGUgZml4IGludm9sdmVkIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAgICsgU3dpZ1R5cGVfY2xpZW50ZGF0YV9jb2xsZWN0IGRvZXMgbm90IG5lZWQgdG8gY2hlY2sKICAgICAgICAgICAgICAgIHR5cGVzIGluIHJfcmVzb2x2ZWQgYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gcHJvcGFnYXRlIGNsaWVudGRhdGEKICAgICAgICAgICAgICAgIHRvIHR5cGVkZWZlZCBjbGFzc2VzLCBhbmQgcl9tYW5nbGVkIGFscmVhZHkgdGFrZXMgY2FyZSBvZiB0eXBlZGVmcy4KCiAgICAgICAgICAgICAgICArIFNXSUdfVHlwZVJlZ2lzdGVyIG5vdyBjb3BpZXMgdGhlIGNsaWVudGRhdGEgZmllbGQgY29ycmVjdGx5CgogICAgICAgICAgICAgICAgKyBNb3ZlIFNXSUdfR3VpbGVfUHJvcGFnYXRlQ2xpZW50RGF0YSBmdW5jdGlvbiBmcm9tIGd1aWxlIG1vZHVsZQogICAgICAgICAgICAgICAgaW50byBjb21tb24uc3dnLCBiZWNhdXNlIHdlIG5lZWQgdG8gY2FsbCBpdCBmcm9tIGJvdGggZ3VpbGUgYW5kIHRjbC4KCiAgICAgICAgICAgICAgICArIEFkZCBiYXNlX25hbWVzIHRvIHN3aWdfY2xhc3MgdG8gZGVsYXkgdGhlIGxvb2t1cCBvZiBiYXNlcy4gIFNXSUcKICAgICAgICAgICAgICAgIG5vdyBleHBvcnRzIHRoZSBiYXNlIG5hbWVzIGFuZCBvbmx5IHdoZW4gdGhlIGJhc2Ugc3dpZ19jbGFzcyBpcwogICAgICAgICAgICAgICAgbmVlZGVkIGlzIFNXSUdfVHlwZVF1ZXJ5KG5hbWUpLT5jbGllbnRkYXRhIGxvb2tlZCB1cC4KCiAgICAgICAgICAgIC0gY29udmVyc2lvbl9uc190ZW1wbGF0ZSB0ZXN0c3VpdGUgdGVzdCB3YXMgZmFpbGluZyBiZWNhdXNlCiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdhcyBub3QgY2FsY3VsYXRlZAogICAgICAgICAgICBjb3JyZWN0bHkgZm9yIHN0cnVjdHMuICBGaXhlZC4KCjEwLzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyB1c2VkIGluIGRpcmVjdG9ycyAtIGluIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcyBhbmQgZGlyZWN0b3IgY29uc3RydWN0b3JzLgoKMTAvMDYvMjAwNDogbW1hdHVzCgkgICAgRml4IHRoZSBfX2NwbHVzcGx1cyBtYWNybywgYW5kIGJ1ZyAxMDQxMTcwLgoJICAgIE5vdyBpdCBpcyB3b3JraW5nIGFzIHN1cHBvc2VkLCBpZSwgeW91IGNhbiBzYWZlbHkgdXNlCgoJICAgICAgI2lmZGVmIF9fY3BsdXNwbHVzCgkgICAgICAuLi4KCSAgICAKCSAgICBhbGwgb3ZlciBzd2lnLCBpbmNsdWRpbmcgaW5zaWRlICVkZWZpbmVzIGFuZCAleyAlfSBib2RpZXMuCgoJICAgIAogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZSBvbGQgdHJpY2sgb2YgdXNpbmcKCgkgICAgICAjaWYgX19jcGx1c3BsdXMKCgkgICAgZG9lc24ndCB3b3JrIGFueSBtb3JlLiBTbywgaWYgeW91IGhhdmUgeW91ciBvd24gdHlwZW1hcHMKCSAgICB1c2luZyB0aGF0IHN5bnRheCwgeW91IHdpbGwgbmVlZCB0byBtaWdyYXRlIHRoZW0gdG8gdXNlCgkgICAgIiNpZmRlZiBfX2NwbHVzcGx1cyIuCgoxMC8wNS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW9yZ2FuaXplIGhvdyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGFuZCBzaGFyZWQKCSAgICBiZXR3ZWVuIG1vZHVsZXMuICBGb3IgY2hpY2tlbiBhbmQgbXpzY2hlbWUsIEkgcmVtb3ZlZAoJICAgIHRoZSBhYmlsaXR5IHRvIHVzZSBydW50aW1lIGxpYnJhcmllcywgd2hpbGUgcGVybCwgdGNsLCBweXRob24sIGFuZAoJICAgIHJ1YnkgZGVmYXVsdCB0byB1c2luZyB0aGUgbmV3IG1ldGhvZCBidXQgY2FuIGdvIGJhY2sgdG8gdGhlIG9sZAoJICAgIG1ldGhvZCBieSBkZWNsYXJpbmcgU1dJR19BTExPV19SVU5USU1FLgoKCSAgICAtIGxpbmUgNTgyIGluIG16c2NoZW1lLmN4eCB3YXMgZ2VuZXJhdGluZyBhIHNlZ2ZhdWx0IG9uIAoJICAgIGltcG9ydHMubXVsdGljcHB0ZXN0LCBzbyBJIGZpeGVkIGl0LgoKMTAvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yICVleHRlbmQgYW5kIG92ZXJsb2FkZWQgc3RhdGljIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cy4KCjEwLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gW3B5dGhvbl0gRml4IGRpcmVjdG9yICsgbWV0aG9kIHdpdGggJ2VtcHR5JyB0aHJvdywgaWUKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoJCSAgICAKCSAgICAgIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgYWxzbyBlYXN5IHRvIGZpeCwgbG9vayBmb3IKCSAgICAgIEdldGF0dHIobiwidGhyb3ciKSBpbiBweXRob24uY3h4LgoKCSAgICAtIEZpeCBkaXJlY3RvciArIGRlc3RydWN0b3Igd2l0aCAnZW1wdHknIHRocm93CgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgIH07CgoJICAgIC0gTm93IFNXSUdfRkVBVFVSRVMgcGFyc2UgYWxsIGFuZCB0aGUgc2FtZSAgb3B0aW9ucyB5b3UKICAgICAgICAgICAgICBjYW4gcGFzcyB0byBzd2lnIGluIHRoZSBjb21tYW5kIGxpbmUuCgkgICAgICAKCSAgICAtIE5ldyBjb21tYW5kIGxpbmUgZmxhZzogLWZlYXR1cmVzIDxsaXN0PiwgYXMgaW4KCgkgICAgICAgIHN3aWcgLWZlYXR1cmVzIGF1dG9kb2M9MyxkaXJlY3RvcgoKCSAgICAgIGllLCBhbnkgZ2xvYmFsIGZlYXR1cmUgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gdGhlCgkgICAgICBjb21tYW5kIGxpbmUuIFRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nLCBidXQgdXNlcnMKCSAgICAgIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIGl0LgoKMTAvMDQvMjAwNDogbW1hdHVzCgkgICAgLSBQcm9wZXJseSBxdWFsaWZ5IHR5cGUgaW4gc3ludGF4IGFzICdsb25nKDIpJyBvciAnRm9vKCknLAoJICAgICAgdGhpcyBzb2x2ZSBvbGQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJncywgYW5kIHByb2JhYmx5CgkgICAgICBvdGhlciBwcm9ibGVtcyBhcm91bmQuIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IGFyZyBwcm9ibGVtCgkgICAgICB3YXMgYWxzbyBhbHJlYWR5IHNvbHZlZCBieSBXaWxsaWFtIChzZWUgYmVsb3cpLgoKCSAgICAtIEZpeCBmZWF0dXJlX3NldCBhbmQgZmVhdHVyZV9nZXQgbWV0aG9kcy4gQmVmb3JlCgkgICAgICB0aGV5IGxvb2sgZnJvbSBwYXJ0aWN1bGFyIHRvIGdlbmVyYWwgYW5kIGtlZXAgdGhlIGZpcnN0CgkgICAgICBmZWF0dXJlIGZvdW5kLiBUaGlzIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0ZW1wbGF0ZXMuCgkgICAgICBOb3cgdGhlIG1ldGhvZHMgbG9vayBmcm9tIGdlbmVyYWwgdG8gcGFydGljdWxhciwgYW5kCgkgICAgICBvdmVycmlkZSBhbnkgZm91bmQgZmVhdHVyZS4KCiAgICAgICAgICAgIC0gUHJldmlvdXNseSBhIGZlYXR1cmUgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY29uc3RydWN0b3JzCiAgICAgICAgICAgICAgb3IgZGVzdHJ1Y3RvcnMgdGhhdCB3ZXJlbid0IGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSBGb28oKSAiLi4uIgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgfkZvbygpICIuLi4iCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBGb28oKSBhbmQgfkZvbygpCiAgICAgICAgICAgICAgICB9OwoKCSAgICAtIEZpeCBtaXNzaW5nIGZlYXR1cmVzIGZvciBkZWZhdWx0IGNvbnN0L2Rlc3QsIGJ5IHJlYWxseQoJICAgICAgJ2NyZWF0aW5nJyB0aGUgbWV0aG9kcyBhbmQgYXBwbHlpbmcgdGhlIGZlYXR1cmVzLgoKCSAgICAtIEZpeCByZXR1cm5fY29uc3RfdmFsdWUuaSBjYXNlIGJ5IGFkZGluZyBTd2lnVmFsdWVXcmFwcGVyPGNvbnN0IFQ+CgkgICAgICBzcGVjaWFsaXphdGlvbi4KCgkgICAgLSBGaXggJWV4dGVuZCArIG92ZXJsb2FkLCBpbmNsdWRpbmcgb3ZlcmxvYWRpbmcgYWN0dWFsCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcy4gCgoJICAgIC0gQWRkaW5nIG1vcmUgY2FzZXMgaW4gcmVsYXRlZCBmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZS4gIAoKMTAvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgd2F5IGRlZmF1bHQgYXJndW1lbnRzIGFyZSB3cmFwcGVkLiBQcmV2aW91c2x5IGEgc2luZ2xlCiAgICAgICAgICAgIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBlYWNoIG1ldGhvZCB0aGF0IGhhZCBkZWZhdWx0IGFyZ3VtZW50cy4gSWYKICAgICAgICAgICAgYSBtZXRob2QgaGFkIDUgYXJndW1lbnRzLCBzYXksIG9mIHdoaWNoIDEgaGFkIGEgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB0aGVuIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCB3b3VsZCBwYXNzIDUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICB2YWx1ZSB3YXMgY29waWVkIGludG8gdGhlIHdyYXBwZXIgbWV0aG9kIGFuZCB1c2VkIGlmIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgcGFzc2VkIGp1c3QgNCBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoaXMgd2FzIGZsYXdlZCBhcyB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudCBzb21ldGltZXMgZG9lcyBub3QgaGF2ZSBnbG9iYWwgYWNjZXNzLCBmb3IgZXhhbXBsZQogICAgICAgICAgICBTV0lHIHdvdWxkIGdlbmVyYXRlIGNvZGUgdGhhdCBjb3VsZG4ndCBjb21waWxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNsYXNzIFRyaWNreSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCA9IHByaXZhdGV2YWx1ZSk7CiAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgdmFsID0gVHJpY2t5OjpnZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGVudW0geyBwcml2YXRldmFsdWUgPSAyMDAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBidWdzIGluIHJlc29sdmluZyBzeW1ib2xzIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgKHByb2JhYmx5IGZpeGFibGUgdGhvdWdoKToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBLbGFzcyBjb25zdHJ1Y3RvcmNhbGwoY29uc3QgS2xhc3MmIGsgPSBLbGFzcygpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgYXBwcm9hY2ggYWxzbyBkb2VzIG5vdCB3b3JrIGZvciBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpCiAgICAgICAgICAgIGFzIHRoZXNlIGxhbmd1YWdlcyBkbyBub3QgYWxsb3cgbWV0aG9kcyB0byBoYXZlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgICAgICAgIEFsdGhvdWdoIEMjIGhhcyBhIG1lY2hhbmlzbSB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5CiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXJlIG1vcmUgbGlrZSB2YXJhcmdzLgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBzb2x2ZXMgdGhlIGFib3ZlIHByb2JsZW1zIGFuZCB3cmFwcyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZC4gU28gU1dJRyB3aWxsIG5vdyB0cmVhdAoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYXMgaWYgaXQgaGFkIHBhcnNlZDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICB2b2lkIGZvbygpOwoKICAgICAgICAgICAgVGhlIGNvZGUgZ2VuZXJhdGVkIGlzIHRoZW4gZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBTV0lHIGhhZCBwYXJzZWQgdGhlIHR3bwogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNvdW50IHRoZSBhcmd1bWVudHMgcGFzc2VkIGFuZCBjYWxsCiAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QsIGp1c3QgbGlrZSBvdmVybG9hZGVkIG1ldGhvZHMuIEMjIGFuZCBKYXZhIGFyZSBub3cgYWJsZQogICAgICAgICAgICB0byBwcm9wZXJseSB3cmFwIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBieSBnZW5lcmF0aW5nIGV4dHJhIG1ldGhvZHMsCiAgICAgICAgICAgIGFnYWluIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQsIHNvIGZvcjoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHM9ImhlbGxvIiwgZG91YmxlIGQ9MTAuMCwgaW50IGk9MCk7CgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByb3h5IG1ldGhvZHMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkLCBpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcyk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggY29tZXMgd2l0aCBhIGNvdXBsZSBvZiBtaW5vciBrbm9jayBvbiBlZmZlY3RzLgoKICAgICAgICAgICAgMSkgU1dJRyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgQyAobm90IEMrKykgY29kZSBubyBsb25nZXIgd29ya3MuCiAgICAgICAgICAgIFByZXZpb3VzbHkgeW91IGNvdWxkIGhhdmUgdGhpcyBpbnRlcmZhY2U6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHBhc3Mgbm8gYXJndW1lbnRzCiAgICAgICAgICAgIHdoZXJldXBvbiB0aGUgZGVmYXVsdCBvZiAwIHdhcyB1c2VkLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBiZWhhdmlvdXIgZm9yIEMKICAgICAgICAgICAgY29kZSBieSB1c2luZyB0aGUgImRlZmF1bHQiIHR5cGVtYXA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGRlZmF1bHQpIGludCB2YWwgIiQxID0gMDsiCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwoKICAgICAgICAgICAgb3IgeW91IGNvdWxkIG9mIGNvdXJzZSBjb21waWxlIHlvdXIgY29kZSBhcyBDKysgaWYgeW91IHdhbnQgQysrIGZlYXR1cmVzIDopIDoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIEEgY291cGxlIG9mIFNXSUcncyBsaWJyYXJpZXMgdXNlZCB0aGlzIEMgZXh0ZW5zaW9uIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQKICAgICAgICAgICAgdG8gdXNlIHRoZSAiZGVmYXVsdCIgdHlwZW1hcC4gVGhlICJkZWZhdWx0IiB0eXBlbWFwIGlzIHRodXMgdW5jaGFuZ2VkIChhbmQgc3RpbGwKICAgICAgICAgICAgaXMgbm90IGFuZCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IEMjIGFuZCBKYXZhLCBhbmQgaXMgbGlrZWx5IHRvIHJlbWFpbiBzbykuCgoKICAgICAgICAgICAgMikgQWxsIGZlYXR1cmVzICglZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSBldGMpIG5vIGxvbmdlciB3b3JrIGFzIGlmIHRoZSBtZXRob2QKICAgICAgICAgICAgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpcyBqdXN0IG9uZSBtZXRob2QuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CgogICAgICAgICAgICB3b3VsZCBoYXZlIGlnbm9yZWQgdGhlIG1ldGhvZCBjb21wbGV0ZWx5LiBOb3cgaXQgd2lsbCBvbmx5IGlnbm9yZSBmb28oaW50KSBidXQKICAgICAgICAgICAgbm90IHRoZSBleHRyYSBmb28oKSBtZXRob2QuIEluc3RlYWQgdXNlOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbzsKCiAgICAgICAgICAgIHRvIGlnbm9yZSB0aGVtIGFsbC4gb3IKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwoKICAgICAgICAgICAgVGhpcyBvZiBjb3Vyc2UgYWxsb3dzIG9uZSB0byBmaW5lIHR1bmUgdGhlIHdyYXBwaW5nLCBmb3IgZXhhbXBsZSBvbmUgY291bGQgdXNlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2ludCkgZm9vKGludCk7CiAgICAgICAgICAgICAgJXJlbmFtZShmb29kZWZhdWx0cykgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZW0gZnJvbSBhbnkgbGFuZ3VhZ2UgbGlrZSBzbzoKCiAgICAgICAgICAgICAgZm9vaW50KDIwMCkKICAgICAgICAgICAgICBmb29kZWZhdWx0cygpCgogICAgICAgICAgICBvciBmb3IgZXhhbXBsZSBpZ25vcmUgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kLCBzbyB0aGUgZGVmYXVsdHMgY2Fubm90IGJlIHVzZWQ6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzIvMjAwNDogbW1hdHVzCgkgICBbUHl0aG9uXQoJICAgLSBNb3JlIGNsZWFuaW5nIHVwIGFuZCB1bmlmb3JtYXRpb24gb24gdGhlIFB5dGhvbiBMaWIKCgkgICAtIEFkZGVkIFJvYmluJ3MgZG9jc3RyaW5nIHBhdGNoLCBwbHVzIHNvbWUgZml4ZXMsIHBsdXMKCSAgICAgc29tZSBleHRlbnNpb25zLCBzZWUgYXV0b2RvYy5pIGV4YW1wbGUgaW4gdGhlIHRlc3Qtc3VpdGUsCgkgICAgIGFuZCB0cnkgdXNpbmcgJWZlYXR1cmUoImF1dG9kb2MiLCJleHRlbmRlZCIpLgoJICAgIAoJICAgICBUaGlzIHBhdGNoIGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciB0aGUKCSAgICAgZG9jdW1lbnRhdGlvbiBwcm9ibGVtLCBqdXN0IGVub3VnaCB0byBpbmZvcm0gcHl0aG9uIGFib3V0CgkgICAgIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCgkgICAgIFRoZSBleHBlY3RlZCBzd2lnIGRvY3VtZW50YXRpb24gc3VwcG9ydCBpcyBmYXIgZmFyIGF3YXkgeWV0LgoJICAgICAKCjEwLzEvMjAwNDogbW1hdHVzCgkgICAtIEZpeCB0aGUgJWNhbGxiYWNrIGZlYXR1cmUgKG9ubHkgdXNlZCBpbiBydWJ5IGFuZCBweXRob24gZXhhbXBsZXMsCgkgICAgIGJ5IG5vdywgYnV0IGl0IHNob3VsZCBiZSBnZW5lcmljKSwgbm93IG1lbWJlciBjYWxsYmFja3MKCSAgICAgYXJlIHdvcmtpbmcgYWdhaW4KCSAgICAgCgkgICAtIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbnMgcG9pbnRlcnMgbGlrZQoKCQkgc3RkOjpvc3RyZWFtJiBzdGQ6OmVuZGwoc3RkOjpvc3RyZWFtJik7CgoJICAgICBpZSwgdGhlIG9uZXMgdGhhdCByZXR1cm4gcmVmZXJlbmNlcyBvciBlbnVtcy4KCSAKCSAgIFtQeXRob25dIEFkZCB0aGUgJXB5dGhvbmNhbGxiYWNrIGRpcmVjdGl2ZSwgd2hpY2ggaXMgCgkgICBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mICVjYWxsYmFjaywgaWUsCgoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgZm9vOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFyOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFybTsKCgkgICAgIGludCBmb28oaW50IGEpIHsKCSAgICAgICAgIHJldHVybiBhOwoJICAgICB9CiAgCgkgICAgIHN0cnVjdCBBIAoJICAgICB7CgkgICAgICAgc3RhdGljIGludCBiYXIoaW50IGEpOwoJICAgICAgIGludCBiYXJtKGludCBhKTsKCgkgICAgIH07CgogICAgICAgICAgICAgaW50IGZvb2JhcihpbnQgYSwgaW50ICgqcGYpKGludCBhKSk7CgoJICAgaW4gcHl0aG9uIHlvdSBjYW4gdXNlCgogICAgICAgICAgICAgZm9vKDIpCgkgICAgIGZvb2JhcigyLGZvbykKICAgICAgICAgICAgIEEuYmFyKDIpCgkgICAgIGZvb2JhcigyLEEuYmFyKQogICAgICAgICAgCiAgICAgICAgICAgaWUsIG5vIGFkZGl0aW9uYWwgcG9pbnRlciBlbGVtZW50cyBhcmUgY3JlYXRlZCwgYW5kCgkgICB0aGUgb3JpZ2luYWwgJ2ZvbycgYW5kICdBLmJhcicgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycy4KCgkgICBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgZnVuY3Rpb24gaG93ZXZlciwgc3RpbGwgeW91IG5lZWQKCSAgIHRvIHVzZSB0aGUgc3BlY2lhbCB2YXJpYWJsZSBDbGFzczo6PGZuY19uYW1lPl9jYl9wdHIsIGllOgoKIAkgICAgIGZvb2Jhcm0oMywgYSwgQS5iYXJtX2NiX3B0cikKCSAgIAoJICAgd2Ugd2lsbCB0cnkgdG8gZml4IHRoaXMgc2l0dWF0aW9uIGFsc28sIGJ1dCBsYXRlci4gIAoKCSAgIFtQeXRob25dIEFkZCBtb3JlIGVsZW1lbnRzIGZyb20gdGhlIFNUTCBsaWJyYXJ5LCBub3cKCSAgIHlvdSBjYW4gdXNlCgoJICAgICBpbXBvcnQgc3RkCgkgICAgIHN0ZC5jb3V0IDw8ICJoZWxsbyAiIDw8IDEyMyA8PCBzdGQuZW5kbAoKCSAgIFtQeXRob25dIEZpeCBpbi9vdXQgcmV0dXJuIG1lY2hhbmlzbSwgbm93IHN3aWcgd2lsbCBiZWhhdmUKCSAgIGFzIDEuMy4yMSBidXQgdXNpbmcgYSBweXRob24gbGlzdCB3aGVuIG5lZWRlZC4gVGhlIHByb2JsZW0KCSAgIGlzIHRoYXQgdGhlIHR5cGVzIHN0ZDo6cGFpcixzdGQ6OnZlY3RvcixldGMsIHVzZSB0dXBsZXMsCgkgICBhbmQgdGhleSBpbnRlcmZlciB3aXRoIHRoZSBwcmV2aW91cyBpbm91dCB0dXBsZSB0eXBlLgoKCSAgIEJ5IHVzaW5nIGxpc3RzIHdlIHNvbHZlIHRoZSBjb25mbGljdHMsIHN3aWcgYWN0cyBhcyBiZWZvcmUsCgkgICBidXQgcmV0dXJucyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhcmUgdXNpbmcKCSAgIHRoZSBPVVQgdHlwZW1hcC4gU2VlIHRoZSBuZXcgaW5vdXQuaSBleGFtcGxlIGluIHRoZQoJICAgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJCSAgIAogICAgICAgICAgIFtQeXRob25dIE11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBiYWQgYXJndW1lbnRzLCBub3cKCSAgIHlvdSBhbHdheXMgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgoKMDkvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSAtCiAgICAgICAgICAgIDEpIFdhcm5pbmcgZW1pdHRlZCB3aGVuIC1pbXBvcnRhbGwgYW5kIC1pbmNsdWRlYWxsIGlzIHVzZWQgdG9nZXRoZXIsCiAgICAgICAgICAgICAgIHdpdGggLWluY2x1ZGVhbGwgdGFraW5nIHByZWNlZGVuY2UuCiAgICAgICAgICAgIDIpIEVuc3VyZSBTV0lHSU1QT1JURUQgaXMgYWx3YXlzIGRlZmluZWQgd2hlbiBhIGZpbGUgaXMgYmVpbmcKICAgICAgICAgICAgICAgaW1wb3J0ZWQgd2l0aCAlaW1wb3J0LiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgU1dJR0lNUE9SVCwKICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBkZWZpbmVkIGluIGFsbCBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlcy4KCjA5LzI2LzIwMDQ6IG1tYXR1cwoKCSAgICAtIGFkZCAlZmVhdHVyZSgiZXhjZXB0aW9uY2xhc3MiKSB0byBpZGVudGlmeSBhIGNsYXNzIHVzZWQKCSAgICAgIGFzIGV4Y2VwdGlvbi4gQmVmb3JlIHN3aWcgaWRlbnRpZmllZCBhbmQgbWFya2VkIGEgY2xhc3MKCSAgICAgIHVzaW5nIHRoZSAiY3BsdXM6ZXhjZXB0aW9uY2xhc3MiIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlCgkgICAgICBjbGFzcyBuZWVkZWQgdG8gYXBwZWFyIG9uIGFuIHRocm93KCkgc3RhdGVtZW50LiAgTm93CgkgICAgICBzd2lnIGtlZXBzIHRyeWluZyB0byBpZGVudGlmeSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMsIGFzCgkgICAgICBiZWZvcmUsIGJ1dCBpdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtYXJrIGEgY2xhc3MgYnkKCSAgICAgIHVzaW5nIHRoZSAlZmVhdHVyZSBleHBsaWNpdGx5LiAobW9zdGx5IHJlbGV2YW50IGZvcgoJICAgICAgcHl0aG9uIGFuZCBjaGlja2VuKQoKCSAgICBbUHl0aG9uXQoKCSAgICAtIGZpeCAtbW9kZXJuIG9wdGlvbiArIGV4Y2VwdGlvbnMsIHdoaWNoIG1peCBvbGQgY2xhc3MKCSAgICAgIHN0eWxlIHdpdGggdGhlIG5ldyBvbmUuIFNvLCB3ZSBhbHdheXMgbmVlZCB0byBlbWl0CgkgICAgICB0aGUgIm5vbm1vZGVybiIgcHl0aG9uIGNvZGUuCgoJICAgIC0gYWRkIHRoZSAicHl0aG9uOm5vbmR5bmFtaWMiIGZlYXR1cmUgYW5kIGl0cyBoYW5kbGVyCgoJICAgICAgbm93IGlmIHlvdSBoYXZlCgkgICAgICAKCSAgICAgICVweXRob25ub25keW5hbWljIEE7CgkgICAgICAKCSAgICAgIHN0cnVjdCBBIHsKCSAgICAgICBpbnQgYTsKCSAgICAgICBpbnQgYjsKCSAgICAgIH07CgoJICAgICAgdGhlbiwgaW4gdGhlIHB5dGhvbiBzaWRlCgkgICAgICAKCSAgICAgIGFhID0gQSgpCgkgICAgICAKCSAgICAgIGFhLmEgPSAxICMgb2sKCSAgICAgIGFhLmIgPSAyICMgb2sKCSAgICAgIGFhLmMgPSAzICMgZXJyb3IsIHRoZSBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LgoKCSAgICAKCSAgICBTaW5jZSB0aGlzIGlzIGEgZmVhdHVyZSwgeW91IGNhbiB1c2UKCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYzsKCiAgICAgICAgICAgIG9yIAoKCSAgICAgICVweXRob25keW5hbWljOyBbIE5vdGU6ICVweXRob25keW5hbWljIHNpbmNlIGRlcHJlY2F0ZWQgXQogICAKCSAgICB0byBmb3JjZSBhbGwgdGhlIHdyYXBwZWQgY2xhc3NlcyB0byBiZSAibm9uZHluYW1pYyIgb25lcy4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHJlZ3VsYXIgcHl0aG9uLCBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZAoJICAgIGNsYXNzZXMgYXJlIGR5bmFtaWNzLiBTbywgY2FyZWZ1bCB3aXRoIHlvdXIgc3BlbGxpbmcuCgowOS8xNC8yMDA0OiBtbWF0dXMgCgkgICAgLSBTdXBwb3J0IHRoZSAtSS0gb3B0aW9uLgoKCSAgICAtIERpZmZlcmVudGlhdGUgYmV0d2VlbiAlaW5jbHVkZSA8ZmlsZT4gYW5kICVpbmNsdWRlICJmaWxlIi4KCSAgICAgIFRoaXMgZml4IHNldmVyYWwgY29ybmVyIGNhc2VzLgoKCSAgICAKCSAgICBbUHl0aG9uXSBTZXZlcmFsIHBhdGNoZXM6CgoJICAgIC0gTm9ybWFsaXplIHRoZSBMaWIgZmlsZSBuYW1lczogCgkJKi5zd2cgaW50ZXJuYWwgZmlsZXMsIAoJCSouaSAgIHVzZXIgZmlsZXMuCgoJICAgIC0gRml4IENoYXJbQU5ZXSB0eXBlbWFwcywgc28gdGhleSBhbHNvIGRlbGV0ZSBhbnkgZXh0cmEgJ1wwJyBjaGFycywKCSAgICAgIG5vdyB0aGV5IGJlaGF2ZSBhcyBiZWZvcmUgKDEuMy4yMSkuIFN0aWxsLCB5b3UgY2FuIHVzZQoJICAgICAgdGhlIFNXSUdfUFJFU0VSVkVfQ0FSUkFZX1NJWkUgbWFjcm8gaWYgeW91IG5lZWQgdG8KCSAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzaXplIChzZWUgcHlzdHJiYXNlLnN3ZykuCgoJICAgIC0gQWRkIHRoZSBDaGFyIEZJWFNJWkVbQU5ZXSB0eXBlbWFwcywgdG8gcHJlc2VydmUgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgQyBhcnJheSBzaXplcyAoc2VlIGFib3ZlKS4gVGhvdWdoLCB5b3UgY2FuJ3QKICAgICAgICAgICAgICB1c2UgdGhlbSB5ZXQgc2luY2UgJWFwcGx5IGFuZCBhcnJheXMgYXJlIG5vdCB3b3JraW5nCiAgICAgICAgICAgICAgdG9nZXRoZXIuCgogICAgICAgICAgICAtIEFkZCBweWZyYWdtZW50cy5zd2csIG5vdyB0aGUgdXNlciBjYW4gYWRkIGZyYWdtZW50cwoJICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25lcy4KCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2Ugd2hpY2ggZml4ZXMgc3B1cmlvdXMgcHJlcHJvY2Vzc29yIGJ1ZyB3aGljaAogICAgICAgICAgICBzaG93cyBvbiBTb2xhcmlzIGFuZCBnY2MsIGVnOgogICAgICAgICAgICAgICAgV2FybmluZygyMDIpOiBDb3VsZCBub3QgZXZhbHVhdGUgJyFkZWZpbmVkKFNXSUdKQVZBKSAmJgogICAgICAgICAgICAgICAgIShkZWZpbmVkKFNXSUdDU0hBUlApJwogICAgICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIHdoZXJlICcjaWYgImEiID09ICJiIiA9PSAxJyB3b3VsZG4ndCBoYXZlIHdvcmtlZCAKCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdC1zdWl0ZS4gUGF0Y2ggZnJvbQogICAgICAgICAgICBCaWxsIENsYXJrZS4KCjA5LzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBtaXNzaW5nIHJ1bnRpbWUuZHNwIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcyBmb3IgdGhlCiAgICAgICAgICAgIGltcG9ydCBleGFtcGxlcyB0byB3b3JrLgoKClZlcnNpb24gMS4zLjIyIChTZXB0ZW1iZXIgNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHN3aWcubTQgbWFjcm8gZm9yIHVzZSB3aXRoIHRoZSBBdXRvY29uZi9BdXRvbWFrZS9MaWJ0b29sIGhhcwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBhbmQgYmV0dGVyCiAgICAgICAgICAgIG1haW50YWluZWQgdmVyc2lvbiBkZXJpdmVkIGZyb20gc3dpZy5tNCBpbiB0aGUgQXV0b2NvbmYgbWFjcm8gYXJjaGl2ZS4KICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcGtnX3N3aWcuaHRtbCBhbmQKICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19weXRob25fZGV2ZWwuaHRtbC4KCjA5LzAxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkIHBhdGNoICMxMDE5NjY5IGZyb20gQ2hyaXN0b3BoIEZsYW1tLiBBZGRzIHN1cHBvcnQKICAgICAgICAgICAgZm9yICVmZWF0dXJlKCJzaGFkb3ciKSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd29ya3MgaW4gUHl0aG9uLiBUaGlzCiAgICAgICAgICAgIGVuYWJsZXMgb25lIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgc2hhZG93L3Byb3h5IG1ldGhvZHMsIGluY2x1ZGluZwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLyogTGV0J3MgbWFrZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIFNxdWFyZSBtb3JlIHZlcmJvc2UgKi8KCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpIFNxdWFyZShkb3VibGUgdykKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3ViIG5ldyB7CiAgICAgICAgICAgICAgICAgIG15ICRwa2cgPSBzaGlmdDsKICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgPSBleGFtcGxlYzo6bmV3X1NxdWFyZShAXyk7CiAgICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiQ29uc3RydWN0ZWQgYW4gQHtbcmVmKCRzZWxmKV19XG4iOwogICAgICAgICAgICAgICAgICBibGVzcyAkc2VsZiwgJHBrZyBpZiBkZWZpbmVkKCRzZWxmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICBjbGFzcyBTcXVhcmUgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIFNxdWFyZShkb3VibGUgdyk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMDgvMzEvMjAwNDogbW1hdHVzIAoJICAgIFtQeXRob25dIEluY29tcGF0aWJpbGl0eSByZXBvcnRlZCBieSBCaWxsIENsYXJrZSAobGxpYkBjb21wdXRlci5vcmcpOgoJICAgIAoJICAgIElmIHlvdSBhcmUgdXNpbmcgU3VuIFN0dWRpbyA4IChhbmQgcG9zc2libHkgZWFybGllcgoJICAgIHZlcnNpb25zKSB0byBjb21waWxlIHRoZSBvdXRwdXQgcHJvZHVjZWQgYnkgc3dpZwoJICAgIDEuMy4yMnJjMSwgYW5kIHlvdSBhcmUgdXNpbmcgQysrIGFuZCBTVEwgdGVtcGxhdGVzIHRoZW4KCSAgICB5b3UgbmVlZCB0byB1c2UgZWl0aGVyICItcnVudGltZSIgb3IgIi1ub3J1bnRpbWUiLiAgSWYgeW91CgkgICAgdXNlIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IGdldAoJICAgIGNvbXBpbGVyIGVycm9ycyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSB3cmFwcGVyIGZpbGU7CgkgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsaWtlIHRoaXM6IFRoZSBuYW1lCgkgICAgU1dJR19QeXRob25fQ29udmVydFB0clsuLi5dIGlzIHVudXNhYmxlIGluIHN0YXRpYwoJICAgIHN3aWdweTo6dHJhaXRzX2FzcHRyWy4uLl0gIElmIHlvdSBnZXQgdGhpcyBlcnJvciBtZXNzYWdlLAoJICAgIHlvdSBuZWVkIHRvIHJlZ2VuZXJhdGUgeW91ciB3cmFwcGVyIGZpbGUgdXNpbmcgJ3N3aWcKCSAgICAtcnVudGltZScgb3IgJ3N3aWcgLW5vcnVudGltZScuCgoJICAgIFlvdSBzaG91bGRuJ3QgZ2V0IHRoaXMgcHJvYmxlbSB3aXRoIFN1biBTdHVkaW8gOS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJICAgIAowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCAjOTMyMzMzIGZyb20gSWtlZ2FtaSBUc3V0b211LiBGaXhlcyBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICBhbmQgdW5zaWduZWQgbG9uZyBsb25nICpPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzg1NzM0NCBmcm9tIEFydCBZZXJrZXMuIFdvcmthcm91bmQgZm9yIGF1dG9jb25mIGJ1ZyB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGFydCBvZiBwYXRjaCAjOTgyNzUzIGFwcGxpZWQuIFRoaXMgaW1wbGVtZW50cyBhICVwZXJsY29kZSBkaXJlY3RpdmUuCiAgICAgICAgICAgIEl0IGFsbG93cyBvbmUgdG8gYWRkIFBlcmwgY29kZSB0byB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiBXb3JrcyB0aGUgc2FtZSAKICAgICAgICAgICAgYXMgJXB5dGhvbmNvZGUuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyB2aXJ0dWFsIG1ldGhvZHMgd2l0aCBleGNlcHRpb24KICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCB3ZXJlIG5vdCBzaW1wbGUgdHlwZXMuIFByZXZpb3VzbHkgY29kZSB3YXMgZ2VuZXJhdGVkIHRoYXQKICAgICAgICAgICAgZGlkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlIHdoZW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdhcyBhIHBvaW50ZXIuCgowOC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXAgZml4IGZvciBtZXRob2RzIHRoYXQgcmV0dXJuIGNoYXIgKi4gVGhlIENMUiB3b3VsZCBpbmNvcnJlY3RseQogICAgICAgICAgICBkZWxldGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNoYXIgKi4gQWxzbyBhcHBsaWVkIHRoZSBzYW1lIGNvcnJlY3Rpb24gdG8KICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMuCgowOC8yNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgLWZtaWNyb3NvZnQgZXJyb3Ivd2FybmluZyBtZXNzYWdlIGRpc3BsYXk6IAogICAgICAgICAgICAtIEVuZCBvZiBmaWxlIChFT0YpIHdhcm5pbmcgbWVzc2FnZXMgbm90IGRpc3BsYXlpbmcgaW4gY29ycmVjdCBmb3JtYXQKICAgICAgICAgICAgLSBTb21lIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYSBmaWxlIHBhdGggd2VyZSBkaXNwbGF5aW5nIGEgZG91YmxlIGJhY2tzbGFzaAogICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYmFja3NsYXNoCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICMxMDExNjA0IHN1Ym1pdHRlZCBieSBDaGFybGVzIFNjaHdpZXRlcnMuIEZpeCBmb3IgNjQgYml0IHRjbAogICAgICAgICAgICBpbnRlcnByZXRlcnMuCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGJ1ZyAjODc1NTgzIC0gZW51bSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBwcmV2aW91c2x5IGdhdmUgYSBzeW50YXggZXJyb3IuCgowOC8yMy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSB0eXBlbWFwcyAiZmZpdHlwZSIgYW5kICJsaXNwdHlwZSIgdG8gZGV0ZXJtaW5lIHRoZSBGRkkgdHlwZQoJICAgIHNwZWNpZmllcnMgZnJvbSB0aGUgQyB0eXBlLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGluc3RhbmNlLCB0byBjb250cm9sCgkgICAgd2hldGhlciBhIEMgImNoYXIiIGFyZ3VtZW50IHRha2VzIGEgTGlzcCBjaGFyYWN0ZXIgb3IgYSBMaXNwIGludGVnZXIgdmFsdWUuCgkgICAgVGhlIGRlZmF1bHQgKHRha2luZyBMaXNwIGNoYXJhY3RlcnMpIGlzIGRvbmUgYnkgdGhlc2UgYnVpbHQtaW4gdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciIKCSAgICAgICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJjaGFyYWN0ZXIiCgkgICAgSWYgY2hhciBtZWFucyBhbiBpbnRlZ2VyIGluc3RlYWQsIHVzZSB0aGVzZSB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIgoJICAgICAgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImludGVnZXIiCgowOC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcyBkaXNjdXNzZWQgaW4gYnVnICM3NzI0NTMsIHRoZSBTV0lHIGxpYnJhcnkgZGlyZWN0b3J5IGlzIG5vdyBpbnN0YWxsZWQKICAgICAgICAgICAgaW50byBhIGRpZmZlcmVudCBkZWZhdWx0IGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgdXNlZCB0byBiZSBpbnN0YWxsZWQgdG8KICAgICAgICAgICAgL3Vzci9sb2NhbC9saWIvc3dpZzEuMy4gSXQgaXMgbm93IGluIHRoZSBtb3JlIHVzdWFsIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudAogICAgICAgICAgICBkaXJlY3RvcnkgYW5kIEkgaGF2ZSBhZGRpdGlvbmFsbHkgdXNlZCBhIHZlcnNpb24gc3BlY2lmaWMgc3ViZGlyZWN0b3J5IGFzCiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHdpbGwgcmFyZWx5IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHLiBUaGlzIHJlbGVhc2UKICAgICAgICAgICAgd2lsbCB0aHVzIHVzZSAvdXNyL2xvY2FsL3NoYXJlL3N3aWcvMS4zLjIyIGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB0YWlsb3JlZCBhcyBiZWZvcmUgdXNpbmcgJy4vY29uZmlndXJlIC0tc3dpZ2xpYmRpcicuCgowOC8xNy8yMDA0OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBBZGQgc3VwcG9ydCB0byBjcmVhdGUgbmF0aXZlIE16U2NoZW1lIHN0cnVjdHVyZXMgZnJvbSBDIHN0cnVjdHVyZXMuCgkgICAgVG8gY29udmVydCBhIEMgc3RydWN0dXJlIHRvIGFuIE16U2NoZW1lIHN0cnVjdHVyZSwgdXNlIHRoZSBuZXcgcnVudGltZSBtYWNybwoJICAgIFNXSUdfTmV3U3RydWN0RnJvbVB0ciBpbiBhIHR5cGVtYXAuICBQYXRjaCBmcm9tIERtaXRyaXkgWmF2aW4uIAoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzgzNzcxNSBmcm9tIEJlbiBSZXNlciB0byBjb3JyZWN0bHkgZGV0ZWN0IFB5dGhvbiBsaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIG9uIDY0IGJpdCBzeXN0ZW1zLgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSBvZiBlYXJseSByZXR1cm4KICAgICAgICAgICAgZnJvbSB3cmFwcGVyIG1ldGhvZHMgdXNpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbWV0ZXJzLiBNb2RpZmllZAogICAgICAgICAgICBNYXJrIFRyYXVkdCBwYXRjaCAjOTUxNTY1LgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQnVnICM5NDM3ODMgd2l0aCBwYXRjaCBmaXhlcyBwaHAgY2hhciAqIG91dCB0eXBlbWFwIE5VTEwgdmFsdWVzLgoKMDgvMDMvMjAwNDogQWhtb24gRGFuY3kgIDxkYW5jeUBkYW5jeT4KCiAgICAgICAgICAgIFthbGxlZ3JvY2xdIEFkZGl0aW9uYWwgY2FzZSBtb2RlIGZpeGVzLiAgQWxzbywgbWFrZSBzdXJlCgkgICAgZm9yZWlnbiB0eXBlcyBhcmUgZXhwb3J0ZWQuCgowNy8yNC8yMDA0OiBta29lcHBlIAoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBTV0lHIG1vZHVsZXMgbm93IGV4Y2hhbmdlIHRoZWlyIHBvaW50ZXIgdHlwZQoJICAgIGluZm9ybWF0aW9uIHZpYSB0aGUgR3VpbGUgaW50ZXJwcmV0ZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEKCSAgICBydW50aW1lIGxpYnJhcnkgb3IgdG8gdXNlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGV0Yy4KCSAgICAKCSAgICBUaGUgbW9kdWxlIChTd2lnIHN3aWdydW4pIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBjaGFuZ2Ugb2YgMDUvMTcvMjAwNCBpcwoJICAgIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGJ1aWx0LiAgSWYgeW91IG5lZWQgaXQsIHJ1biBTV0lHIG9uIHRoZSBpbnRlcmZhY2UgZmlsZQoJICAgIHN3aWdydW4uaS4gCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEJ1ZyAjOTE3NjAxIE1hcHBpbmcgQysrIGJvb2wgZml4IGZyb20gTWFyayBUcmF1ZHQKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJQTSBmaXhlcyBmb3IgbGF0ZXN0IENWUyB2ZXJzaW9uIGluY2x1ZGluZyByZW1vdmFsIG9mIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyeS4KCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5MDg5NTUgZnJvbSBSb2JlcnQgSCBEZSBWcmllcy4KICAgICAgICAgICAgUlBNIGZpbGUgZ2VuZXJhdGlvbiBmaXggZm9yIEZlZG9yZSBDb3JlIDEgYW5kIFJlZGhhdCBBUzIuMS4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4NjQ2ODkgZnJvbSBSb2JpbiBEdW5uOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0cyB0d28gcHJvYmxlbXMgaW4gdGhlIFhNTCBvdXRwdXQgb2YgU1dJRzoKICAgICAgICAgICAgIAogICAgICAgICAgICAgIDEuIFRoZXJlIHdlcmUgb2Z0ZW4gZXh0cmEgJy8+XG4nIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgMi4gdmFsdWUgYXR0cmlidXRlcyB3ZXJlIG91dHB1dCB3aXRoICdcbicgaW4gdGhlbSBidXQKICAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG5vdCB0ZWNobmljYWxseSBsZWdhbCBtb3N0IChhbGw/KSBYTUwKICAgICAgICAgICAgICBwYXJzZXJzIHdpbGwgc3RyaXAgdGhlbSBvdXQuIFJlcGxhY2luZyB0aGUgJ1xuJyB3aXRoCiAgICAgICAgICAgICAgdGhlICcmIzEwOycgZW50aXR5IHJlZmVyZW5jZSBzb2x2ZXMgdGhpcyBhcyB0aGF0IGlzCiAgICAgICAgICAgICAgbGVnYWwgYW5kIFhNTCBwYXJzZXJzIHdpbGwgY29udmVydCBpdCB0byBhICdcbicgd2hlbgogICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHZhbHVlcyBiYWNrIGluLgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGEgbmV3IGdsb2JhbCBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgICAgICAgICAgdGhhdCB3aWxsIGFsbG93IHRoZSBwYXJzZSB0cmVlIHRvIGJlIHdyaXR0ZW4gb3V0IGluIFhNTAogICAgICAgICAgICAgICphZnRlciogc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGUgaGFzIGJlZW4gcnVuLCBpbgogICAgICAgICAgICAgIG9yZGVyIHRvIGJlIGFibGUgdG8gZ2V0IGV4dHJhIGluZm8gdGhhdCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICBtb2R1bGUgcHV0cyBpbiB0aGUgdHJlZS4gSW4gdGhpcyB3YXkgdGhlIFhNTCBpcyBhCiAgICAgICAgICAgICAgcG9zdC1wcm9jZXNzZWQgdmVyc2lvbiBvZiB0aGUgdHJlZSByYXRoZXIgdGhhbiBhCiAgICAgICAgICAgICAgcHJlLXByb2Nlc3NlZCB2ZXJzaW9uLiAKIAogICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb24gaXMgLWR1bXBfeG1sIG9yIC14bWxvdXQgPGZpbGU+CgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgdG8gZml4IHR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMKICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24gKG1ha2VjaGFwLnB5KSBmaWxlIGdlbmVyYXRvciBtaXNzaW5nIGVuZCBvZiBsaW5lCiAgICAgICAgICAgIHBhdGNoICM5MDg5NTEgZnJvbSBSb2JlcnQgZGUgVnJpZXMuCgowNy8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBydW50aW1lIGxpYnJhcnkgYnVpbGQgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcyBhbHNvIHJlbW92ZXMKICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgb24gTGlidG9vbC4gTGlidG9vbCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gYnVpbGQgU1dJRy4KICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgLWxkZmxhZ3MgU1dJRyBjb21tYW5kbGluZSBvcHRpb24gaGFzIGFsc28gYmVlbiByZW1vdmVkLgoKICAgICAgICAgICAgVGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRlc3RjYXNlcyB0aGF0IHVzZWQgdGhlIHJ1bnRpbWUgbGlicmFyeSBoYXZlCiAgICAgICAgICAgIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHJlcGxhY2VtZW50IGFwcHJvYWNoIHRvIHVzaW5nIFNXSUcgYWNyb3NzIAogICAgICAgICAgICBtdWx0aXBsZSBtb2R1bGVzLCB0aGF0IGlzIHRoZXkgdXNlIHRoZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLCBzZWUgTW9kdWxlcy5odG1sLiBFZmZlY3RpdmVseSB0aGV5IGJ1aWxkIHRoZWlyIG93biBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcmllcyB1c2luZyAtcnVudGltZS4gVGhlIGV4YW1wbGVzIGFyZSBpbXBvcnQgYW5kIGltcG9ydF90ZW1wbGF0ZS4KICAgICAgICAgICAgVGhlIHRlc3QgY2FzZXMgYXJlIGluIHRoZSBpbXBvcnRzIGFuZCB0ZW1wbGF0ZV90eXBlZGVmX2ltcG9ydCBkaXJlY3Rvcmllcy4KCiAgICAgICAgICAgIEFueW9uZSB3aG8gd2FudHMgdGhlIG9yaWdpbmFsIHJ1bnRpbWUgbGlicmFyaWVzIGNhbiBlaXRoZXIgcnVuIHRoZSB0ZXN0LXN1aXRlCiAgICAgICAgICAgIG9yIGJ1aWxkIHRoZSBleGFtcGxlcyBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFyZWQgb2JqZWN0L0RMTCB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aXRoIHRoZSAtcnVudGltZSBjb21tYW5kbGluZSBvcHRpb24uIEZvciBleGFtcGxlIGxpYmltcG9ydHNfcnVudGltZS5zbwogICAgICAgICAgICAoUHl0aG9uIGNhbGxzIGl0IGxpYl9pbXBvcnRzX3J1bnRpbWUuc28pIGlzIGdlbmVyYXRlZCBhZnRlciBydW5uaW5nIHRoZSAKICAgICAgICAgICAgJ21ha2UgaW1wb3J0cy5tdWx0aWNwcHRlc3QnIHRlc3RjYXNlIGluIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlLzxsYW5nPgogICAgICAgICAgICBkaXJlY3RvcnkuIE9yIHVzZSBsaWJydW50aW1lLnNvIC8gcnVudGltZS5kbGwgYWZ0ZXIgYnVpbGRpbmcgdGhlIGltcG9ydAogICAgICAgICAgICBleGFtcGxlcyBpbiBFeGFtcGxlcy88bGFuZz4vaW1wb3J0LgoKMDcvMDcvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBDb252ZXJ0IGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGluIGNvbnN0YW50cyB0byAKCSAgICBDTCBzeW50YXguICBGaXggRkY6REVGLUZPUkVJR04tQ0FMTCBmb3IgbWl4ZWQtY2FzZSBDIGZ1bmN0aW9ucy4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZmVhdHVyZSBmb3IgSmF2YSBleGNlcHRpb25zIHdpdGggZm9ybWF0ICVqYXZhZXhjZXB0aW9uKGV4Y2VwdGlvbmNsYXNzZXMpLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgYSBzbGlnaHQgZW5oYW5jZW1lbnQgdG8gJWV4Y2VwdGlvbiBhbmQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgCiAgICAgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBleGNlcHRpb24gY2xhc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGludG8gYSB0aHJvd3MgY2xhdXNlLgogICAgICAgICAgICBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBhc3NvY2lhdGVkIHByb3h5IG1ldGhvZCdzIHRocm93cyBjbGF1c2UuIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycKICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBsaWtlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBpbiB0aGUgJ3Rocm93cycgYXR0cmlidXRlIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwcy4gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGZvciBjb3JyZWN0bHkgaGFuZGxpbmcgY2hlY2tlZCBleGNlcHRpb25zCiAgICAgICAgICAgIHRocm93biBmcm9tIEpOSSBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFleGNlcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iKSB0aHJvd0V4Y2VwdGlvbiAlewogICAgICAgICAgICAgICAgLi4uIGNvbnZlcnQgYSBzdGQ6OmxvZ2ljX2Vycm9yIGludG8gYSBqYXZhLmxhbmcuRXhjZXB0aW9uIHVzaW5nIEpOSSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAgICAgICAgICAgICAgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkxvZ2ljIGVycm9yISIpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2Qgd2l0aCBhIHRocm93cyBjbGF1c2UgaW4gdGhlIG1vZHVsZSBjbGFzczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geyAuLi4gfQoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgJWNzY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFRoaXMgd29ya3MgdGhlIHNhbWUgd2F5IGFzICVqYXZhY29uc3R2YWx1ZS4gRm9yIEMjLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgICBpcyB0aGUgb25seSB3YXkgdGhhdCBvbmUgY2FuIGZpeCB3cmFwcGluZyBvZiBDL0MrKyBlbnVtcyB3aXRoIHByb3BlciBDIwogICAgICAgICAgICBlbnVtcyBpZiB0aGUgZW51bSBpdGVtJ3MgaW5pdGlhbGlzZXIgY2Fubm90IGNvbXBpbGUgYXMgQyMgY29kZS4gVGhpcyBpcwogICAgICAgICAgICBiZWNhdXNlIEphdmEgZW51bXMgY2FuIHVzZSBhIGNhbGwgaW50byBDIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZW51bSBpdGVtLAogICAgICAgICAgICB3aGVyZWFzIGluIEMjLCB0aGUgZW51bSB2YWx1ZSBtdXN0IGJlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiBUaGF0IGlzLAogICAgICAgICAgICB1c2luZyAlY3Njb25zdCgwKSBjYW5ub3QgYmUgdXNlZCBpbiBDIyB0byBpbml0aWFsaXNlIHRoZSBDIyBlbnVtIGl0ZW0gdmlhCiAgICAgICAgICAgIGEgUElOVk9LRSBjYWxsLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyAlamF2YWNvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBTb21ldGltZXMgdGhlIHVzZSBvZiAlamF2YWNvbnN0KDEpIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZQogICAgICAgICAgICB1bmRlciBKYXZhLiBJZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBpcyByZXF1aXJlZCwgJWphdmFjb25zdCgwKSBpcyBub3QgYW4KICAgICAgICAgICAgb3B0aW9uLiBUaGUgJWphdmFjb25zdHZhbHVlIGRpcmVjdGl2ZSBhY2hpZXZlcyB0aGlzIGdvYWwgYW5kIHRoZSB2YWx1ZSBzcGVjaWZpZWQKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGFzIEphdmEgY29kZSB0byBpbml0aWFsaXNlIHRoZSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMDAwKSBCSUc7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKCJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIyMDAwXCIpIikgTEFSR0U7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwKSBiYXI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXIgPSAxMDsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICNkZWZpbmUgQklHIDEwMDBMTAogICAgICAgICAgICAgICAgI2RlZmluZSBMQVJHRSAyMDAwVUxMCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7IEJBUiA9IDo6YmFyIH07CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEdlbmVyYXRlczoKCiAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBleGFtcGxlQ29uc3RhbnRzIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMDAwOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBMQVJHRSA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMjAwMCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9vIEJBUiA9IG5ldyBGb28oIkJBUiIsIDEwKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHksIG5vbmUgb2YgQklHLCBMQVJHRSBvciBCQVIgd291bGQgaGF2ZSBwcm9kdWNlZCBjb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgZW5oYW5jZW1lbnRzLiBGZWF0dXJlcyBjYW4gbm93IHRha2UgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGluIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlIG5hbWUgYW5kIGZlYXR1cmUgdmFsdWUuIFRoZSBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbCAKICAgICAgICAgICAgYW5kIGFyZSBtdWNoIHRoZSBzYW1lIGFzIHRoZSB0eXBlbWFwIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHNwZWNpZmllcyB0d28gb3B0aW9uYWwgYXR0cmlidXRlcywgYXR0cmliMSBhbmQgYXR0cmliMjoKCiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lICJ2YWwiOwogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIHZhbCwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lOwoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciB0aGUgc3ludGF4IHRoYXQgdGFrZXMgdGhlIGZlYXR1cmUgdmFsdWUgd2l0aGluIHRoZQogICAgICAgICAgICAlZmVhdHVyZSgpIGJyYWNrZXRzLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vIGxvbmdlciByZXN0cmljdGVkIHRvIGJlaW5nIGp1c3QKICAgICAgICAgICAgYSBzdHJpbmcuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IGFjY2VwdGFibGUKICAgICAgICAgICAgc3ludGF4OgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsMjAuMCk7CiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZCBoYXZlIHRvIGhhdmUgYmVlbjoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLCIyMC4wIik7CiAgICAgICAgICAgIFVzZWZ1bCBmb3IgZmVhdHVyZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSAlc29tZWZlYXR1cmUodmFsdWUpICAgICAgJWZlYXR1cmUoInNvbWVmZWF0dXJlIix2YWx1ZSkKICAgICAgICAgICAgVGhlc2Ugd2lsbCBub3cgd29yayBhY2NlcHRpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyOgogICAgICAgICAgICAgICVzb21lZmVhdHVyZSgiRnJlZCIpOwogICAgICAgICAgICAgICVzb21lZmVhdHVyZSg0KTsKCjA2LzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbiwgR3VpbGVdCiAgICAgICAgICAgICAtIENyZWF0ZWQgdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvc2NoZW1lcnVubWUgZGlyZWN0b3J5LCB3aGljaCBob2xkcyBhbGwgdGhlCgkgICAgICAgcnVubWUgc2NyaXB0cyBmb3IgZ3VpbGUgYW5kIGNoaWNrZW4gKGFuZCBwb3NzaWJseSBtenNjaGVtZS4uLikuICBUaGUgZ3VpbGUKCSAgICAgICBhbmQgY2hpY2tlbiBfcnVubWUgZmlsZXMgdGhlbiAobG9hZCAiLi4vc2NoZW1lcnVubWUvZm9vLnNjbSIpLgogICAgICAgICAgICAgLSBJbiBjaGlja2VuIG1vZHVsZSwgZml4IGEgZmV3IGJ1Z3MgaW52bG9sdmluZyBkeW5hbWljIGNhc3RzLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggdG8gZml4IHdyYXBwaW5nIG9mIHRlbXBsYXRlZCBtZXRob2RzLiBJU08gY29tcGxpYW50IGNvbXBpbGVycywgbGlrZQogICAgICAgICAgICBDb21lYXUgYW5kIEdDQy0zLjQuMCwgZG9uJ3QgbGlrZSB0aGUgdGVtcGxhdGUgc3BlY2lmaWVyIHRoYXQgU1dJRyB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICB3aGVuIGNhbGxpbmcgdGhlIG1ldGhvZC4gVGhpcyBmaXggbWF5IGJyZWFrIHNvbWUgbm9uIHN0YW5kYXJkIGNvbXBsaWFudCBjb21waWxlcnMsCiAgICAgICAgICAgIGZvciBleGFtcGxlLCBTdW4gd29ya3Nob3AgY29tcGlsZXJzIHByaW9yIHRvIHZlcnNpb24gNi4yLnAyLiBQYXRjaCBzdWJtaXR0ZWQKICAgICAgICAgICAgYnkgQmlsbCBDbGFya2UuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFVuZG9jdW1lbnRlZCBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZSByZW1vdmVkLgogICAgICAgICAgICBOZXcgc3BlY2lhbCB2YXJpYWJsZSAkbW9kdWxlIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYXMgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5ICVtb2R1bGUgb3IgLW1vZHVsZSBjb21tYW5kbGluZSBvcHRpb24uICRpbWNsYXNzbmFtZSBjYW4gYmUgY3JlYXRlZCBmcm9tICRtb2R1bGUuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNhbWUgYXMgZm9yIEphdmEgYmVsb3cuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5LCBuYW1lbHksCiAgICAgICAgICAgIGNzYm9keSBhbmQgY3Nib2R5X2Rlcml2ZWQuIFRoZSBkZXByZWNhdGVkIHR5cGVtYXBzIGFyZSBjc2dldGNwdHIgYW5kCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFR5cGVtYXAgY2hhbmdlcyBmb3IgdGhlIEphdmEgcHJveHkgLyB0eXBld3JhcHBlciBhbmQgZW51bSBjbGFzc2VzLiBBIG5ldwogICAgICAgICAgICB0eXBlbWFwIGNhbGxlZCBqYXZhYm9keSBjb250YWlucyB0aGUgZXNzZW50aWFsIHN1cHBvcnQgY29kZSBmb3IgZ2VuZXJhdGlvbiBpbnRvIHRoZSBib2R5CiAgICAgICAgICAgIG9mIHRoZXNlIGNsYXNzZXMuIFRoZXJlIGlzIGFsc28gYSBuZXcgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwIHdoaWNoIGlzIHVzZWQgaW5zdGVhZCBmb3IKICAgICAgICAgICAgd3JhcHBlZCBjbGFzc2VzIHRoYXQgaGF2ZSBhIHdyYXBwZWQgYmFzZSBjbGFzcy4gVGhlIGNvZGUgaXMgYmFzaWNhbGx5LCB0aGUgZ2V0Q1B0cigpCiAgICAgICAgICAgIG1ldGhvZCBhbmQgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMuIFRoZXNlIHVzZWQgdG8gYmUgaGFyZCBjb2RlZAogICAgICAgICAgICB3aXRoIG5vIHdheSB0byBtb2RpZnkgdGhlIGNvZGUuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhpcyB0eXBlbWFwIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgICB0aGUgdXNlciB0byB0YWlsb3IgbmVhcmx5IGV2ZXJ5IGFzcGVjdCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uLgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIG5vdyBpcyB0aGUgY29kZSBmb3IgZGlyZWN0b3IgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciBhbmQgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIHR5cGVtYXBzIGFyZSBkZXByZWNhdGVkIGFuZCBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgdGhhdCB0aGVzZSBnZW5lcmF0ZWQgY2FuIGJlIHB1dCBpbiB0aGUgbW9yZSBmbGV4aWJsZQogICAgICAgICAgICBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbCBtYXkgaGVscCB5b3UgdXBncmFkZSBpZiB5b3UgaGF2ZSB1c2VkCiAgICAgICAgICAgIHRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwOgoKICAgICAgICAgICAgICAgIC8qIFV0aWxpdHkgbWFjcm8gZm9yIG1hbmlwdWxhdGluZyB0aGUgSmF2YSBib2R5IGNvZGUgbWV0aG9kIGF0dHJpYnV0ZXMgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgQ1RPUl9BVFRSSUIsIEdFVENQVFJfQVRUUklCKQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHkpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3dpZ0NNZW1Pd247CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN3aWdDTWVtT3duID0gY01lbW9yeU93bjsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5X2Rlcml2ZWQpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIoJG1vZHVsZUpOSS5TV0lHJGphdmFjbGFzc25hbWVVcGNhc3QoY1B0ciksIGNNZW1vcnlPd24pOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogVGhlIGRlZmF1bHQgaXMgcHJvdGVjdGVkIGdldENQdHIsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhTV0lHVFlQRSwgcHJvdGVjdGVkLCBwcm90ZWN0ZWQpCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0dFVENQVFIoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwcm90ZWN0ZWQsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHB1YmxpYyBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfQk9EWU1FVEhPRFMoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwdWJsaWMsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBtb2RpZmllciB0eXBlbWFwcyBhbmQgcHJhZ21hcyBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgIFRoZXkgbXVzdCBub3cgaW5jbHVkZSB0aGUgY2xhc3MgdHlwZS4gUHJldmlvdXNseSAnY2xhc3MnIHdhcyBoYXJkIGNvZGVkLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBlbmFibGVzIGZsZXhpYmlsaXR5IGludG8gd2hhdCB0eXBlIG9mIGNsYXNzIGlzIGdlbmVyYXRlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgdGhlIHByb3h5IGNsYXNzIGNvdWxkIGJlIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MuCgogICAgICAgICAgICBGb3IgSmF2YSB0aGlzIGFmZmVjdHMgdGhlIGphdmFjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIEZvciBDIyB0aGlzIGFmZmVjdHMgdGhlIGNzY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIFVubGVzcyB5b3UgaGF2ZSBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IHZlcnNpb25zIG9mIHRoZXNlIHR5cGVtYXBzIG9yIHByYWdtYXMsIHlvdQogICAgICAgICAgICBzaG91bGRuJ3QgYmUgYWZmZWN0ZWQuIEhvd2V2ZXIsIGlmIHlvdSBoYXZlLCB1cGdyYWRpbmcgaXMgZWFzeSwgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIgoKICAgICAgICAgICAgbXVzdCBub3cgYmU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCBjbGFzcyIKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gUHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBPcmVuIE1pbGxlci4gQWxzbyBpbXByb3ZlcyB0aGUgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhdGNoIGhhbmRsZXIgZm9yIHBvaW50ZXJzIC0gYSBwb2ludGVyIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0bwogICAgICAgICAgICBhIHBvaW50ZXIuIEFkZGVkIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIGZvciBTV0lHVFlQRSAmLCBTV0lHVFlQRSAqIGFuZAogICAgICAgICAgICBTV0lHVFlQRVtBTlldIChKYXZhIGFuZCBDIykuCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgbWlub3IgdHlwZXNhZmUgZW51bSBpbXByb3ZlbWVudHMsIGluY2x1ZGluZyBzdG9yaW5nIHRoZSBuYW1lIG9mCiAgICAgICAgICAgIHRoZSBlbnVtIGl0ZW0uIFRoZSB0b1NyaW5nKCkgLyBUb1N0cmluZygpIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoaXMgbmFtZS4KCjA1LzMwLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgIC0gVXBkYXRlIGhvdyBleGFtcGxlcyBhbmQgdGhlIHRlc3Qgc3VpdGUgYXJlIGJ1aWx0LgoJICAgICAtIFN5bWJvbCBuYW1lcyBhcmUgbm8gbG9uZ2VyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlCgkgICAgIC0gQWRkZWQgdW5pb25fcnVubWUuc3MsIHdoaWNoIHdhcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gdGhlIGd1aWxlIG1vZHVsZQoKMDUvMjYvMjAwNDogbGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgQ29tbWl0dGVkIG9uIGJlaGFsZiBvZiBNYXJjZWxvICh3aG8gc3RpbGwgaGFzIHByb2JsZW1zIHdpdGggCgkgICAgdGhlIFNvdXJjZUZvcmdlIENWUy4pCgoJICAgIEFkZGVkIFB5dGhvbiB0eXBlbWFwcyBmb3IgRklMRSogd2l0aCAoUHl0aG9uLW9ubHkpIHRlc3QuCgo1LzI0LzIwMDQ6ICBkYW5jeQoKCSogQWxsZWdybyBDTCBtb2R1bGU6ICBOb3cgdXNpbmcgc29tZSBtYWNyb3MgKGRlZmluZWQgaW4KCUxpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZyksIHN3aWctZGVmY29uc3RhbnQgYW5kIHN3aWctZGVmdW4sIGZvcgoJZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBmb3JlaWduIGZ1bmN0aW9ucy4gIFRoaXMgbWFrZXMgdGhlCglnZW5lcmF0ZWQgZmlsZSBhIGJpdCBuZWF0ZXIuICAgIAoKCU5vdyBzdHJpcHMgYSBsYXllciBvZiBwYXJlbnRoZXNpcyBmcm9tIGNvbnN0YW50cy4KCglVc2VzICgqIDp2b2lkKSBpbnN0ZWFkIG9mIDpmb3JlaWduLWFkZHJlc3Mgbm93LgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVW5uYW1lZCBlbnVtIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gYWRkaXRpb24KICAgICAgICAgICAgdG8gdGhlIHJlY2VudGx5IGFkZGVkIHN1cHBvcnQgZm9yIHVubmFtZWQgZW51bSBtZW1iZXIgdmFyaWFibGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgZW51bSB7IGVudW0xLCBlbnVtMiB9IE1lbWJlckluc3RhbmNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMywgZW51bTQgfSBHbG9iYWxJbnN0YW5jZTsKCiAgICAgICAgICAgIFRoZSBpbnQgdHlwZW1hcHMgYXJlIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSBnZXQvc2V0IGFjY2Vzc29yIG1ldGhvZHMuCiAgICAgICAgICAgIElmIHRoZSBzaXplb2YgYW4gZW51bSBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcyBhbiBpbnQgdGhlbiBzZXR0aW5nIHRoZQogICAgICAgICAgICB2YXJpYWJsZSB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcgYXMgdGhlIGNhc3RzIGNhbm5vdCBiZSBlYXNpbHkgYW5kIHBvcnRhYmx5CiAgICAgICAgICAgIGdlbmVyYXRlZC4gSWYgeW91IG5lZWQgdG8gc29sdmUgdGhpcyBoaWdobHkgb2JzY3VyZSBzaXR1YXRpb24sIHdyaXRlCiAgICAgICAgICAgIHRoZSBhc3NpZ25tZW50IHVzaW5nIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEMjIGVudW0gd3JhcHBpbmcgbW9kcy4gU2ltaWxhciB0byB0aGUgSmF2YSBtb2R1bGUsIGVudW1zIGNhbiBiZSB3cmFwcGVkIHVzaW5nCiAgICAgICAgICAgIG9uZSBvZiAzIGFwcHJvYWNoZXM6CgogICAgICAgICAgICAxKSBQcm9wZXIgQyMgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlY3NlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgW05vIGltcGxlbWVudGF0aW9uIGRlZW1lZCBuZWNlc3NhcnkgZm9yIHR5cGUgdW5zYWZlIGVudW1zXS4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHByb3BlciBDIyBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEphdmEgZW51bSBzdXBwb3J0IGFkZGVkLiBUaGVyZSBhcmUgbm93IDQgd2F5cyBpbiB3aGljaCBlbnVtcyBjYW4gYmUgd3JhcHBlZDoKCiAgICAgICAgICAgIDEpIFByb3BlciBKYXZhIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBUeXBlIHVuc2FmZSBlbnVtcyAoY29uc3RhbnQgaW50ZWdlcnMpIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXVuc2FmZS5zd2ciCiAgICAgICAgICAgIDQpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlamF2YWVudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwcyB3aWxsIGhhbmRsZSBlbnVtcyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgc3BlY2lmaWVkIGluaXRpYWwKICAgICAgICAgICAgdmFsdWVzLCBmb3IgZXhhbXBsZSB0ZW4gaXMgc3BlY2lmaWVkOgoKICAgICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IHplcm8sIHRlbigxMCkgfTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBhbW91bnQgb2YgZ2VuZXJhdGVkIEphdmEgY29kZSBjYW4gYmUgY3V0IGRvd24sIGJ5IG1vZGlmeWluZyB0aGVzZSB0eXBlbWFwcwogICAgICAgICAgICBpZiBub25lIG9mIHRoZSBlbnVtcyBoYXZlIGluaXRpYWwgdmFsdWVzIChwcm9wZXIgSmF2YSBlbnVtcyBhbmQgdHlwZXNhZmUgZW51bXMgYXBwcm9hY2gpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgdHlwZXNhZmUgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggYnVnIHVzaW5nICVyZW5hbWUgb24gZW51bSBpdGVtcyBhbmQgd2hlbiB1c2luZwogICAgICAgICAgICAlamF2YWNvbnN0KDEpIC8gJWNzY29uc3QoMSkKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKE9iaikgT2JqZWN0OwogICAgICAgICAgICAgICAgZW51bSBHcmFtbWFyIHsgU3ViamVjdCwgT2JqZWN0IH07CgowNC8yOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE1pbm9yIGZpeGVzIHdoZW4gdXNpbmcgY29tYmluYXRpb25zIG9mIHRoZSAKICAgICAgICAgICAgamF2YWludGVyZmFjZXMsIGphdmFiYXNlLCBjc2ludGVyZmFjZXMgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCjA1LzE4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKVk0gbGluayBmYWlsdXJlIG9uIHNvbWUgc3lzdGVtcyBmaXhlZCB3aGVuIHVzaW5nIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgQWxzbyBhZGRzIGRlZmF1bHQgdmVjdG9yIGNvbnN0cnVjdG9yIGZvciB1c2UgZnJvbSBKYXZhLgoKMDUvMTcvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoKCSAgICBbR3VpbGVdIE5ldyBydW50aW1lIGZ1bmN0aW9ucyBTV0lHX1BvaW50ZXJBZGRyZXNzLAoJICAgIFNXSUdfUG9pbnRlclR5cGUsIFNXSUdfSXNQb2ludGVyT2ZUeXBlLCBTV0lHX0lzUG9pbnRlci4KCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHdyYXAgc2V2ZXJhbCBTV0lHIHJ1bnRpbWUgZnVuY3Rpb25zCgkgICAgYW5kIGV4cG9ydCB0aGVtIGludG8gdGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKS4gIFRoZQoJICAgIHJ1bnRpbWUgbW9kdWxlIGlzIG5vdyBidWlsdCB3aXRoICJtb2R1bGUiIGxpbmthZ2UuCgoJICAgIFtHdWlsZV0gR09PUFMgcHJveHkgb2JqZWN0cyBub3cgYWxzbyBwcmludCB0aGUgcG9pbnRlcgoJICAgIGFkZHJlc3Mgb2YgdGhlIEMgb2JqZWN0LgoKMDUvMTQvMjAwNDogbHlsZQogICAgICAgICAgICBBZGRlZCBLb3UncyBwYXRjaCBmb3IgdGhlIFJ1YnkgJWltcG9ydCBkaXJlY3RpdmUgc28gdGhhdCBtb2R1bGVzCiAgICAgICAgICAgIHdpdGggIm5lc3RlZCIgbmFtZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkuIENvbnNpZGVyIGFuIGludGVyZmFjZQogICAgICAgICAgICBmaWxlIGZvby5pIHRoYXQgaGFzIHRoaXMgJW1vZHVsZSBkZWNsYXJhdGlvbiBhdCBpdHMgdG9wOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIm1pc2M6OnRleHQ6OmZvbyIKCiAgICAgICAgICAgIE5vdyBjb25zaWRlciBhbm90aGVyIGludGVyZmFjZSBmaWxlIHNwYW0uaSB0aGF0IGltcG9ydHMgZm9vLmk6CgogICAgICAgICAgICAgICAgJWltcG9ydCBmb28uaQogICAgICAgICAgICAKICAgICAgICAgICAgQmVmb3JlIHRoaXMgcGF0Y2gsIHRoaXMgd291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29kZSBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIHNwYW1fd3JhcC5jOgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2M6OnRleHQ6OmZvbyIpOwoKICAgICAgICAgICAgV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UnbGwgZ2V0IHRoZSBjb3JyZWN0IHBhdGggbmFtZQogICAgICAgICAgICBmb3IgdGhlIGNhbGwgdG8gcmJfcmVxdWlyZSgpLCBlLmcuCgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYy90ZXh0L2ZvbyIpOwoKICAgICAgICAgICAgU2VlIFNvdXJjZUZvcmdlIEJ1ZyAjOTI4Mjk5LgoKMDUvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZm9yIGVtaXR0aW5nIGRpcmVjdG9ycyB3aGVuICVmZWF0dXJlKCJkaXJlY3RvciIpIHNwZWNpZmllZAogICAgICAgICAgICBmb3IgYSBjbGFzcyB3aXRoIG5vIHZpcnR1YWwgbWV0aG9kcywgYnV0IGRvZXMgaGF2ZSBhIHZpcnR1YWwgZGVzdHJ1Y3Rvci4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEtldmluIFNtaXRoLgoKMDUvMDYvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBTV0lHIHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUHJldHR5TmFtZSwgd2hpY2ggCgkgICAgcmV0dXJucyBhbiB1bm1hbmdsZWQgdHlwZSBuYW1lIGZvciBhIHN3aWdfdHlwZV9pbmZvCgkgICAgb2JqZWN0LiAKCgkgICAgW0d1aWxlXTogVXNlIGl0IGZvciBwcmludGluZyBwb2ludGVyIG9iamVjdHMuCgowNS8wMy8yMDA0OiAgZGFuY3kgKEFobW9uIERhbmN5KQoKCSogTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnOiAgVXBkYXRlZCBjb21tZW50cyBhYm91dCBpZGVudGlmZXIKCWNvbnZlcnNpb24uICAKCgkqIFNvdXJjZXMvTW9kdWxlcy9hbGxlZ3JvY2wuY3h4OiAgUmVnaXN0ZXIgL2Rldi9udWxsIGZvciAiaGVhZGVyIgoJdGFyZ2V0LiAgIEFsc28sIGRpc3JlZ2FyZCAiY29uc3QiIHF1YWxpZmllcnMgZHVyaW5nIHR5cGUKCWNvbnZlcnNpb24uICAKCgkKMDUvMDIvMjAwNDogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEZpeCBidWcgNzgyNDY4LgoJICAgIFRvIGZpeCB0aGlzIGJ1ZywgdGhlIHJ1bnRpbWUgY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4sIGFuZAoJICAgIHBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgYSBDX1NXSUdfUE9JTlRFUl9UWVBFLgoKCSAgICBDaGlja2VuIHZlcnNpb24gPiAxLjQwIGlzIG5vdyByZXF1aXJlZCEKCgkgICAgKiBUeXBlbWFwIGluY29tcGF0aWJpbGl0eTogIHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgY2hpY2tlbl93b3Jkcy4KCSAgICAgIElmIGEgdHlwZW1hcCBuZWVkcyBzb21lIHNwYWNlLCBpdCBzaG91bGQganVzdCBjYWxsIENfYWxsb2MKCgkgICAgKiBhcmdvdXQgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSB0aGUgLyogaWYgT05FICovIGNvbnN0cnVjdCB0bwoJICAgICAgYnVpbGQgYW4gb3V0cHV0IGxpc3QuICBBIFNXSUdfQVBQRU5EX1ZBTFVFIG1hY3JvLCBleGFjdGx5IGxpa2UKCSAgICAgIGd1aWxlIGFuZCBtenNjaGVtZSBpcyBub3cgdXNlZC4KCjA0LzI1LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIHRoZSBnZW5lcmF0ZWQgR09PUFMgY29kZSwgZG9uJ3QgY3JlYXRlIG1ldGhvZHMKCSAgICB0aGF0IHdvdWxkIG5vdCBzcGVjaWFsaXplIGFueSBhcmd1bWVudHM7IHNpbXBseSByZS1leHBvcnQKCSAgICB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucy4gIChUaGlzIGlzIGEgcGVyZm9ybWFuY2UKCSAgICBvcHRpbWl6YXRpb24gd2hpY2ggcmVkdWNlcyBsb2FkIHRpbWUgYW5kIGV4ZWN1dGlvbiB0aW1lLikKCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZml4IHRoZSAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIiBlcnJvcgoJICAgIHdoaWNoIHdhcyBjYXVzZWQgYnkgYW4gaW5jb21wYXRpYmxlIHN3aWdfdHlwZV9pbmZvIGxheW91dC4KCgkgICAgW0d1aWxlXSBUaGUgdHlwZW1hcCBmb3IgRklMRSAqIGluIHBvcnRzLmkgbm93IGFsc28gYWNjZXB0cwoJICAgIGEgcmVndWxhciBGSUxFICogcG9pbnRlciBvYmplY3QuICBBbHNvIGEgYnVnIHdpdGggU2NoZW1lCgkgICAgZmlsZSBwb3J0cyB0aGF0IGFyZSBvcGVuIGZvciBpbnB1dCBhbmQgb3V0cHV0IGhhcyBiZWVuCgkgICAgZml4ZWQuIAoKMDQvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlIGVudHJ5IDAzLzIxLzIwMDQgcmV2b2tlZC4gVGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGFub3RoZXIKICAgICAgICAgICAgaW5jb25zaXN0ZW5jeSAocmVmZXJlbmNlIHR5cGVtYXBzIGJlaW5ncyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlciB0eXBlbWFwcyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHN0YXRpYwogICAgICAgICAgICBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIGZvciBzb21lIGxhbmd1YWdlcywKICAgICAgICAgICAgYnV0IG9ubHkgZm9yIEMrKyBhbmQgbm90IEMpLiBUaGlzIHdvdWxkIGJyZWFrIHVzZXIncyBjdXJyZW50CiAgICAgICAgICAgIHR5cGVtYXBzIGFuZCBpbnRyb2R1Y2UgZnVydGhlciBpbmNvbnNpc3RlbmNpZXMuIEFsdGVybmF0aXZlCiAgICAgICAgICAgIHNvbHV0aW9uIHJlcXVpcmVkIGFuZCBiZWluZyBkaXNjdXNzZWQuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIEFkZGVkIHRoZSAtZGlyZWN0b3JzIGZsYWcuIFRoaXMgZW5hYmxlcyB0aGUgZGlyZWN0b3IKCSAgICBtb2RlIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBhbGwgdGhlIGNsYXNzZXMgdGhhdAoJICAgIGRvbid0IHNldCB0aGUgImZlYXR1cmU6bm9kaXJlY3RvciIgZXhwbGljaXRseS4KCgkgICAgWW91IGNhbiB1c2UgdGhpcyBpbiB5b3VyIG1vZHVsZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlCgkgICAgZGlyZWN0b3IgZmVhdHVyZSBpbiBhbGwgeW91ciBjbGFzc2VzLCBidXQgaXQgaXMgbW9zdAoJICAgIGludGVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBsaWtlOgoKCSAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoKCSAgICBUaGVzZSBjb21tYW5kcyB3aWxsIHJ1biB0aGUgZW50aXJlIHRlc3Qtc3VpdGUgdXNpbmcKCSAgICBkaXJlY3RvcnMsIGFuZCBub3Qgb25seSB0aGUgc3BlY2lmaWMgJ2RpcmVjdG9yc18qJwoJICAgIGNhc2VzLiBUaGlzIHNob3VsZCBiZSBkb25lIGZyb20gdGltZSB0byB0aW1lLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QsCgkgICAgZm9yIGNvbXBpbGVyIGFuZCBweXRob24gdmVyc2lvbnMgdGhhdCBzdXBwb3J0IHRoZW0uCgkgICAgCgkgICAgV2hlbiBuZWVkZWQsIHVzZSAKCgkgICAgICVpbmxjdWRlIHN0ZF9zdHJpbmcuaSAgICAgIC8vICdjaGFyJyBzdHJpbmdzCgkgICAgICVpbmxjdWRlIHN0ZF93c3RyaW5nLmkgICAgIC8vICd3Y2hhcl90JyBzdHJpbmdzCgkgICAgCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEZpeCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgKHNlZy4gZmF1bHQpIHdoZW4gYW4KCSAgICBpbnBsYWNlIG9wZXJhdG9yICgrPSwtPSwuLi4pIHdhcyB3cmFwcGVkLCBhcyByZXBvcnRlZCBieQoJICAgIEx1Y3JpeiAobHVjcml6QHNpdGlsYW5kaWEuaXQpLCB3aGVuIHRoZSBtb3N0IGNvbW1vbgoJICAgIGZvcm0gd2FzIHVzZWQ6CgogICAgICAgICAgICAgICAgICAgQSYgIEE6Om9wZXJhdG9yKz0oaW50IGkpIHsgLi4uOyByZXR1cm4gKnRoaXM7IH0KICAgICAgICAgICAgICAgICAgXl5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgoJICAgIAoKCSAgICBpZSwgYW4gb2JqZWN0IGlzIHJldHVybmVkIGFuZCBpdHMgY29udGFpbnMgdGhlIHNhbWUgJ3RoaXMnCgkgICAgdmFsdWUgdGhhbiB0aGUgaW5wdXQgb2JqZWN0LCB3aGljaCBpcyBkZWxldGVkIGFmdGVyIHRoZQoJICAgIG9wZXJhdGlvbiAiYSArPSBiIiwgbGVhdmluZyB0aGUgcmVzdWx0IHdpdGggbm8gcmVhbAoJICAgIG9iamVjdCwgYnV0IGEgc2VnLiBmYXVsdC4KCgkgICAgVG8gZml4IGl0LCB3ZSBuZWVkZWQgdG8gaW50cm9kdWNlIGEgbmV3IGZlYXR1cmUgYW5kIHVzZSBhbgoJICAgIG9sZCBvbmU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IikgQTo6b3BlcmF0b3IrPTsKCSAgICAKCSAgICBoZXJlLCAic2VsZjpkaXNvd24iIGRpc2FibGUgdGhlIG93bmVyc2hpcCBvZiB0aGUgJ3NlbGYnCgkgICAgb3IgaW5wdXQgb2JqZWN0LCBhbmQgdGhlICJuZXciIGZlYXR1cmUgdHJhbnNmZXJzIHRoZQoJICAgIG93bmVyc2hpcCB0byB0aGUgcmVzdWx0IG9iamVjdC4KCSAgICAKCSAgICBUaGUgZmVhdHVyZS9zb2x1dGlvbiBjb3VsZCBhbHNvIGJlIHVzZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCB1c2UgZ2MgYW5kIGltcGxlbWVudCB0aGUgaW5wbGFjZSBvcGVyYXRvcnMsIG9yIG90aGVyCgkgICAgb3BlcmF0b3JzLCBpbiBhIHNpbWlsYXIgd2F5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFB5dGhvbiBNT0RVTEUgKioqCgoJICAgIElmIHlvdSBhbHJlYWR5IGFyZSB1c2luZyB0aGUgaW5wbGFjZSBvcGVyYXRvcnMgaW4gcHl0aG9uLAoJICAgIGFuZCB5b3UgaW1wbGVtZW50ZWQgc29tZSBraW5kIG9mIHdvcmthcm91bmQgdG8gdGhlIHByb2JsZW0KCSAgICBmaXhlZCBoZXJlLCBpdCBpcyBwb3NzaWJsZSB5b3UgY291bGQgZW5kIHdpdGggJ2ZyZWUnCgkgICAgb2JqZWN0cyB0aGF0IG5ldmVyIGdldCBkZWxldGVkLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBhbmQKCSAgICB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjdXJyZW50IGZpeCwgdXNlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIiwiIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIsIiIpIEE6Om9wZXJhdG9yKz07CgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQysrIGVudW1zIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBpbnRlZ2VycywgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgCiAgICAgICAgICAgIEMjIGVudW1zLiBGb3IgRXhhbXBsZSwgZ2l2ZW4gQysrOgoKICAgICAgICAgICAgICAgIGVudW0gQW5FbnVtIHsgZm9vLCBiYXIgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgQW5FbnVtIEFuRW51bWVyYXRpb247CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtZXJhdGlvbiBmKTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBlbnVtIEFuRW51bSB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW0gZikgey4uLn0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBhIGdsb2JhbCBlbnVtIGxpa2UgQW5FbnVtIGFib3ZlIGlzIGdlbmVyYXRlZCBpbnRvIGl0cyBvd24KICAgICAgICAgICAgZmlsZSBjYWxsZWQgQW5FbnVtLmNzLiBFbnVtcyBkZWZpbmVkIHdpdGhpbiBhIEMrKyBjbGFzcyBhcmUgZGVmaW5lZAogICAgICAgICAgICB3aXRoaW4gdGhlIEMjIHByb3h5IGNsYXNzLiBTb21lIG9mIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nIEMjIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMgYWxzbyB3b3JrIGZvciBlbnVtcy4gRm9yIGV4YW1wbGUgZ2xvYmFsIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2ltcG9ydHMpIHRvIGFkZCBpbiBleHRyYSB1c2luZyBzdGF0ZW1lbnRzLgoKICAgICAgICAgICAgR2xvYmFsIGVudW1zIGFuZCBjbGFzcyBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgdG8gbWFrZSB0aGUgZW51bSBwcml2YXRlLCBwdWJsaWMgZXRjLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZW51bSB0eXBlIChlbnVtIGJhc2UpCgogICAgICAgICAgICBJZiB3ZSBhZGQgdGhpcyBmb3IgdGhlIGFib3ZlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgQW5FbnVtICJwcm90ZWN0ZWQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIEFuRW51bSAibG9uZyIKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb3RlY3RlZCBlbnVtIEFuRW51bSA6IGxvbmcgewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBlbXB0eSBlbnVtcywgbGlrZQogICAgICAgICAgICAgICAgZW51bSBGb28ge307CgowMy8yMS8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW05vdGU6IHRoaXMgY2hhbmdlIHJldm9rZWQgb24gMDQvMjUvMjAwNF0KCSAgICBbUHl0aG9uXSBNYWtlcyB0aGUgZm9sbG93aW5nICd2YXInIGNhc2VzIG1vcmUgdW5pZm9ybToKCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBnYTsKIAogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2E7CiAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBub3cgdGhlIHRocmVlIHZhcmlhYmxlcyAoZ2EsIHNhLCBtYSkgY2FuIGJlIGFzc2lnbmVkIGFzOgoKCiAgICAgICAgICAgICAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBBLnNhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgYS5tYSA9ICJoZWxsbyI7CgogICAgICAgICAgICBpZSwgbm93ICdtYScgd2lsbCBhbHNvIHVzZSBhIHN0ZDo6c3RyaW5nIHR5cGVtYXAgJ2luJyBpZgogICAgICAgICAgICBkZWZpbmVkLCBiZWZvcmUgaXQgd2FzIG9ubHkgYWNjZXB0aW5nIGEgJ3Bfc3RkX3N0cmluZycKICAgICAgICAgICAgcG9pbnRlci4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgJ21hJyB3aWxsIG5vdCB1c2UgdGhlCiAgICAgICAgICAgICd2YXJpbi92YXJvdXQnIHR5cGVtYXBzICh0aGF0IHByb2JhYmx5IGNvdWxkIGJlIG1vcmUKICAgICAgICAgICAgbmF0dXJhbCksIGJ1dCBpdCB3aWxsIHBpY2sgdXAgdGhlICdpbicgdHlwZW1hcCBmb3IgY29uc3QKICAgICAgICAgICAgc3RkOjpzdHJpbmcmICh3aGljaCBpcyBlYXNpZXIpLgoKCSAgICBUaGUgY2hhbmdlcyBpbiBjd3JhcC5jIGFuZCBsYW5nLmN4eCB3aWxsIHByb2JhYmx5IGZpeCB0aGUKCSAgICBiZWhhdmlvdXIgaW4gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IG92ZXJsb2FkIHRoZQoJICAgIG1lbWJlcnZhckhhbmRsZXIgbWV0aG9kICJ0b28gbXVjaCIuCiAKICAgICAgICAgICAgCjAzLzIxLzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIERpc2FibGluZyB0aGUgZGVmYXVsdCBpbnN0YW50aWF0aW9ucyBsaWtlOgoKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxpbnQsaW50PjsKCiAgICAgICAgICAgIGZvciBhbGwgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgU1RMIGNvbnRhaW5lcnMvY2xhc3Nlcy4KCSAgICBUaGV5IGFyZSBleHBlbnNpdmUsIHNwZWNpYWxseSBmb3IgcGFpciBhbmQgbWFwLCBhbmQgdGhlCgkgICAgcHJldmlvdXMgYmVoYXZpb3VyIGFsc28gcmVxdWlyZXMgdGhlIHVzZXIgdG8gcGVyZm9ybQoJICAgIG1hbnVhbCBpbnN0YW50aWF0aW9ucy4gU3RpbGwsIGlmIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGlzCgkgICAgbm90IGltcG9ydGFudCwgaXQgY2FuIGJlIHJlLWVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIG1hY3JvCgkgICAgU1dJR19TVERfREVGQVVMVF9JTlNUQU5USUFUSU9OIChzZWUgc3RkX2NvbW1vbi5pKS4KCgkgICAgQWxzbywgbm9ybWFsaXppbmcgdGhlIElOUFVUL09VVFBVVC9JTk9VVCB0eXBlbWFwcy4gTm93CgkgICAgdGhleSB1c2UgdGhlIHNhbWUgY29udmVyc29ycyB0aGFuIHRoZSByZXN0IG9mIHRoZQoJICAgIHR5cGVtYXBzLCBhbmQgeW91IGNhbiB1c2UgdGhlbSBmb3Igc3RkOjpwYWlyLCBzdGQ6OnN0cmluZwoJICAgIGFuZCBhbGwgdGhlIG90aGVyIFNUTCB0eXBlcywgbGlrZSBpbjoKCgkgICAgICB2b2lkIHBfaW5vdXRkKHN0ZDo6cGFpcjxkb3VibGUsIGRvdWJsZT4gKklOT1VUKTsKCgkgICAgQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGFuZCBpbXBsaWNpdC5pIGZpbGVzIHdpdGggbWFjcm9zIHRvCgkgICAgdHJhbnNmb3JtIGZ1bmN0aW9ucyBwYWlycyBsaWtlICdzZXRfeCcvJ2dldF94JyAKCSAgICAob3IgJ1QmIHgoKScvJ2NvbnN0IFQmIHgoKSBjb25zdCcpIGludG8gYW4gYXR0cmlidXRlLAoJICAgIGFuZCBhbGxvd2luZyB0aGUgdXNlIG9mIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBpbiB0eXBlbWFwcwoJICAgIChzZWUgdGhlIGZpbGVzIGZvciBtb3JlIGRldGFpbHMpLgoKMDMvMjEvMjAwNDogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZ3Mgb2YgZnVuY3Rpb25zIHdpdGgKCSAgICBhbm9ueW1vdXMgYXJndW1lbnRzLgoKMDMvMTgvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gTW9yZSBnZW5lcmFsIHN0ZF9zdHJpbmcuaSBpbnRlcmZhY2UuCgkgICAgTm93IHlvdSBjYW4gd3JhcCBpdCB1c2luZwoKCSAgICAgICV0ZW1wbGF0ZShzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OwoKICAgICAgICAgICAgYW5kIHVzZSB0aGUgc3RkOjpzdHJpbmcgYXMgYSBiYXNlIGNsYXNzOgoKCSAgICAgIHN0cnVjdCBBIDogc3RkOjpzdHJpbmcgewogICAgICAgICAgICAgIH07CgoJICAgIEJ1dCBtb3JlIGltcG9ydGFudCwgc3dpZyB3aWxsIHJlY29nbml6ZSAKCSAgICBib3RoIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+IGFuZCBzdGQ6OnN0cmluZyBhcwoJICAgIHRoZSBzYW1lIHR5cGUuCgowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBQcmV2aW91c2x5IGFkZGVkLCBidXQgbm90IG1lbnRpb25lZCBiZWZvcmU6CgoJICAgIC0gZnJpZW5kIGRlY2xhcmF0aW9uIHN1cHBvcnQsIHN3aWcgbm93IGVtaXRzIGEgZ2xvYmFsCgkgICAgICBmdW5jdGlvbiBpbiB0aGUgc2FtZSBjbGFzcyBzY29wZS4KCgkgICAgLSByZWYvdW5yZWYgZmVhdHVyZXM6IHRvIG1peCByZWYgY291bnRpbmcgQysrIGNsYXNzZXMKCSAgICAgIGFuZCBuYXRpdmUgc2NyaXB0IHJlZiBjb3VudGluZyBtZWNoYW5pc21zIChsaWtlIGluIHB5dGhvbikuCgkgICAgCgkgICAgICBVc2UgaXQgbGlrZToKCiAJICAgICAgICAlZmVhdHVyZSgicmVmIikgICBSQ09iaiAiJHRoaXMtPnJlZigpOyIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ1bnJlZiIpIFJDT2JqICIkdGhpcy0+dW5yZWYoKTsiCgoJICAgICAgQW5kIHRoZSBjbGFzcyBSQ09iaiwgYW5kIGFsbCB0aGUgZGVyaXZlZCBvbmVzLCB3aWxsCgkgICAgICBwZXJmb3JtIHRoZSByaWdodCByZWYvdW5yZWYgY2FsbHMgd2hlbiBhIG5ldyBwb2ludGVyICAKCSAgICAgIGlzIHJldHVybmVkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIG9yIHdoZW4gdGhlIHRhcmdldAoJICAgICAgbGFuZ3VhZ2UgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZSBvYmplY3QuCgkgICAgICAKCSAgICAgIFNlZSB0aGUgcmVmY291bnQuaSBmaWxlIGluIHRoZSB0ZXN0LXN1aXRlIGZvciBtb3JlCgkgICAgICBkZXRhaWxzLgoKCSAgICAKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gVXNpbmcgdGhlIG5ldyAlZnJhZ21lbnQgc3VwcG9ydCwgbWFqb3IgcmV3cm90ZSAKCSAgICBvZiB0aGUgcHl0aG9uIHN3aWcgbGlicmFyeSwgaW5jbHVkaW5nOgoKCSAgICAtIEFsbW9zdCBhdXRvbWF0aWMgdGVtcGxhdGUvdHlwZW1hcCBpbnN0YW50aWF0aW9uIGZvcgoJICAgICAgdGhlIFNUTCBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgbm93IHlvdSBjYW4gd3JpdGU6CgoJCSAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgYW5kIGEgc3BlY2lhbGl6ZWQgdmVjdG9yX2kgY2xhc3MgaXMgZW1pdHRlZCB3aXRoIGFsbAoJICAgICAgdGhlIG5lZWRlZCB0eXBlbWFwcy4gTm8gbmVlZCB0byB1c2UgdGhlIG9sZAoJICAgICAgJ3NwZWNpYWxpemVfdmVjdG9yJyBtYWNyb3MuCgoJICAgICAgTm90ZSB5b3UgY2FuIGFsc28gZGVmaW5lCgoJICAgICAgICAgICV0ZW1wbGF0ZShtYXRyaXhfaSkgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID47CgkgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9waWkpIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsaW50PiA+OwoKCSAgICAtIFRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogCSAKICAgICAgICAgICAJICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIGRlZmluZXMgdGhlIHZlY3RvciB0eXBlbWFwcywgYnV0IG5vIHByb3h5IGNsYXNzLiBGb3IgYWxsIHRoZQogICAgICAgICAgICAgIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBhcmUKICAgICAgICAgICAgICBkZWZpbmVkLCBzbywgeW91IGNhbiBzYXkKCgkgICAgICAlaW5jbHVkZSBzdGRfdmVjdG9yCgoJICAgICAgaW50IGZ1bmMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYSk7CgkgICAgICAKCSAgICAgIHdoZXJlIHRoZSBwcm9wZXIgdHlwZW1hcCBpcyBhcHBsaWVkIHRvICdhJywgYnV0IG5vCgkgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHByb3h5IGlzIGdlbmVyYXRlZC4KCSAgICAgIAoKICAgICAgICAgICAgLSBBbGwgdGhlIFNUTCBjb250YWluZXJzIHByZXNlbnQgYSBtb3JlIHVuaWZvcm0gYmVoYXZpb3IgYW5kCgkgICAgICBtb3JlIGNvbXBsZXRlIGludGVyZmFjZSBkZWNsYXJhdGlvbi4gVGhlIGZvbGxvd2luZyBhcmUgCgkgICAgICBub3cgc3VwcG9ydGVkOgoKCQkgIHN0ZDo6dmVjdG9yPFQ+CgkJICBzdGQ6Omxpc3Q8VD4KCQkgIHN0ZDo6ZGVxdWU8VD4KCQkgIHN0ZDo6c2V0PFQ+CgkJICBzdGQ6Om11bHRpc2V0PFQ+CgkJICBzdGQ6Om1hcDxUPgoJCSAgc3RkOjptdWx0aW1hcDxUPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIG5vdCBhIGNvbnRhaW5lciwgYnV0IGFsc28gc3VwcG9ydGVkOgoKCQkgIHN0ZDo6cGFpcjxULFU+CgogICAgICAgICAgICAgIGFsc28sIG1vcmUgdHlwZW1hcHMgYXJlIGRlZmluZWQgZm9yIGFsbCBvZiB0aGVtLAoJICAgICAgaW5jbHVkaW5nIHZhcmluLCB2YXJvdXQsIHR5cGVjaGVjaywgZXRjLgoKICAgICAgICAgICAgLSBJbml0aWFsIGF0dGVtcHQgdG8gaW1wbGVtZW50IHRoZSBTVEwgY29udGFpbmVycwogICAgICAgICAgICAgIGNvbnNpZGVyaW5nIGFsbG9jYXRvcnMsIGllOgoKCSAgICAgICAgICBzdGQ6OnZlY3RvcjxULEE+CQkJCgoJICAgICAgaXQgaXMgcGFydGlhbGx5IHdvcmtpbmcsIGJ1dCBpdCBpcyBqdXN0IGEgd29ya2Fyb3VuZAoJICAgICAgd2hpbGUgc3dpZyBpbXByb3ZlcyBpdHMgdGVtcGxhdGUgdHlwZSBzdXBwb3J0LgoJICAgICAgCgkgICAgICAKCSAgICAgUGxlYXNlIHRlc3Qgd2l0aCB5b3VyIHBhcnRpY3VsYXIgc2V0dXAuIEl0IHNlZW1zIHRvIGJlCgkgICAgIHdvcmtpbmcgd2l0aCBnKysgMy4yLjIsIGcrKyAyLjk2LCBJbnRlbCBpY2MgYW5kIFNHSSBDQwoJICAgICBjb21waWxlcnMsIHBsdXMgcHl0aG9uIDEuNS4yLCAyLjAgYW5kIDIuMywgYnV0IHNpbmNlCgkgICAgIHdlIGFyZSB1c2luZyB0ZW1wbGF0ZXMsIHRoZXJlIGlzIGEgY2hhbmNlIHlvdSBjYW4gZmluZAoJICAgICBzb21lIHByb2JsZW1zIHdoZW4gdXNpbmcgd2l0aCBhbiBvbGQgQysrIGNvbXBpbGVyLgoKMDMvMTYvMjAwNDogbW1hdHVzCgogICAgICAgICAgICAtIEFsbG93aW5nIHRoZSBlbXB0eSAldGVtcGxhdGUgZGlyZWN0aXZlLCBzdWNoIGFzCgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgdG8gcHJvY2VzcyB0aGUgY2xhc3MgInR5cGVkZWYicyBhbmQgInR5cGVtYXAicy4gQmVmb3JlCgkgICAgICBvbmx5IHRoZSBpbnRlcm5hbCAidHlwZWRlZiJzIHdlcmUgcHJvY2Vzc2VkLgoKICAgICAgICAgICAgICBUaGlzIG1ha2VzIHBvc3NpYmxlIHRvIGVtaXQgdGhlIGRlZmF1bHQgaW4vb3V0CiAgICAgICAgICAgICAgdHlwZW1hcHMgd2l0aG91dCB0aGUgbmVlZCBvZiB3cmFwcGluZyBhbiBzcGVjaWFsaXplZAogICAgICAgICAgICAgIHZlY3RvciBpbnN0YW5jZS4KCgkgICAgLSBBZGRpbmcgdGhlIHByZXByb2Nlc3NvciBleHRlbnNpb24gI0Agd2hpY2ggbWFuZ2xlcyB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgbWFjcm8gYXJndW1lbnQsIGxpa2UgaW46CgogICAgICAgICAgICAgICAgI2RlZmluZSBtYWNybyhYKSAgI0BYCiAgICAgICAgICAgICAgICBtYWNybyhpbnQpICAgICAgICAgLT4gaW50CiAgICAgICAgICAgICAgICBtYWNybyhzdGQ6OnN0cmluZykgLT4gc3RkX3Nfc19zdHJpbmcKICAgICAgICAgICAgICAgIAoJICAgIC0gRnJhZ21lbnRzIGNhbiBub3cgYmUgInR5cGUgc3BlY2lhbGl6ZWQiLCBhcyB0aGUgdHlwZW1hcHMuIFRoZQoJICAgICAgc3ludGF4IGlzIGFzIGZvbGxvd3MKIAogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiwiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogYSB0eXBlIGluZGVwZW5kZW50IGZyYWdtZW50IChvbGQgc3ludGF4KSAqLyB9CiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiIHtUeXBlfSwgImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIHRoZSBmcmFnbWVudCBpcyB0eXBlIGRlcGVuZGVudCAqL30KIAogICAgICAgICAgICAgIE5vdyBmcmFnbWVudHMgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzOiAKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICVmcmFnbWVudCgiaW5jb2RlIntBPFQ+fSwiaGVhZGVyIikgewoJCSAgICAgIC8qICdpbmNvZGUnIHNwZWNpYWxpemVkIGZyYWdtZW50ICovCgkJICAgfQogCgkJICAgJXR5cGVtYXAoaW4sZnJhZ21lbnQ9ImluY29kZSJ7QTxUPn0pIHsKCQkgICAgICAvKgoJCSAgICAgICAgIGhlcmUgd2UgdXNlIHRoZSAndHlwZSBzcGVjaWFsaXplZCcgCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCAiaW5jb2RlIntBPFQ+fQogICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgfQogICAgICAgICAgICAgICAgfTsKCQkJICAgICAJCgowMy8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIGJ1ZyB3aGljaCBtZWFudCB0aGF0IHNvbWUgdmlydHVhbCBmdW5jdGlvbnMgb3ZlcnJpZGRlbiBpbgogICAgICAgICAgICBKYXZhIHdlcmUgbm90IGJlaW5nIGNhbGxlZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiBCdWcgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgICAgICAgICAgIGJ5IFJvYmVydCBkZSBWcmllcyBhbmQgU2NvdHQgTWljaGVsLgoKMDMvMDIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2hlY2sgdGhlIHR5cGUgb2Ygc3RyaW5nIGFyZ3VtZW50cy4KCjAyLzI0LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW5hbWVzcGFjZSA8bmFtZT4uIFRoaXMgYWxsb3dzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIGEgQyMgbmFtZXNwYWNlIGludG8gd2hpY2ggYWxsIEMjIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KCjAyLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkgCgkgICAgW016U2NoZW1lXSBVc2UgRlVOQ19OQU1FIHJhdGhlciB0aGFuIGEgYm9ndXMgdHlwZW1hcCB2YXJpYWJsZSBmb3Igc2lnbmFsbGluZwoJICAgIGVycm9ycy4gIENhbGwgc2NoZW1lX3dyb25nX3R5cGUgd2l0aCBhIHplcm8tYmFzZWQgYXJndW1lbnQgbnVtYmVyLiAgCgkgICAgUmVwb3J0ZWQgYnkgT25kcmVqIFBhY292c2t5LCBTRiAjOTAyNjIxLgoKCSAgICBbR3VpbGVdIERlZmluZSBGVU5DX05BTUUgYWxzbyBpbiB0aGUgZGlzcGF0Y2ggd3JhcHBlciBmb3Igb3ZlcmxvYWRlZAoJICAgIGZ1bmN0aW9ucy4gIFBhdGNoIGJ5IEpvaG4gTGVueiwgU0YgIzg5NjI1NS4KCjAyLzIyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgdHJ5IHRvIGludm9rZSBhIG51bGwgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KCjAyLzIwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBzbyB0aGF0IHRoZSBTV0lHIHNvdXJjZSB3aWxsIGNvbXBpbGUgdXNpbmcgdGhlIERpZ2l0YWwgTWFycyBDb21waWxlcgogICAgICAgICAgICAoZm9ybWVybHkgU3ltYW50aWMgY29tcGlsZXIpIG9uIFdpbmRvd3MuIFN1Ym1pdHRlZCBieSBTY290dCBNaWNoZWwuCgowMi8xMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBOZXcgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1ub2luaXQuICBVc2UgaXQgZm9yIGJ1aWxkaW5nCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyeSwgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIGZ1bmN0aW9ucwoJICAgIHNjaGVtZV9pbml0aWFsaXplIGV0Yy4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTc1NC4KCgkgICAgW016U2NoZW1lXSBEb24ndCBwcm9kdWNlIGludmFsaWQgQyBjb2RlIHdoZW4gaW52b2tlZCB3aXRoIHRoZQoJICAgIC1kZWNsYXJlbW9kdWxlIG9wdGlvbi4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTEwOC4KCSAgICAKCSAgICBbR3VpbGVdIEJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcnkgd2l0aCBwYXNzaXZlIGxpbmthZ2UsIHRvIHJlbmFtZQoJICAgIHRoZSBTV0lHX2luaXQgZnVuY3Rpb24gdW5pcXVlbHkuCgowMi8xMi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCBzdWJtaXR0ZWQgYnkgQmlsbCBIb2ZmbWFuIHdoaWNoIHByZXZlbnRzIFNXSUcgZnJvbSBjcmFzaGluZwogICAgICAgICAgICB3aGVuIGEgZmlsZSBmb3IgdGhlIHR5cGV3cmFwcGVyIGNsYXNzIGNhbm5vdCBiZSBvcGVuZWQuCgowMi8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBPdmVybG9hZGluZyBjaGFuZ2VzOgogICAgICAgICAgICAgIC0gTWV0aG9kcyB3aGljaCBhcmUgb3ZlcmxvYWRlZCBpbiBjb25zdCBvbmx5IG5vIGxvbmdlciBnZW5lcmF0ZSBKYXZhCiAgICAgICAgICAgICAgICBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZSAtIHRoZSBmaXJzdCBtZXRob2QgcGFyc2VkIGlzIHVzZWQgYW5kIGEKICAgICAgICAgICAgICAgIHdhcm5pbmcgaXMgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGljaCBhbHdheXMgdXNlcyB0aGUgbm9uLWNvbnN0IG1ldGhvZC4KICAgICAgICAgICAgICAtIFdhcm5pbmcgbWVzc2FnZXMgNTA5IGFuZCA1MTIgcmVwbGFjZWQgYnkgbmV3IHdhcm5pbmcgbnVtYmVyIDUxNiwgd2hpY2ggCiAgICAgICAgICAgICAgICBpcyBtb3JlIHJlbGV2YW50IHRvIHRoZXNlIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIGFzIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgICAgICBtZXRob2RzIGFyZW4ndCAnc2hhZG93ZWQnLCB0aGV5IGFyZSBpZ25vcmVkLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVwbGFjZSB0aGUgImtub3duX2NsYXNzZXMiIGhhc2ggdGFibGUgYnkgYSBub2RlCgkgICAgYXR0cmlidXRlLiAgTWV0aG9kcyBvZiBjbGFzc2VzIGluIEMrKyBuYW1lc3BhY2VzIG5vdyBnZXQKCSAgICB0aGUgcHJvcGVyIHNwZWNpYWxpemVyIGluIHRoZSBHT09QUyBkZWNsYXJhdGlvbi4KCSAgICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFVuaXF1aWZ5IHRoZSBhcmd1bWVudCBuYW1lcyBpbiBHT09QUyBzaGFkb3cgbWV0aG9kCgkgICAgZGVjbGFyYXRpb25zLiAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMS8yMDA0OiBzdW5zaGluZSAoRXJpYyBTdW5zaGluZSkKICAgICAgICAgICAgUmV2aXZlZCB0aGUgTmV4dFN0ZXAgcG9ydCBvZiBTV0lHLgoKICAgICAgICAgICAgRml4ZWQgZmF0YWwgcHJvYmxlbSBpbiBEb2hTdHJzdHIoKSBjYXVzZWQgYnkgZGlmZmVyZW5jZSBpbiBzdHJzdHIoKQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYWRlICVhcHBseSBiZWNvbWUgZW50aXJlbHkgZHlzZnVuY3Rpb25hbC4gIE9uCiAgICAgICAgICAgIE5leHRTdGVwLCBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRlcyB0byBOVUxMOyB3aGVyZWFzLCBvbiBtb2Rlcm4KICAgICAgICAgICAgcGxhdGZvcm1zLCBpdCBldmFsdWF0ZXMgdG8gImZvbyIuICAlYXBwbHkgcmVsaWVzIGV4dGVuc2l2ZWx5IHVwb24KICAgICAgICAgICAgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0aW5nIHRvIG5vbi1OVUxMLCB0aGVyZWZvcmUgaXQgZmFpbGVkCiAgICAgICAgICAgIGNhdGFzdHJvcGhpY2FsbHkgd2hlbiBmYWNlZCB3aXRoIE5leHRTdGVwJ3Mgc3Ryc3RyKCkuCgogICAgICAgICAgICBBZGRlZCBgYm9vbCcgY2hlY2sgdG8gY29uZmlndXJlLmluIHNpbmNlIE5leHRTdGVwJ3MgQysrIGNvbXBpbGVyCiAgICAgICAgICAgIGRvZXMgbm90IHN1cHBseSB0aGlzIHR5cGUuICBzd2lnLmggbm93IGZha2VzIHVwIGBib29sJyBpZiBuZWVkZWQuCgogICAgICAgICAgICBXb3JrZWQgYXJvdW5kIE5leHRTdGVwIEMrKyBjb21waWxlciBidWcgaW4gd2hpY2ggQysrIGNvZGUgaXMKICAgICAgICAgICAgZGlzYWxsb3dlZCBpbnNpZGUgZXh0ZXJuICJDIiBmdW5jdGlvbnMuICBUaGlzIHByb2JsZW0gYWZmZWN0ZWQgYWxsCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMsIHNpbmNlIHRoZXkgcHVibGlzaCBob29rIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICBGaXhlZCBieSBjcmVhdGluZyBhIEMrKyB3cmFwcGVyOgogICAgICAgICAgICAgICAgc3RhdGljIExhbmd1YWdlICpuZXdfc3dpZ19mb28oKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ld19zd2lnX2ZvbygpOyB9CgogICAgICAgICAgICBFbnN1cmVkIHRoYXQgU3dpZ19jb3B5X3N0cmluZygpIGlzIHVzZWQgaW4gcGxhY2Ugb2Ygc3RyZHVwKCkgc2luY2UKICAgICAgICAgICAgTmV4dFN0ZXAgZG9lcyBub3Qgc3VwcGx5IHN0cmR1cCgpLgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFJ1YnkgbGlicmFyeSBuYW1lIGFuZCBsb2NhdGlvbiBpbiBjb25maWd1cmUuaW4uCiAgICAgICAgICAgIFByb2JsZW0gMTogQXNzdW1lZCB0aGF0IGxpYnJhcnkgYWx3YXlzIHJlc2lkZWQgaW4gUnVieSdzICJhcmNoZGlyIiwKICAgICAgICAgICAgd2hpY2ggd2FzIGNvcnJlY3QgZm9yIFJ1YnkgMS42LngsIGJ1dCB3aGljaCBpcyBpbmNvcnJlY3QgZm9yIFJ1YnkKICAgICAgICAgICAgMS44LngsIGluIHdoaWNoIGNhc2UgdGhlIGxpYnJhcnkgbm9ybWFsbHkgcmVzaWRlcyBpbiBSdWJ5J3MKICAgICAgICAgICAgImxpYmRpciIuICBQcm9ibGVtIDI6IEFzc3VtZWQgdGhhdCB0aGUgbGlicmFyeSBjb3VsZCBhbHdheXMgYmUKICAgICAgICAgICAgbGlua2VkIHZpYSAiLWwiK1JVQllfSU5TVEFMTF9OQU1FICh3aGVyZSBSVUJZX0lOU1RBTExfTkFNRQogICAgICAgICAgICB0eXBpY2FsbHkgaXMgInJ1YnkiKSwgaG93ZXZlciB0aGlzIGZhaWxlZCBmb3IgcGxhdGZvcm1zLCBzdWNoIGFzCiAgICAgICAgICAgIE5leHRTdGVwLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgICAgc3RhdGljIGxpYnJhcnkgbmFtZSBpbiAxLjgueCBpcyBsaWJydWJ5LXN0YXRpYy5hLCB0aHVzCiAgICAgICAgICAgIC1scnVieS1zdGF0aWMgaXMgcmVxdWlyZWQuICBUaGUgbmV3IGxvZ2ljIHdvcmtzIGNvcnJlY3RseSBmb3IKICAgICAgICAgICAgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGZvciAxLjYueCBhbmQgMS44LnguCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUGVybCBDRkxBR1MgaW4gY29uZmlndXJlLmluIGZvciBOZXh0U3RlcC4KICAgICAgICAgICAgRGV0ZWN0aW9uIGNvZGUgZXh0cmFjdGVkIENGTEFHUyBmcm9tIFBlcmwncyAlQ29uZmlnIGhhc2ggYnV0CiAgICAgICAgICAgIG5lZ2xlY3RlZCB0byBhZGQgYSBuZXdsaW5lIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdCB0aHJvdWdoCiAgICAgICAgICAgIGBzZWQnLiAgTmV4dFN0ZXAncyBhbmNpZW50IGBzZWQnIGRpc2NhcmRzIGlucHV0IHdoaWNoIGlzIG5vdAogICAgICAgICAgICB0ZXJtaW5hdGVkIHdpdGggYSBuZXdsaW5lLCB0aHVzIFBlcmwgQ0ZMQUdTIGFsd2F5cyBldmFsdWF0ZWQgdG8gdGhlCiAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KCjAxLzE2LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaWR5IHVwIGluIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0aGF0IGlzIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgICAgIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIHdyYXBwZWQgd2l0aCB0aGUgdGhyb3dzIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgcmVkdW5kYW50IGNvZGUgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdzsgCiAgICAgICAgICAgICAgICB9CgowMS8xMi8yMDA0OiB3c2Z1bHRvbiBvbiBiZWhhbGYgb2YgbW1hdHVzIChtYXJjZWxvIG1hdHVzKSAKICAgICAgICAgICAgaWYgYSBtZXRob2QgdXNlcyAlZXhjZXB0aW9uIGFuZCB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSB1c2UKICAgICAgICAgICAgb2YgdGhlIHRocm93cyB0eXBlbWFwLCB0aGUgY29kZSBpbiBhIHRocm93cyB0eXBlbWFwIHdpbGwgYmUKICAgICAgICAgICAgZ2VuZXJhdGVkIGluc2lkZSB0aGUgdHJ5IGJvZHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIG1ldGhvZCB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgRXhjZXB0ICV7CiAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBjbGFzcyBFeGNlcHQge307CiAgICAgICAgICAgICAgdm9pZCBtZXRob2QoaW50IGkpIHRocm93IChFeGNlcHQpOwoKICAgICAgICAgICAgV2lsbCBnZW5lcmF0ZToKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0ICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBBcyBjYW4gYmUgc2VlbiwgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jayBpcyBmb3IgdGhlIHRocm93cyB0eXBlbWFwcy4KICAgICAgICAgICAgUHJldmlvdXNseSwgdGhpcyB3YXMgcmV2ZXJzZWQgc28gdGhhdCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrCiAgICAgICAgICAgIHdhcyB0aGUgJWV4Y2VwdGlvbiBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaXQgd291bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgIGltcG9zc2libGUgdG8gY2F0Y2ggRXhjZXB0IGFzIHRoZSBjYXRjaCBhbGwgKC4uLikgd291bGQgY2F0Y2ggdGhlCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0ZWFkLgoKVmVyc2lvbiAxLjMuMjEgKEphbnVhcnkgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMTAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBvdXRwdXQgZm9ybWF0IGZvciBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgY2FuIGJlIHNlbGVjdGVkIGZvcgogICAgICAgICAgICBpbnRlZ3JhdGlvbiB3aXRoIHlvdXIgZmF2b3VyaXRlIElERS9lZGl0b3IuIEVkaXRvcnMgYW5kIElERXMgY2FuIHVzdWFsbHkKICAgICAgICAgICAgcGFyc2UgZXJyb3IgbWVzc2FnZXMgYW5kIGlmIGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgd2lsbCBlYXNpbHkgdGFrZSB5b3UgCiAgICAgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yLiBUaGUgc3RhbmRhcmQgZm9ybWF0IGlzIHVzZWQgYnkgCiAgICAgICAgICAgIGRlZmF1bHQgZXhjZXB0IG9uIFdpbmRvd3Mgd2hlcmUgdGhlIE1pY3Jvc29mdCBmb3JtYXQgaXMgdXNlZCBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZzdGFuZGFyZCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaTo0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRm1pY3Jvc29mdCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSg0KTogU3ludGF4IGVycm9yIGluIGlucHV0LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg3MTkwOSBdIHNpbXBsZSBuYW1lc3BhY2UgcHJvYmxlbS4KICAgICAgICAgICAgVGhpcyB3YXMgYSBwcm9ibGVtIHVzaW5nIGFub255bW91cyBzdHJ1Y3R1cmVzIGluIGEgbmFtZXNwYWNlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBuOwogICAgICAgICAgICAgICAgICAgfSBTOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIGJyb2tlbiBQZXJsIGV4YW1wbGVzLgoKMTIvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhIGFuZCBDI10gRml4ZXMgZm9yIHdyYXBwaW5nIGNvdmFyaWFudCAocG9seW1vcnBoaWMpIHJldHVybiB0eXBlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXNlKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgQmFzZSogY29weSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIERlcml2ZWQqIGNvcHkoKSBjb25zdDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgRGVyaXZlZDo6Y29weSBwcm94eSBtZXRob2QgcmV0dXJucyBCYXNlIG5vdCBEZXJpdmVkLiBBIHdhcm5pbmcgaXMgaXNzdWVkCiAgICAgICAgICAgIGFib3V0IHRoaXMuIFByZXZpb3VzbHkgdGhlIHBvaW50ZXIgdXNlZCBieSB0aGUgcHJveHkgY2xhc3Mgd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIHRyZWF0ZWQgYXMgYSBCYXNlKiBpbnN0ZWFkIG9mIGEgRGVyaXZlZCouCgoxMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IHNvIHRoYXQgV2luZG93cyBwYXRocyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuCiAgICAgICAgICAgIEFuIGVycm9yIHByZXZpb3VzbHkgd291bGQgaGF2ZSBiZWVuIHNob3duIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICAuP3hhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICAuXGV4YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKClZlcnNpb24gMS4zLjIwIChEZWNlbWJlciAxNywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBMYXN0IG1pbnV0ZSBtb2RpZmljYXRpb25zLiAgIFBlcmw1IG1vZHVsZSBub3cgZ2VuZXJhdGVzIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgIGJ5IGRlZmF1bHQgbGlrZSBhbGwgb2YgdGhlIG90aGVyIG1vZHVsZXMuICBQSFA0IHdyYXBwZXJzIG5vIGxvbmdlcgogICAgICAgICAgICBpbmNsdWRlICJjb25maWcuaCIuIAoKMTIvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBXZWFrZW5lZCB3YXJuaW5nIG1lc3NhZ2UgcmVsYXRlZCB0byBjb25zdHJ1Y3RvciBuYW1lcyBzbyB0aGF0IGFuCiAgICAgICAgICAgIHVudXN1YWwgbmVzdGVkLWNsYXNzIHdyYXBwaW5nIHRlY2huaXF1ZSB3b3VsZCB3b3JrIGFnYWluIChhcHBhcmVudGx5CiAgICAgICAgICAgIGl0IHdvcmtlZCBpbiBzb21lIG9sZGVyIFNXSUcgcmVsZWFzZXMpLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGUgewogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NBOwogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NCOwogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NBIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0IgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogIFRoZXJlIGlzIHN0aWxsIHNvbWUgb2RkIGludGVyYWN0aW9uIHdpdGggdGhlIFNXSUcgc3ltYm9sCiAgICAgICAgICAgIHRhYmxlL3R5cGUgc3lzdGVtIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGxvb2tlZCBhdCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHdXN0YXZvIE5pZW1leWVyLgoKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJvdGVjdGVkIGNsYXNzIG1ldGhvZHMgYXJlIHdyYXBwZWQgYXMgcHJvdGVjdGVkIEphdmEgbWV0aG9kcyAKICAgICAgICAgICAgd2hlbiB1c2luZyB0aGUgZGlycHJvdCBkaXJlY3RvciBmZWF0dXJlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIHRvIHNvbWV0aGluZyBlbHNlIHNob3VsZCB0aGUgbmVlZCBhcmlzZSwgZm9yCiAgICAgICAgICAgIGV4YW1wbGUsIHByaXZhdGUgb3IgcGFja2FnZSBhY2Nlc3MuCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSAKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgKEphdmEpIGFuZCAlY3NtZXRob2Rtb2RpZmllcnMgKEMjKSBvcGVyYXRlIHNsaWdodGx5IAogICAgICAgICAgICBkaWZmZXJlbnRseS4gUHJldmlvdXNseSB0aGlzIGZlYXR1cmUgaGFkIHRvIGJlIHByZXNlbnQgdG8gc2V0IHRoZSBtZXRob2QKICAgICAgICAgICAgbW9kaWZpZXJzLiBOb3cgaXQgaXMgb25seSB1c2VkIGlmIGl0IGV4aXN0cyBmb3IgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLgogICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAicHVibGljIiBhcyBwcmV2aW91cyBob3dldmVyLCB3aGVuIHdyYXBwaW5nIHByb3RlY3RlZAogICAgICAgICAgICBkaXJlY3RvciBtZXRob2RzIGl0IGlzICJwcm90ZWN0ZWQiLiBUaGlzIGNoYW5nZSB3aWxsIG5vdCBhZmZlY3QgZXhpc3RpbmcKICAgICAgICAgICAgdXNlIG9mIHRoZSAlamF2YW1ldGhvZG1vZGlmaWVycyBvciAlY3NtZXRob2Rtb2RpZmllcnMuCgoxMi8xMS8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoaXMgZml4IHNvbWUgcmVjdXJyaW5nIHJlcG9ydHMgYWJvdXQga2V5d29yZHMgbm90IGJlZW4KCSAgICBwcm9wZXJseSBpZGVudGlmaWVkIGFuZCB3YXJuZWQsIGFuZCBpdCBzb2x2ZXMgdGhlIHByb2JsZW0KCSAgICBvZiBob3cgdG8gYWRkIGEgdGVzdCBmaWxlIHRvIHRoZSB0ZXN0LXN1aXRlIHN1Y2ggdGhhdCBpdAoJICAgIGRvZXNuJ3QgdXNlIGFueSBrZXl3b3JkIG9mIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcwoJICAgIChhbmQgZG9pbmcgaXQgd2l0aG91dCBjb21waWxpbmcgdGhlIHRlc3QgZm9yIGFsbCB0aGUKCSAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCB0aGluZyB0aGF0IGlzIG5vdCBhbHdheXMgcG9zc2libGUsCgkgICAgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHlvdSB0byBrbm93IGFsbCB0aGUgc3VwcG9ydGVkCgkgICAgbGFuZ3VhZ2Uga2V5d29yZHMsIHRoaW5nIHRoYXQgaXMgYWx3YXlzIGltcG9zc2libGUpLgoKCSAgICBTbyB0aGVzZSBhcmUgdGhlIGNoYW5nZXMgZ2xvYmFsbHkgc3BlYWtpbmc6CgoJICAgIC0gVW5pZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUga2V5d29yZCB3YXJuaW5ncyB0aHJvdWdoCgkgICAgICB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogYWxsIHRoZSBsYW5ndWFnZXMgaGFzIG5vdyBhCgkgICAgICBzZXBhcmF0ZSBmaWxlIHRoYXQgZGVmaW5lcyB0aGUga2V5d29yZHMgb3IgYmFkIG5hbWVzOgoKCQkgIHB5dGhvbi9weXRob25rdy5zd2cKCQkgIGNoaWNrZW4vY2hpY2tlbmt3LnN3ZwogICAgICAgICAgICAgICAgICAuLi4uCgoJICAgIC0gQWRkZWQga2V5d29yZCBsaXN0IGZvciBtb3N0IG9mIHRoZSBsYW5ndWFnZXMgdGhhdCBkaWRuJ3QKCSAgICAgIGhhdmUgb25lICh1c2luZyB0aGUgbmV3IHNlcGFyYXRlZCBmaWxlKS4KCQkgICAgCSAgICAKCSAgICAtIEFkZGVkIHRoZSAiQWxsIGtleXdvcmRzIiB3YXJuaW5nIHN1cHBvcnQ6IC1XYWxsa3cgb3B0aW9uLgoKICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGluY2x1ZGUgYWxsIHRoZSBrbm93biBrZXl3b3JkcwoJICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcywgYW5kIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICAgICBzd2lnIC1XYWxsa3cgLi4uLgoJICAgIAoJICAgICAgVGhpcyB3aWxsIGhlbHAgdG8gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgdGVzdC1zdWl0ZQoJICAgICAgZmlsZSB0aGF0IGNhbiBiZSBjb21waWxlZCBpbiBhbGwgdGhlIHN3aWcgc3VwcG9ydGVkCgkgICAgICBsYW5ndWFnZXMsIGFuZCBpdCB3aWxsIGJlIGFsc28gaGVscGZ1bCBmb3IgdXNlcnMgd2hvCgkgICAgICB3YW50IHRvIGNyZWF0ZSBtdWx0aS1sYW5ndWFnZSBsaWJyYXJpZXMuCgkgICAgCgkgICAgQW5kIHRoZXNlIGFyZSB0aGUgZGV0YWlsZWQgY2hhbmdlcyAobW9zdGx5IGZpbGUgYWRkaXRpb24pOgoKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIHNvbWUgc29ydCBvZiBrZXl3b3JkCgkgICAgICB3YXJuaW5nIGxpc3QsIG1vdmUgaXQgdG8gYW4gZXh0ZXJuYWwgbGFuZ3VhZ2Vrdy5zd2cKCSAgICAgIGZpbGUsIGllOgoJICAgIAoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHB5dGhvbi5zd2cgLT4gcHl0aG9ua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gY2hpY2tlbi5zd2cgLT4gY2hpY2tlbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHRjbDguc3dnIC0+IHRjbGt3LnN3ZwogCiAgICAgICAgICAgICAgYW5kIHJlLWluY2x1ZGUgbGFuZ3VhZ2Vrdy5zd2cgZnJvbSBsYW5ndWFnZS5zd2cuCgkgICAgCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlIHRoYXQgZGlkbid0IGhhdmUgYSBrZXl3b3JkIGxpc3QsIGFuZAoJICAgICAgZm9yIHRoZSBvbmVzIHRoYXQgSSBjb3VsZCBmaW5kIGEgbGlzdCwgYWRkIHRoZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSwgaWU6CgogICAgICAgICAgICAgICAgIGNzaGFycC9jc2hhcnBrdy5zd2cKICAgICAgICAgICAgICAgICBqYXZhL2phdmFrdy5zd2cKICAgICAgICAgICAgICAgICBwaHA0L3BocGt3LnN3ZwoJCSBwaWtlL3Bpa2Vrdy5zd2cJIAoJCSBydWJ5L3J1Ynlrdy5zd2cKCgogICAgICAgICAgICAgIGFsc28gYWRkIGEgbGluZSBpbiBsYW5ndWFnZS5zd2cgdG8gaW5jbHVkZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2csIGJ1dCBub3cgaXQgaXMgY29tbWVudGVkISEhLCBsaWtlIGluCgkgICAgICBqYXZhLnN3ZzoKCiAgICAgICAgICAgICAgICAgIC8qIGphdmEga2V5d29yZHMgKi8KICAgICAgICAgICAgICAgICAgLyogcGxlYXNlIHRlc3QgYW5kIGFjdGl2YXRlICovCiAgICAgICAgICAgICAgICAgIC8vJWluY2x1ZGUgImphdmFrdy5zd2ciCgoJICAgICAgaWUsIHRoZXJlIHdpbGwgYmUgbm8gY2hhbmdlIGluIGhvdyBzd2lnIHJ1bnMgbm9ybWFsbHkKCSAgICAgIHVudGlsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRlc3QgYW5kIHVuY29tbWVudCB0aGF0CgkgICAgICBsaW5lLgoJICAgICAgCgkgICAgICBTbywgcGxlYXNlIGNoZWNrIGVhY2ggbGFuZ3VhZ2Vrdy5zd2cgZmlsZSAoSSBsZWZ0IHRoZQoJICAgICAgbGluayB0byB0aGUga2V5d29yZCBsaXN0IHNvdXJjZSBmb3IgY2hlY2tpbmcpLCBhbmQgYWZ0ZXIKCSAgICAgIHRlc3RpbmcsIHVuY29tbWVudCB0aGUgJWluY2x1ZGUgbGluZS4KCgkgICAgLSBBZGRlZCB0aGUgZmlsZSBhbGxrdy5zd2csIHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUKICAgICAgICAgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlcy4KCgkgICAgICBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGhhcyBubyBsYW5ndWFnZWt3LnN3ZyBmaWxlIHJpZ2h0CgkgICAgICBub3csIGFuZCBpZiB0aGV5IG5lZWQgb25lLCBhZGQgdGhlIGZpbGUgaW50byB0aGUKCSAgICAgIGxhbmd1YWdlIGRpcmVjdG9yeSwgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBpbmNsdWRlCgkgICAgICBsaW5lIGludG8gdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgCgkgICAgLSBBZGRlZCB0aGUgLVdhbGxrdyB0aGF0IGluY2x1ZGVzIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIE5vdGUgdGhhdCB0aGUgb2xkIC1sYWxsa3cuc3dnIG9wdGlvbiBjb3VsZG4ndCBiZSB1c2VkCgkgICAgICBzaW5jZSBpdCBpbmNsdWRlIHRoZSBmaWxlIGFmdGVyIGl0IHdvdWxkIGJlIG5lZWRlZC4KCgoJICAgIEhvcGVmdWxseSwgdGhlIC1XYWxsa3cgb3B0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQKCSAgICBydWxlcyBpbiB0aGUgcmVsYXRlZCB0ZXN0LXN1aXRlIE1ha2VmaWxlcywgc28sIHdoZW4KCSAgICBjcmVhdGluZyBhIG5ldyB0ZXN0LCBvciBhZGRpbmcgYSBuZXcgc3dpZyBsaWJyYXJ5IGZpbGUKCSAgICAobGlrZSBfc3RkX2RlcXVlLmkpLCBzd2lnIHdpbGwgd2FybiB5b3UgaWYgeW91IGFyZSB1c2luZyBhCgkgICAgYmFkIG5hbWUsIGNvbnNpZGVyaW5nIGFsbCB0aGUgbGFuZ3VhZ2Ugd2hlcmUgaXQgbmVlZHMgdG8KCSAgICBydW4uCgkgICAgCgkgICAgUmlnaHQgbm93IHlvdSBjYW4gdGVzdCBpdCBieSB1c2luZzoKCiAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0ic3dpZyAtV2FsbGt3IgoKCSAgICBvciB1c2luZyB5b3VyIGZhdm9yaXRlIHRhcmdldCBsYW5ndWFnZSwgaXQgZG9lc24ndCBtYXR0ZXIuCgoJICAgIEFuZCB5ZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGV4YW1wbGVzIHRoYXQgYXJlIHVzaW5nCgkgICAgcmVzZXJ2ZWQga2V5d29yZHMsIHNwZWNpYWxseSBmcm9tIGNzaGFycC4KICAgICAgICAgIAoJICAgICoqKiBSZW1lbWJlciAqKioqOiB0aGUgbmV3IGtleXdvcmQgd2FybmluZyBsaXN0cyBhcmUgbm90CgkgICAgaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbnkgb2YgbGFuZ3VhZ2UgdGhhdCBiZWZvcmUgZGlkbid0CgkgICAgaGF2ZSBvbmUuIFRvIGVuYWJsZSB0aGUga2V5d29yZCB3YXJuaW5ncyBhcyB0aGUgZGVmYXVsdAoJICAgIGJlaGF2aW9yLCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBsYW5ndWFnZWt3LnN3ZyBmaWxlIGhhcyB0bwoJICAgIGJlIHVuY29tbWVudGVkIGF0IGVhY2ggbGFuZ3VhZ2Uuc3dnIGZpbGUuCgoJICAgIFNvLCBhbGwgdGhlIGxhbmd1YWdlIG1haW50YWluZXJzLCBwbGVhc2UgY2hlY2sgdGhlCgkgICAga2V5d29yZHMgbGlzdC4gCgoJICAgIEFsc28sIHlvdSBjYW4gYWRkIGJ1aXQtaW4gbmFtZXMsIGFuZCBub3Qgb25seSBrZXl3b3JkcywgbGlrZQoJICAgICdUcnVlL0ZhbHNlJyBpbiBweXRob24uICBSZW1lbWJlciB0aGF0IHlvdSBjYW4gYmUgbW9yZQoJICAgIHNwZWNpZmljIGFuZCByZWZlciBvbmx5IHRvIG1lbWJlciBuYW1lcywgbGlrZSAqOjpjb25maWd1cmUKCSAgICBvciAqOjpjZ2V0IChzZWUgYW4gZXhhbXBsZSBpbiB0aGUgdGNsOC90Y2w4a3cuc3dnIGZpbGUpLAoJICAgIG9yIG9ubHkgZ2xvYmFsIG5hbWVzLCBsaWtlIDo6cmFuZ2UgKHNlZSBhbiBleGFtcGxlIGluIHRoZQoJICAgIHB5dGhvbi9weXRob25rdy5zd2cgZmlsZS4KCgkgICAgSnVzdCB0byBiZSBjb25zaXN0ZW50LCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlczoKCgkgICAgLSBVc2UgY29kZSAzMTQgZm9yIGtleXdvcmQgYW5kL29yIGZhdGFsIGJhZCBuYW1lcy4KCSAgICAtIFVzZSBjb2RlIDMyMSBmb3IgYnVpdC1pbiBhbmQvb3Igbm90IGZhdGFsIGJhZCBuYW1lcy4KICAgICAgICAgICAKICAgICAgICAgICAgc28sIHRoZXkgY2FuJ3QgYmUgZGlzYWJsZWQvZW5hYmxlZCBpbmRlcGVuZGVudGx5IChzZWUKCSAgICBweXRob24vcHlodG9ua3cuc3dnIGZvciBleGFtcGxlcykuCgoJICAgICoqKiogQW5kIGRvbid0IGFkZCBhbnkgbmV3IHRlc3QgZmlsZSB3aXRob3V0IGNoZWNraW5nIGl0CgkgICAgd2l0aCB0aGUgLVdhbGxrdyBvcHRpb24hISAodGhhdCBpbmNsdWRlcyBtZSkgKioqKiouCgkgIAoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNGIGJ1ZyAjODU0NjM0CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFjY2VwdGluZyB0aGUgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yICcvJyBvbiAKICAgICAgICAgICAgV2luZG93cyBhbmQgdGhlIE1hYyBpbiBhZGRpdGlvbiB0byB0aGUgbmF0aXZlIG9uZSAoICdcJyBvbiAKICAgICAgICAgICAgV2luZG93cykuIFRoaXMgY2FuIGJlIHVzZWQgaW4gJWltcG9ydCwgJWluY2x1ZGUgYW5kIGNvbW1hbmRsaW5lIAogICAgICAgICAgICBvcHRpb25zIHRha2luZyBhIHBhdGgsIGZvciBleGFtcGxlIC1JLiBPbiBDeWd3aW4sIGJvdGggdGhlIFdpbmRvd3MKICAgICAgICAgICAgYW5kIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciBjYW4gbm93IGJlIHVzZWQgKHdhcyAnLycgb25seSkuCiAgICAgICAgICAgIAoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgogICAgICAgICAgICBbcHl0aG9uXSBJbXBsZW1lbnRpbmcgdGhlIHJ1bnRpbWUgInJlcHJvdGVjdGVkIiBkaXJlY3RvcgoJICAgIG1lbWJlcnMsIGlmIHlvdSBoYXZlOgogICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhcigpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBoZWxsbygpIHsgcmV0dXJuIGRvX2hlbGxvKCk7KQoKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGkoKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oZWxsbygpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlCgogICAgICAgICAgICAgICAgaW1wb3J0IG15X21vZHVsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyhteV9tb2R1bGUuQmFyKToKICAgICAgICAgICAgICAgICAgZGVmIGRvX2hlbGxvKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAKCSAgICAgICAgYiA9IEJhcigpICMgUHVyZSBDKysgRGlyZWN0b3IgY2xhc3MKICAgICAgICAgICAgICAgIGYgPSBGb28oKSAjIEMrKyBEaXJlY3RvciArIHB5dGhvbiBtZXRob2RzCgogICAgICAgICAgICAgICAgYi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBDKysgQmFyOjpkb19oZWxsbygpCiAgICAgICAgICAgICAgICBmLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIFB5dGhvbiBGb286OmRvX2hlbGxvKCkKCiAgICAgICAgICAgICAgICBiLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogCiAgICAgICAgICAgICAgICBiLmRvX2hlbGxvKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hlbGxvKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGVsbG8oKSAjIE9rLCBzaW5jZSBpdCBpdHMgcmVkZWZpbmVkIGluIHB5dGhvbi4KCiAgICAgICAgICAgIEhlcmUgQmFyLmRvX2hlbGxvIGlzIGFsd2F5cyBwcm90ZWN0ZWQsIGJ1dCBGb28uZG9faGVsbG8KICAgICAgICAgICAgaXMgInB1YmxpYyIsIGJlY2F1c2UgaXQgaXMgcmVkZWZpbmVkIGluIHB5dGhvbi4gQmVmb3JlLAoJICAgIGFsbCB0aGUgJ2RvX2hlbGxvJyBtZXRob2RzIHdlcmUgcHVibGljLgoKCSAgICBUaGlzIHNlZW1zIHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4gQysrIGFuZCBweXRob24KCSAgICBwaGlsb3NvcGhpZXMsIGllLCBhbGwgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIGtlZXAKCSAgICBwcm90ZWN0ZWQgYXQgdGhlIHVzZXIgc2lkZSAoQysrIHdheSkgdW50aWwgdGhleSBhcmUKCSAgICByZWRlZmluZWQgKHB5dGhvbiB3YXksIHdlcmUgYWxsIGRlZmluZWQgbWV0aG9kcyBhcmUgYWx3YXlzCgkgICAgcHVibGljKS4gQW5kIHRoaXMgaXMgbm90IG9ubHkgYSBnb29kIGNvbXByb21pc2UsIGl0IGFsc28KCSAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gZG8gaXQgOikuCgoJICAgIE5vdyBydWJ5IGhhcyBuYXRpdmUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMsIGFuZCBweXRob24KCSAgICBwdXJlIHJ1bnRpbWUgc3VwcG9ydC4gSSBndWVzcyB0aGVzZSBhcmUgdGhlIHR3byBwb3NzaWJsZQoJICAgIGV4dHJlbWUgY2FzZXMuIEFuZCBob3BlZnVsbHksIHRoZXkgY291bGQgYmUgdXNlZCBhcwoJICAgIHRlbXBsYXRlcyB0byBtb2RpZnkgdGhlIG90aGVyIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQKCSAgICBkaXJlY3RvcnMsIHNvIHRoZXkgY2FuICJyZXByb3RlY3QiIHRoZSBwcm90ZWN0ZWQgZGlyZWN0b3IKCSAgICBtZW1iZXJzIGF0IHRoZSB0YXJnZXQgbGFuZ3VhZ2Ugc2lkZS4KCgkgICAgVGhpcyBmaW5pc2hlZCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIHN1cHBvcnQgZm9yIHRoZSAKCSAgICBweXRob24gbGFuZ3VhZ2UuIE9jYWxtIHdpbGwgbmVlZCB0byBhZGQgdGhlCgkgICAgInJlcHJvdGVjdGlvbiIgbGF0ZXIuCgoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoZSBmb2xsb3dpbmcgY2FzZSAocmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uKSB3YXMgZml4ZWQ6CgoJICAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAoJICAgICAgY2xhc3MgRm9vIHsgCgkgICAgICBwdWJsaWM6CgkgICAgICAgIHZvaWQgeSgpOwoKCSAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgaW50IHg7CgkgICAgICB9OwoKCSAgIHN3aWcgd2FybmVkIHRoYXQgdGhlIHN5bWJvbCAneCcgd2FzIGFscmVhZHkgZGVmaW5lZCwgYW5kCiAgICAgICAgICAgdGhlIHJlbmFtaW5nIGZhaWxzLiAneCcgd2FzIG5vdCBlbWl0dGVkLCBzaW5jZSBpdCBpcwogICAgICAgICAgIHByb3RlY3RlZCwgYnV0IGl0IHdhcyBrZXB0IGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0b28KICAgICAgICAgICBtdWNoIGluZm9ybWF0aW9uLgoKCSAgIE5vdyBzd2lnIHdvcmtzIGZvciBhbGwgdGhlIGNhc2VzIChwbGFpbiwgZGlyZWN0b3IgYW5kCgkgICBkaXJwcm90KSBhZ2Fpbi4gVGhpcyB3YXMgZml4ZWQgYnkgYWxsb3dpbmcgdGhlIHBhcnNlci55IHRvCgkgICBkZWNpZGUgbXVjaCBjbG9zZXIgd2hhdCB0byBkbyB3aXRoICd4Jy4gQmVmb3JlIGFsbCB0aGUKCSAgIGRpc2NhcmRpbmcgb3IgZ2VuZXJhdGlvbiB3YXMgcmVzb2x2ZWQgYXQgdGhlIGxhbmcuY3h4CgkgICBzdGFnZS4gQWxzbyB0aGUgY2hhbmdlcyBpbiBwYXJzZXIueSB0byBpbXBsZW1lbnQgdGhlCgkgICBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZSBhcmUgbm93IG11Y2ggbW9yZSBlbmNhcHN1bGF0ZWQsIGFuZAoJICAgdGhleSBnZXQgZGlzYWJsZWQgaWYgdGhlIG1vZGUgaXMgbm90IGVuYWJsZWQuIEJlZm9yZSB0aGUKCSAgIGRlYWN0aXZhdGlvbiB3YXMgZG9uZSBhdCB0aGUgZ2VuZXJhdGlvbiBzdGFnZSAobGFuZy5jeHgpLgoKCSAgIEJ5IHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGlyZWN0b3IgbW9kZSBpcyBlbmFibGVkLCBhbmQKCSAgICVyZW5hbWUgaXMgZG9uZSwgcmV1c2luZyBhIHByb3RlY3RlZCBtZW1iZXIgbmFtZSwgdGhlcmUgaXMKCSAgIGEgcGF0aG9sb2dpY2FsIGNhc2U6CgoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCiAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQSB7CgkgICAgIHB1YmxpYzoKCSAgICAgICB2b2lkIHkoKTsKCgkgICAgIHByb3RlY3RlZDoKCSAgICAgICBpbnQgeDsgICAgICAgICAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgaW50IHg7ICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICB2b2lkIHgoKTsgLyogd29ya3MgKi8KCSAgICAgICB0eXBlZGVmIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoKCSAgICAgICB2aXJ0dWFsIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGFzIGl0IHNob3VsZCwgc2luY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9vOjp4KCkgd2lsbCBiZSBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvciAqLwoKCSAgICAgICB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBidXQgc29tZXRpbWVzIGl0IHNob3VsZG4ndCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBGb286OngoKSB3aWxsIG5vdCBiZSBlbWl0dGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBub3QgdmlydHVhbCAqLwoKCSAgICAgfTsKCgkgICBUaGUgbGFzdCBjYXNlIGlzIG5vdCBhbHdheXMgcmlnaHQgYmVjYXVzZSBhdCB0aGUgcGFyc2VyLnB5CgkgICBzdGFnZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVjaWRlIGlmIHRoZSBwcm90ZWN0ZWQgbWVtYmVyCgkgICBGb286OngoKSBjb3VsZCBvciBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcmVuYW1lZCBGb286OnkoKSwKCSAgIHNpbmNlIEZvbzo6eCgpIGNvdWxkIGJlIHZpcnR1YWwgYnkgaW5oZXJpdGFuY2UuCgoJICAgSSBndWVzcyB0aGlzIGp1c3QgYW4gaW50cmluc2ljIGxpbWl0YXRpb24sIGFuZCBubyBtdWNoIGNhbgoJICAgYmUgZG9uZSBhYm91dCBpdCB3aXRob3V0IHJlc29ydGluZyBpbnRvIGxhcmdlciBjaGFuZ2VzIHRvCgkgICBwb3N0cG9uZSwgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUgbXVsdGlwbHkgc3ltYm9sCgkgICBkZXRlY3Rpb24gKGxhbmcuY3h4IHN0YWdlKS4KCSAgIAoJICAgU28sIGJ5IG5vdywgaXQgaXMganVzdCBjb25zaWRlcmVkIGEgd2VsbCBrbm93biAiZmVhdHVyZSIgaW4KCSAgIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZS4gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGl0IHNlZW1zCgkgICB0byBiZSBhIHJhcmUgY2FzZSwgYW5kIGl0IGNhbiBiZSBhdm9pZGVkIGJ5IHRoZSB1c2VyIGJ5CgkgICBoaWRpbmcgJ3gnIGJlZm9yZSByZW5hbWluZyAneSc6CgoJICAgICAlcmVuYW1lKF94KSBGb286OngoKTsKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKCSAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSB2aXJ0dWFsIG1ldGhvZCBkZXRlY3Rpb25zIG5vdyBwcm9wZXJseQoJICAgIHRyZWF0cyB0aGUgZm9sbG93aW5nIGNhc2VzOgoKICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28geyB0eXBlZGVmIGludCBJbnQ7IH0KCSAgICAgc3RydWN0IEEge307CgkgICAgIHR5cGVkZWYgQSBCOwoKICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICB2aXJ0dWFsIH5Gb28oKSB7fQoKICAgICAgICAgICAgICAgdmlydHVhbCBGb28qIGNsb25lcigpID0gMDsKCSAgICAgICB2aXJ0dWFsIGludCBnZXRfdmFsdWUoKSA9IDA7CgkgICAgICAgdmlydHVhbCBBKiBnZXRfY2xhc3MoKSA9IDA7CgkgICAgICAgdmlydHVhbCB2b2lkIGp1c3RfZG9faXQoKSA9IDA7CgkgICAgIH07CgogICAgICAgICAgICAgc3RydWN0IEJhciA6IEZvbwogICAgICAgICAgICAgewogICAgICAgICAgICAgICBCYXIqIGNsb25lcigpOwogICAgICAgICAgICAgICBmb286OkludCBnZXRfdmFsdWUoKTsKICAgICAgICAgICAgICAgQiogZ2V0X2NsYXNzKCk7CiAgICAgICAgICAgICAgIHZvaWQganVzdF9kb19pdCgpOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICBBbGwgdGhlIEZvbyBhbmQgQmFyIG1ldGhvZHMgYXJlIHZpcnR1YWwuICBBIG5ldyBhdHRyaWJ1dGUKCSAgICAidmlydHVhbDp0eXBlIiByZWNvcmQgdGhlIGJhc2UgcG9seW1vcnBoaWMgdHlwZS4gSW4gdGhlCgkgICAgcHJldmlvdXMgY2FzZXMgd2UgaGF2ZToKCgkgICAgICAgdHlwZSA6IEJhciAgICAgICB2aXJ0dWFsOnR5cGUgOiBGb28KCSAgICAgICB0eXBlIDogZm9vOjpJbnQgIHZpcnR1YWw6dHlwZSA6IGludAoJICAgICAgIHR5cGUgOiBCICAgICAgICAgdmlydHVhbDp0eXBlIDogQQoJICAgICAgIHR5cGUgOiB2b2lkICAgICAgdmlydHVhbDp0eXBlIDogdm9pZAoKICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGluIGxhbmd1YWdlcyAoamF2YStkaXJlY3RvcnMpCgkgICAgdGhhdCBjb3VsZCBoYXZlIHByb2JsZW1zIHJlZGVmaW5pbmcgQmFyKiBCYXI6OmNsb25lcigpLgoKCSAgICBJZiB5b3UgbmV2ZXIgaGFkIGNvZGUgbGlrZSB0aGUgYWJvdmUsIHlvdSB3aWxsIHNlZSBubwoJICAgIGVmZmVjdHMuIEJ1dCBpZiB5b3UgaGF2ZSBzb21lIGNvZGUgbGlrZSB0aGF0LCB5b3UKCSAgICB3aWxsIHNlZSBzb21lIGVmZmVjdHMgc2luY2Ugc29tZSBtZXRob2RzIHRoYXQKCSAgICBiZWZvcmUgd2VyZSBub3QgcHJvcGVybHkgdHJlYXRlZCBhcyB2aXJ0dWFsLAoJICAgIHdpbGwgc3RhcnQgdG8gYWN0IGxpa2UgdGhhdC4gVGhpcyBjb3VsZCBlbmxhcmdlCgkgICAgeW91ciBkaXJlY3RvciBjbGFzc2VzLgoJICAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgKGRpcnByb3QpCgkgICAgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICAKCSAgICBJdCBjYW4gYmUgZW5hYmxlIGJ5IHVzaW5nICctZGlycHJvdCcgb3IgYnkgYWRkaW5nCgkgICAgdGhlIG9wdGlvbiB0byB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uLCBsaWtlOgoKICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLGRpcnByb3Q9IjEiKSBteV9tb2R1bGUKCgkgICAgVGhpcyBtb2R1bGUgb3B0aW9uIHdhcyBhZGRlZCB0byBwcm9wZXJseSBjb21waWxlIHRoZQoJICAgIGRpcmVjdG9yX3Byb3RlY3RlZC5pIGFuZCBkaXJlY3Rvcl9uZXN0ZWQuaSBleGFtcGxlcy4KCSAgICAKCSAgICBUaGUgZmVhdHVyZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob25bMi4yLDIuM10gCgkgICAgYW5kIHJ1YnlbMS42LjddLCBib3RoIGF0IGNvbXBpbGF0aW9uIGFuZCBydW50aW1lLCBhbmQgCgkgICAgamF2YVtqMnNkazEuNC4xXzAxXSwgYnV0IG9ubHkgYXQgY29tcGlsYXRpb24gKG15IGphdmEKCSAgICBpbnN0YWxsYXRpb24gZG9lc24ndCBydW4gYW55IG9mIHRoZSBkaXJlY3RvciBleGFtcGxlcywKCSAgICBvbGRzIG5vciBuZXdzKS4KCgkgICAgUGxlYXNlIHRlc3QgZm9yIG9jYW1sIGFuZCBqYXZhLgoJICAgIAoJICAgIFRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgV2lsbGlhbSBhbmQgU2NvdHQgd2VyZSBmaXhlZCwKCSAgICBleGNlcHQgZm9yIGEgd2FybmluZyBhYm91dCAgU1dJR19KYXZhVGhyb3dFeGVjcHRpb24oKQoJICAgIG11bHRpcGx5IGRlZmluZWQuIEkgY2FuJ3QgcmVwcm9kdWNlIHRoaXMgZXJyb3Igd2l0aCBteQoJICAgIGV4YW1wbGVzLiBXZSB3aWxsIHdhaXQgZm9yIFNjb3R0IHRvIHNlbmQgdXMgYSBtaW5pbWFsCgkgICAgY2FzZS4KCgoxMi8wNy8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCBoYXMgYmVlbgoJICAgIGNvbXBsZXRseSBtb3ZlZCBvdXQgZnJvbSBweXRob24uY3h4LCBhbmQgbm93CgkgICAgcmVzaWRlcyBpbiB0aGUgY29tbW9uIGxhbmcuY3h4LCBlbWl0LmN4eCBhbmQKCSAgICBhbGxvY2F0ZS5jeHggZmlsZXMuIAoKCSAgICBUaGlzIG1lYW5zIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgZGlyZWN0b3JzLCBpZSwgcHl0aG9uLCBqYXZhLCBvY2FsbQoJICAgIGFuZCBydWJ5LgoKCSAgICBUaGUgY2hhbmdlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvbiAoY29tcGlsYXRpb24rcnVudGltZSkKCSAgICBhbmQgamF2YSAoanVzdCBjb21waWxhdGlvbikuCgkgICAgCgkgICAgUGxlYXNlIGFkZCBydW50aW1lIHRlc3RzIGZvciB0aGUgbWlzc2luZyBsYW5ndWFnZXMgCgkgICAgYW5kIHRlc3QgaXQuCgoJICAgIFRoZSAnLW5vZGlycHJvdCcgb3B0aW9uIHdhcyBtb3ZlZCB0byB0aGUgcHJpbmNpcGFsIG1haW4sCgkgICAgYW5kIGNhbiBiZSB1c2VkIGZyb20gYWxsIHRoZSBsYW5ndWFnZXMuCgoxMi8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIGFuZCBpbXByb3ZlZCBlcnJvciBjaGVja2luZyBvZiBTVFJJTkdfT1VUIHR5cGVtYXBzIGluIAogICAgICAgICAgICB2YXJpb3VzLmkuCgoxMi8wNC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIC0gTm93IHRoZSB2aXJ0dWFsIG1lbWJlcnMgd2l0aCBubyBleHBsaWNpdCBkZWNsYXJhdG9yCgkgICAgYXJlIHByb3Blcmx5IGlkZW50aWZpZWQ6CgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7CiAgICAgICAgICAgICAgICAgIGludCBmKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBIZXJlLCBCOjpmKCkgaXMgdmlydHVhbCwgYW5kIHRoZSBkaXJlY3RvciBhbmQgdGhlCgkgICAgdmlydHVhbCBlbGltaW5hdGlvbiBtZWNoYW5pc20gbm93IHJlY29nbml6ZSB0aGF0LgoKICAgICAgICAgICAgLSBbQyNdIFRoaXMgZml4IGFsc28gZml4ZXMgdGhlIHByb2JsZW0gd2hlcmUgJ292ZXJyaWRlJyB3YXMgbm90IGJlaW5nIAogICAgICAgICAgICB1c2VkIG9uIGFueSBvdmVycmlkZGVuIHZpcnR1YWwgbWV0aG9kLCBzbyBmb3Igc3RydWN0IEIgYWJvdmUsIAogICAgICAgICAgICB0aGlzIEMjIGNvZGUgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBCIDogQSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IGYoKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoJICAgIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBwcm90ZWN0ZWQgdmlydHVhbCBtZXRob2RzLiBUaGV5IGFyZSBub3cKCSAgICBwcm9wZXJseSBlbWl0dGVkIHdoZW4gdXNpbmcgd2l0aCBkaXJlY3RvciAocHl0aG9uIG9ubHkgYnkKCSAgICBub3cpLgoJICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBmMigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgdXNpbmcgdGhlICctbm9kaXJwcm90JyBvcHRpb24uCgoJICAgIC0gVGhlIGZlYXR1cmUgJ25vZGlyZWN0b3InIGlzIHdvcmtpbmcgbm93IGF0IHRoZSB0b3AgbGV2ZWwsCgkgICAgc28sIGl0IG11c3Qgd29yayBmb3IgYWxsIHRoZSBsYW5ndWFnZXM6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub2RpcmVjdG9yIikgQTo6ZjI7CgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjIoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKCSAgICBpbiB0aGlzIGNhc2UsIG9ubHkgJ2YxJyBpcyBleHBvcnRlZCB0byB0aGUgZGlyZWN0b3IgY2xhc3MuCgkgICAgCgkgICAgLSBBZGRlZCBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCBUWVBFJiBhcmd1bWVudHMgKHB5dGhvbikuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgSU5PVVQgYW5kIE9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciB3aGVuIHRoZSBKTkkgdHlwZSAKICAgICAgICAgICAgaXMgYmlnZ2VyIHRoYW4gdGhlIEMgdHlwZS4gRm9yIGV4YW1wbGUsIHVuc2lnbmVkIGxvbmcgKDMyYml0cyBvbiBtb3N0IHN5c3RlbXMpCiAgICAgICAgICAgIGlzIG1hcHBlZCB0byBqbG9uZyAoNjRiaXRzKS4gUmV0dXJuZWQgdmFsdWUgd2FzIGluY29ycmVjdC4gQnVnIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBCcmlhbiBIYXdsZXkuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBCZXR0ZXIgZml4IGZvciBlbnRyeSBkYXRlZCAwNS8xMS8yMDAzLiBGaXhlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHR5cGVtYXBzOgoKICAgICAgICAgICAgSmF2YTogamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KICAgICAgICAgICAgQyM6IGNzYmFzZSwgY3NpbnRlcmZhY2VzLCBjc2ltcG9ydHMsIGNzY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGNzZmluYWxpemUsIGNzZ2V0Y3B0ciAmIGNzY29kZS4KCiAgICAgICAgICAgIEl0IGFsc28gZml4ZXMgYnVnIGluIHVzaW5nIGFycmF5cyBvZiBDIHN0cnVjdHMgd2l0aCBhcnJheXNfamF2YS5pIAogICAgICAgICAgICBhcyByZXBvcnRlZCBTY290dCBNaWNoZWwuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBGaXhlZCBbIDg1MjExOSBdIHJlY3Vyc2l2ZSBpbmhlcml0YW5jZSBpbiBvdXRwdXQgLnBtLCBwZXJsNS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBEb3dsaW5nLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBbIDc1NTM4MiBdIGNhbGxpbmcgZnVuYyhjb25zdCB2ZWN0b3I8VD4mIHApIGV2YWx1YXRlcyBwWzBdIGluIGludGVycC4KICAgICAgICAgICAgVGhlIFRjbCB0eXBlIGNoZWNrZXIgd2FzIGltcHJvcGVybHkgaGFuZGxpbmcgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGVuCiAgICAgICAgICAgIHR5cGUgdmlvbGF0aW9ucyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsYXZpdSBQb3BwLU5vd2FrLgoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNTQ1MDU4IF0gY29uZmlndXJlJ3MgLS13aXRoLXRjbGluY2wgaGFzIG5vIGVmZmVjdAoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDc2NjQwOSBdIG1pc3Npbmcgc3ltYm9sIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIGR1cmluZyBtb2R1bGUgbG9hZAogICAgICAgICAgICBTV0lHJ3MgaW50ZXJuYWwgZnVuY3Rpb25zIGFyZSBhbGwgc3RhdGljIGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGRpZmZlcmVudCBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHRvIHNoYXJlIGFueSBjb2RlIGF0IHJ1bnRpbWUuCgoxMS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgODQ4MzM1IF0gRGlyZWN0b3JzOiAjaW5jbHVkZSB3cmFwcGVyIC5oIGZpbGUgLSB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgYWRkaW5nIGEgZGlyZWN0b3J5IHRvIHRoZSBnZW5lcmF0ZWQgI2luY2x1ZGUgImZvb193cmFwLmgiIHN0YXRlbWVudAogICAgICAgICAgICBpbiBzb21lIHNpdHVhdGlvbnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgODQ5MDY0IF0gSkFWQSA6IEFjY2VzcyBtb2RpZmllciBmb3IgZGVyaXZlZCBjbGFzcyB3cm9uZy4KICAgICAgICAgICAgVGhlIGRlbGV0ZSgpIG1ldGhvZCBpcyBhbHdheXMgcHVibGljIG5vdy4gSXQgdXNlZCB0byBiZSBwcm90ZWN0ZWQgd2hlbmV2ZXIgYSAKICAgICAgICAgICAgZGVzdHJ1Y3RvciB3YXMgbm9uIHB1YmxpYy4gQW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gcnVudGltZSAKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpbnN0ZWFkIG9mIG1ha2luZyBkZWxldGUoKSBwcm90ZWN0ZWQgbm93LgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg1MDE1MSBdIFBZVkVSU0lPTiB3aXRoIHB5dGhvbjIuMyBpbiBjb25maWd1cmUgb2YgU1dJRyAxLjMuMTkgKE1heWJlKS4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgIFsgODUwNjY2IF0gI2luY2x1ZGUgZXh0cmEgbGluZSBhZGRlZC4gIAogICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggc29tZSBwcm9ibGVtcyB3aXRoIGdldHRpbmcgY29ycmVjdCBsaW5lIG51bWJlcnMgb24KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGFub3RoZXIgb25lIG9mIE1hcmNlbG8ncyBldmlsIHRlbXBsYXRlIGJ1Z3MgKGluZmluaXRlCiAgICAgICAgICAgIHJlY3Vyc2lvbikuIFsgODQ5NTA0IF0gdGVtcGxhdGUgYW5kIHR5cGVkZWYgLT4gaW5mLiByZWN1cnNpb24uCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6CgoJICAgICAgICAgaW50ICp4ID0gJnNvbWVhcnJheVswXTsKCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NTY1NTIgXSBtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgY2xhc3Mgc2NvcGUgd2l0aCAifCIuCiAgICAgICAgICAgIFRoaXMgaXMgcmVhbGx5IG9ubHkgYSBiYW5kLWFpZCBmaXggZm9yIHVzZSBvZiBjbGFzcy1lbnVtcyBpbgogICAgICAgICAgICBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgZW51bSBGbGFnIHsgZmxhZzEgPSAweDEsIGZsYWcyID0gMHgyIH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB4ID0gZmxhZzEgfCBmbGFnMik7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlOiB0aGVyZSBhcmUgc3RpbGwgc29tZSAobW9yZSBzdWJ0bGUpIGNhc2VzIHRoYXQgYXJlIGJyb2tlbiwKICAgICAgICAgICAgYnV0IGhhcmQgdG8gZml4IGR1ZSB0byBhbiBpc3N1ZSB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4gV2lsbAogICAgICAgICAgICBhZGRyZXNzIGxhdGVyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEbWl0cnkgTWlyb25vdi4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgODQwODc4IF0gc3VwcG9ydCBmb3IgJWlubGluZSB7IC4uLiB9IChQQVRDSCkuCiAgICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kICVpbmxpbmUgJXsgLi4uICV9IGlzIHRoYXQgdGhlCiAgICAgICAgICAgIGVuY2xvc2VkIHRleHQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gICBUaGlzCiAgICAgICAgICAgIGFsbG93cyBzcGVjaWFsIG1hY3JvcyBhbmQgb3RoZXIgcHJvY2Vzc2luZyB0byBiZSB1c2VkIGluIAogICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoICVpbmxpbmUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgzNjkwMyBdIEMrKyBpbmNvbnNpc3RlbmN5ICh3aXRoIHZvaWQgYXJndW1lbnRzKS4KICAgICAgICAgICAgU1dJRyB3YXMgaGF2aW5nIGRpZmZpY3VsdHkgd2l0aCBmKCkgdnMgZih2b2lkKSBpbiBDKysgcHJvZ3JhbXMuCiAgICAgICAgICAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZih2b2lkKSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYoKTsgICAgLy8gTm90IG1hdGNoZWQgdG8gZih2b2lkKSBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgfTsgCgogICAgICAgICAgICBUaGUgcGFyc2VyIG5vdyBub3JtYWxpemVzIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0gZih2b2lkKSAKICAgICAgICAgICAgaW4gQysrIGNsYXNzZXMgdG8gZigpLiAgVGhpcyBzaG91bGQgZml4IGEgdmFyaWV0eSBvZiBzdWJ0bGUgCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UsIG9wdGltaXphdGlvbnMsIG92ZXJsb2FkaW5nLCBldGMuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFydGhvIEJob3dtaWNrLgogCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJbmNvcnBvcmF0ZWQgWyA4NDEwNzQgXSBiZXR0ZXIgY3JvYWtpbmcgKFBBVENIKS4gIFRoaXMgZml4ZXMgc29tZSBwcm9ibGVtcwogICAgICAgICAgICB3aXRoIHN0cmluZ3MgYW5kIHByb3ZpZGVzIHNvbWUgbmV3IGVycm9yIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgogICAgICAgICAgICAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTgzNSBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBjYXN0OiB0eHQgPSAoY2hhciAqKSJ0eHQiIHN5bnRheCBFcnJvci4KICAgICAgICAgICAgVGhlIHBhcnNlciBzaG91bGQgbm93IGFjY2VwdCB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpzID0gKGNoYXIgKikgIkhlbGxvIik7CgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENsYXVkaXVzIFNjaG5vcnIuCgoxMS8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIHByb2JsZW0gd2l0aCBjcm9zcyBtb2R1bGUgbGlua2luZy4gIFByZXZpb3VzbHkgbW9kdWxlcyByZWZlcnJlZAogICAgICAgICAgICB0byBiYXNlIGNsYXNzZXMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZS4gICBOb3csIHRoZSBtb2R1bGUgbG9va3MgdXAgYmFzZQogICAgICAgICAgICBjbGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgc3lzdGVtIGl0c2VsZi0tLWF2b2lkaW5nIHRoZSBuZWVkIHRvIGxpbmsgdG8gYSBnbG9iYWwKICAgICAgICAgICAgbGlrZSBiZWZvcmUuICBDYXZlYXQ6ICBtb2R1bGVzIHdpdGggYmFzZSBjbGFzc2VzIG11c3QgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICBtb2R1bGVzIHdpdGggZGVyaXZlZCBjbGFzc2VzLgogCjExLzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgdXNlICgpIHRvIHJlcHJlc2VudCBudWxsIHBvaW50ZXJzLAoJICAgIGFzIGl0IGlzIGRvbmUgaW4gLWdoIG1vZGUuCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgQWRkIGEgZ2VuZXJhdGVkIHNjcmlwdCAicHJlaW5zdC1zd2lnIiwgd2hpY2ggY2FuIGJlIHVzZWQKCSAgICB0byBpbnZva2UgU1dJRyBiZWZvcmUgaXQgaGFzIGJlZW4gaW5zdGFsbGVkLiAgSXQgYXJyYW5nZXMKCSAgICB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZQoJICAgIHVzZWQuIAoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGRvbid0IGZvcmdldCB0byBjYWxsIFNXSUdfR3VpbGVfSW5pdC4KCSAgICBBZGQgYSBTV0lHX2NvbnRyYWN0X2Fzc2VydCBtYWNyby4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFVwZGF0ZSB0aGUgY29uZmlndXJlIGNoZWNrIGZvciB0aGUgZHluZXh0IG9iamVjdCB0byB3b3JrCgkgICAgd2l0aCBNelNjaGVtZSAyMDUuCgoxMS8yMC8yMDAzOiBtbWF0dXMKCSAgICBGaXhlZCB0aGUgaW5jbHVkZS9pbXBvcnQgZXJyb3IgcmVwb3J0ZWQgYnkgS2VyaW0gQm9yY2hhZXYsCgkgICAgd2hlcmUgdHdvIGZpbGVzIHdpdGggbmFtZXMgbGlrZQoKCSAgICAnZGlyMS9oZWxsby5pJwoJICAgICdkaXIyL2hlbGxvLmknCgkgICAgCgkgICAgY2FuIG5vdCBiZSBpbmNsdWRlIGF0IHRoZSBzYW1lIHRpbWUuIFN3aWcgd2FzIGluY2x1ZGluZwoJICAgIGp1c3QgdGhlIGZpcnN0IG9uZSwgYXNzdW1pbmcgdGhlIHNlY29uZCBvbmUgd2FzIG5vdCBhCgkgICAgZGlmZmVyZW50IG9uZSwgc2luY2UgaXQgd2FzIGNoZWNraW5nL2tlZXBpbmcganVzdCB0aGUKCSAgICBiYXNlbmFtZSAnaGVsbG8uaScuCgoxMS8xOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFNXSUcgcnVudGltZSBsaWJyYXJ5IHN1cHBvcnQuIAogICAgICAgICAgICAgIC0gIFRoZSAtYyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gLW5vcnVudGltZQogICAgICAgICAgICAgIC0gIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtcnVudGltZS4gIFdoZW4gc3VwcGxpZWQsIHRoaXMKICAgICAgICAgICAgICAgICBpbnNlcnRzIHRoZSBzeW1ib2wgU1dJR19HTE9CQUwgaW50byB0aGUgd3JhcHBlciBjb2RlLiAgVGhpcywKICAgICAgICAgICAgICAgICBpbiB0dXJuLCBtYWtlcyBhbGwgb2YgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgZ2xvYmFsbHkKICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAtIE5ldyBsaWJyYXJ5IGZpbGU6IHN3aWdydW4uaS4gICBVc2VkIHRvIGNyZWF0ZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAgZm9yIHJ1bnRpbWUgbGlicmFyeSAoaWYgbmVlZGVkKS4KICAgIAoxMS8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgJ21ha2Ugc3JjcnBtJyBycG1idWlsZCBmaXggLSBwYXRjaCBmcm9tIEpvZSBDb29wZXIKCjExLzE4LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIENoYW5nZSBtZWFuaW5nIG9mIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWd1aWxlIHRvCgkgICAgdGhlIG5hbWUgb2YgdGhlIEd1aWxlIGV4ZWN1dGFibGUuICBUaGUgbmV3IG9wdGlvbiAtLXdpdGgtZ3VpbGUtcHJlZml4IAoJICAgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWUgd2hlcmUgR3VpbGUgaXMKCSAgICBpbnN0YWxsZWQuICAoSG93ZXZlciwgdXN1YWxseSBpdCBzdWZmaWNlcyB0byB1c2UgdGhlCgkgICAgc2luZ2xlIG9wdGlvbiAtLXdpdGgtZ3VpbGUtY29uZmlnLikgIAoJICAgIFdoZW4gcnVubmluZyB0aGUgcnVuIHRlc3RzIHRlc3Qtc3VpdGUsIG1ha2Ugc3VyZSB0byB1c2UgdGhlCgkgICAgdmVyc2lvbiBvZiBHdWlsZSB0aGF0IFNXSUcgd2FzIGNvbmZpZ3VyZWQgZm9yLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW1wcm92ZW1lbnRzIHRvIG9iamVjdC1vd25lcnNoaXAgbWFuYWdlbWVudCBpbiAKCSAgICAiLXNjbSIgbW9kZS4gIChUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgZGVmYXVsdCAiLWdoIiBtb2RlLikKCSAgICAqIFJlbmFtZWQgdGhlIHNtb2IgdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuCgkgICAgICBiZSBnYXJiYWdlIGNvbGxlY3RlZCBmcm9tICJjb2xsZWN0ZWQgc3dpZyIgdG8gImNvbGxlY3RhYmxlCgkgICAgICBzd2lnIiwgd2hpY2ggaXMgbW9yZSBwcmVjaXNlLiAgCgkgICAgKiBFeHBvcnQgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb25zIGFnYWluLiAgSXQgaXMgbm93CiAJICAgICAgYWxsb3dlZCB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3RvcnMsIGV2ZW4gZm9yCgkgICAgICBnYXJiYWdlLWNvbGxlY3RlZCBwb2ludGVyIG9iamVjdHMuICBBIHBvaW50ZXIgb2JqZWN0CgkgICAgICB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0byBhIGRlc3RydWN0b3IgaXMgbWFya2VkIGluIGEKCSAgICAgIHNwZWNpYWwgd2F5IHVzaW5nIGEgbmV3IHNtb2IgdHlwZSwgImRlc3Ryb3llZCBzd2lnIi4KCSAgICAgIChUaGlzIGhlbHBzIGF2b2lkIG5hc3R5IG1lbW9yeSBidWdzLCB3aGVyZSByZWZlcmVuY2VzIHRvCgkgICAgICBkZWFkIEMgb2JqZWN0cyBhcmUgc3RpbGwgaGVsZCBpbiBTY2hlbWUuIE1vcmVvdmVyLCB0aGUKCSAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgbm90IHRyeSB0byBmcmVlIGEgZGVzdHJveWVkCgkgICAgICBvYmplY3Qgb25jZSBtb3JlLikKCSAgICAqIERlc3RydWN0b3ItbGlrZSBmdW5jdGlvbnMgY2FuIGFsc28gbWFyayB0aGVpciBhcmd1bWVudHMgCgkgICAgICBhcyBkZXN0cm95ZWQgYnkgYXBwbHlpbmcgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkRFU1RST1lFRC4KCSAgICAgIChJdCBjYWxscyB0aGUgZnVuY3Rpb24gU1dJR19HdWlsZV9NYXJrUG9pbnRlckRlc3Ryb3llZC4pCgkgICAgKiBGdW5jdGlvbnMgdGhhdCAiY29uc3VtZSIgdGhlaXIgb2JqZWN0cyAob3IgdGhhdCAib3duIgoJICAgICAgdGhlbSBhZnRlciB0aGUgY2FsbCkgY2FuIG1hcmsgdGhlaXIgYXJndW1lbnRzIGFzCgkgICAgICBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgYXBwbHlpbmcKCSAgICAgIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpDT05TVU1FRC4gIChJdCBjYWxscyB0aGUgZnVuY3Rpb24KCSAgICAgIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJOb25jb2xsZWN0YWJsZS4pCgkgICAgKiBUaGUgbWFjcm8gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVCBmcm9tIGxpYnJhcnkKCSAgICAgIHBvaW50ZXItaW4tb3V0LmkgY3JlYXRlcyBhZGRpdGlvbmFsIHR5cGVtYXBzIAoJICAgICAgUFRSVFlQRSAqSU5QVVRfQ09OU1VNRUQsIFBUUlRZUEUgKklOUFVUX0RFU1RST1lFRC4KCSAgICAgIFRoZXkgbWFyayB0aGUgcGFzc2VkIHBvaW50ZXIgb2JqZWN0IGxpa2V3aXNlLgoJICAgICAgVGhlIHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUIGNyZWF0ZXMgYSBnYXJiYWdlLWNvbGxlY3RhYmxlCgkgICAgICBwb2ludGVyIG9iamVjdCwgbGlrZSAlbmV3b2JqZWN0IGRvZXMgZm9yIGEgcmV0dXJuZWQgCgkgICAgICBwb2ludGVyLiAgVXNlIHRoZSBuZXcgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVRfTk9OQ09MTEVDVEFCTEUKCSAgICAgIHRvIGNyZWF0ZSBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBIYW5kbGUgJGlucHV0IGluICJmcmVlYXJnIiB0eXBlbWFwcy4KCSAgICBOZXZlciBxdWFsaWZ5IEdPT1BTIHNsb3QgbmFtZXMgd2l0aCB0aGUgY2xhc3MgbmFtZS4gCgkgICAgSGFuZGxlIG9wdGlvbmFsIGFyZ3VtZW50cyBwcm9wZXJseSBpbiB0aGUgR09PUFMgbWV0aG9kcy4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgaW5zdGFsbGF0aW9uIHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgQXV0b21ha2UtMS44LgogICAgICAgICAgICBta2luc3RhbGxkaXJzIHdhcyBiZWluZyB1c2VkIGJ5IGEgbm9uLUF1dG9tYWtlIG1ha2VmaWxlLiAKICAgICAgICAgICAgbWtpbnN0YWxsZGlycyBpcyBiZWluZyBwaGFzZWQgb3V0IGFuZCBzbyB3YXMgbm90IGJlaW5nCiAgICAgICAgICAgIGNyZWF0ZWQgYnkgQXV0b21ha2UuIGluc3RhbGwtc2ggdXNlZCBpbnN0ZWFkLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBpbXByb3ZlbWVudHMsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzIHNpbmNlIAogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuICVmZWF0dXJlKCJzaGFkb3ciKSBpcyB1c2VkIHRvIGFkZCBjb2RlIHRvIHNoYWRvdwogICAgICAgICAgICBjbGFzc2VzLCB0aGUgc3BlY2lhbCB2YXJpYWJsZSAkYWN0aW9uIGV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIHVuZGVybHlpbmcgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgbm9ybWFsbHkuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gZ2VuZXJhdGluZyBwcm94eSBjbGFzcyBjb2RlLCBTV0lHIGVtaXRzIGEgZmV3CiAgICAgICAgICAgIGRlZmF1bHQgbWV0aG9kcyBmb3IgX19yZXByX18oKSBhbmQgb3RoZXIgUHl0aG9uIHNwZWNpYWwKICAgICAgICAgICAgbWV0aG9kcy4gIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZW1pdHRlZCBhZnRlciBhbGwgb2YgdGhlCiAgICAgICAgICAgIGNvbnRlbnRzIG9mIGEgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgaGFyZCB0byBvdmVycmlkZQogICAgICAgICAgICB0aGUgbWV0aG9kcyB1c2luZyAlcHl0aG9uY29kZSBhbmQgc29tZSBvdGhlciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgICAgYWxsb3cgY29kZSB0byBiZSBpbnNlcnRlZCBpbnRvIGEgY2xhc3MuICBUaGVzZSBzcGVjaWFsIG1ldGhvZHMKICAgICAgICAgICAgYXJlIG5vdyBlbWl0dGVkIGludG8gdGhlIGNvZGUgKmJlZm9yZSogYWxsIG9mIHRoZSBvdGhlciBtZXRob2RzLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgRXJpYyBKb25lcy4KIAoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFByZXByb2Nlc3NvciBlbmhhbmNlbWVudC4gICBGb3IgaW5jbHVkZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlICJmb28vYmFyLmkiCgogICAgICAgICAgICB0aGUgZGlyZWN0b3J5ICJmb28iIGlzIG5vdyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggd2hpbGUgCiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGJhci5pLiAgVGh1cywgaWYgYmFyLmkgaW5jbHVkZXMgb3RoZXIKICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGV5IHdpbGwgYmUgZm91bmQuIFByZXZpb3VzbHksCiAgICAgICAgICAgIHlvdSB3b3VsZCBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHVzaW5nIC1JIHRvIG1ha2UgdGhpcwogICAgICAgICAgICB3b3JrIGNvcnJlY3RseS4gIE5vdGU6IHRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBiZWhhdmUgaW4KICAgICAgICAgICAgYW4gaWRlbnRpY2FsIG1hbm5lciBvbiBtYW55IChtb3N0PyBhbGw/KSBzeXN0ZW1zLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS2VyaW0gQm9yY2hhZXYuCgoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayBvbiBNYWMgT1MgWCAxMC4zLnggKFBhbnRoZXIpLgogICAgICAgICAgICBUZXN0ZWQgd2l0aCBQeXRob24sIFRjbCwgUGVybCwgYW5kIFJ1YnktLS1hbGwgb2Ygd2hpY2ggc2VlbSB0byB3b3JrLgoKMTEvMDgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCB0aGUgdHlwZW1hcHMgaW4gdmFyaW91cy5pIHdoaWNoIHdlcmUgbW9zdGx5IGJyb2tlbi4KICAgICAgICAgICAgY2hhciAqKlNUUklOR19JTiBhbmQgY2hhciAqKlNUUklOR19SRVQgdHlwZW1hcHMgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgU1RSSU5HX0FSUkFZLiBmbG9hdCAqRkxPQVRfQVJSQVlfUkVUVVJOIHR5cGVtYXAgcmVtb3ZlZC4KCjExLzA4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gVGNsIG1vZHVsZSBub3cgZW1pdHMgYSBzYWZlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBieQogICAgICAgICAgICBkZWZhdWx0LiAgSXQgY2FuIGJlIHJlbW92ZWQgYnkgcnVubmluZyAnc3dpZyAtbm9zYWZlJy4KCjExLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE9ubHkgdXNlIHRoZSBTQ01fIEFQSSB3aGVuIHRoZSBmdW5jdGlvbgoJICAgIGBzY21fc2xvdF9leGlzdHNfcCcgZXhpc3RzIChuZWVkZWQgZm9yIEdPT1BTIHN1cHBvcnQpLiAgCgkgICAgVGhpcyBmdW5jdGlvbiB3YXMgcmVuYW1lZCBkdXJpbmcgdGhlIEd1aWxlIDEuNSBzZXJpZXMKCSAgICBmcm9tIGBzY21fc2xvdHNfZXhpc3RzX3AnLgoJICAgIFJlcG9ydCB0aGUgcmlnaHQgcnVudGltZSBsaWJyYXJ5IHdoZW4gaW52b2tlZCB3aXRoCgkgICAgLXNjbSAtbGRmbGFncy4KCjExLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRml4ICM3ODIwNTIuICBUaGUgLS13aXRoLWNoaWNrZW5jZmcgY29uZmlndXJlCgkgICAgb3B0aW9uIChhbmQgb3RoZXJzKSB3ZXJlIG5vdCBhY2NlcHRlZC4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE1lcmdlIG5ldyBzZXQgb2YgR09PUFMgY2hhbmdlcyBieSBKb2huIExlbnouCgkgICAgR09PUFMgb2JqZWN0cyBhcmUgbm93IG1hbmlwdWxhdGVkIGRpcmVjdGx5IGJ5IHRoZSBDIGNvZGUuCgkgICAgU29tZSBmaXhlcyB0byB0eXBlbWFwLUdPT1BTIGludGVyYWN0aW9uLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVtb3ZlIHRoZSBmaWxlIGFyZ3VtZW50IHRvIC1zY21zdHViIGFuZCAtZ29vcHMuCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IGFsd2F5cyBjYWxsZWQgTU9EVUxFLnNjbSBvcgoJICAgIE1PRFVMRS1wcmltaXRpdmUuc2NtLCB3aGVyZSBNT0RVTEUgaXMgdGhlIG1vZHVsZSBuYW1lIGFuZCAKCSAgICAicHJpbWl0aXZlIiBjYW4gYmUgY2hhbmdlZCBieSB0aGUgLXByaW1zdWZmaXggb3B0aW9uLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieQoJICAgIHRoZSAtb3V0ZGlyIG9wdGlvbiwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgoJICAgIChQYXRjaCBieSBKb2huIExlbnosIHNsaWdodGx5IG1vZGlmaWVkLikKCgkgICAgKioqIElOQ09NUEFUSUJJTElUWSBbR3VpbGVdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFVuaWZ5IHRoZSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuICBUaGUgc3RhbmRhcmQKCSAgICBmdW5jdGlvbnMgYXJlOgoJICAgICAqIFNXSUdfTmV3UG9pbnRlck9iaiAoUE9JTlRFUiwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIENyZWF0ZSBhbiBzY3JpcHRpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHR5cGVkCgkJICAgcG9pbnRlci4gRkxBR1MgYXJlIGxhbmd1YWdlIHNwZWNpZmljLgoJICAgICAqIFNXSUdfQ29udmVydFB0ciAoSU5QVVQsIFJFU1VMVCwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICBzdG9yZSBpdCBpbiB0aGUgcGxhY2UgUkVTVUxULiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggCgkJICAgb2NjdXJzLCByZXR1cm4gbm9uemVyby4KCSAgICAgKiBTV0lHX011c3RHZXRQdHIgKElOUFVULCBUWVBFLCBBUkdOVU0sIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgcmV0dXJuIGl0LiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggb2NjdXJzLCB0aHJvdyBhbgoJCSAgIGV4Y2VwdGlvbi4gIElmIEFSR05VTSA+IDAsIHJlcG9ydCBpdCBhcyB0aGUgCgkJICAgYXJndW1lbnQgbnVtYmVyIHRoYXQgaGFzIHRoZSB0eXBlIG1pc21hdGNoLgogICAgICAgICAgICBbR3VpbGVdOiAgICBObyBjaGFuZ2VzLgoJICAgIFtNelNjaGVtZV06IE5vIGNoYW5nZXMuCgkgICAgW1BlcmxdOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmouCgkJICAgICAgICBUaGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIGlzIGtlcHQuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IG5vdAoJCQlzdXBwb3J0ZWQuCgkgICAgW1B5dGhvbl06ICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1J1YnldOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1RjbF06ICAgICAgUmVtb3ZlIHRoZSAiaW50ZXJwIiBhcmd1bWVudCBvZgoJCSAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaiwgU1dJR19Db252ZXJ0UHRyLAoJCSAgICAgICAgU1dJR19Db252ZXJ0UGFja2VkLCBhbmQgU1dJR19Db252ZXJ0UHRyRnJvbVN0cmluZy4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgCgkJCW5vdCBzdXBwb3J0ZWQuCgkgICAgTm8gY2hhbmdlcyB0byBQaWtlIGJlY2F1c2UgaXRzIHBvaW50ZXIgY29udmVyc2lvbiBjb2RlIGRpZAoJICAgIG5vdCBsb29rIGNvbXBsZXRlLiAgTm8gY2hhbmdlcyB0byBQSFA0LCBiZWNhdXNlIEkgZGlkIG5vdAoJICAgIHVuZGVyc3RhbmQgaXRzIHJ1bnRpbWUgY29kZS4gIE5vIGNoYW5nZXMgdG8gQ2hpY2tlbgoJICAgIGJlY2F1c2UgbWFqb3IgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgc29vbiBhbnl3YXkuICBObwoJICAgIGNoYW5nZXMgdG8gSmF2YSwgT0NhbWwsIEMjIGJlY2F1c2UgdGhleSBkbyBub3Qgc2VlbSB0bwoJICAgIGhhdmUgYSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuCgogICAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZIFtUY2xdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtQZXJsNSwgUEhQNCwgUGlrZSwgUHl0aG9uLCBSdWJ5LCBUY2xdOiBVc2UgdGhlCgkgICAgcHJlcHJvY2Vzc29yIHRvIHJlbmFtZSBleHRlcm5hbCBmdW5jdGlvbnMgb2YgdGhlIFNXSUcKCSAgICBydW50aW1lIEFQSSB0byBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uCgkgICAgU1dJR188bGFuZ3VhZ2U+XzxmdW5jdGlvbj4uICBUaGlzIHNob3VsZCBhbGxvdyBsaW5raW5nCgkgICAgbW9yZSB0aGFuIG9uZSBpbnRlcnByZXRlciBpbnRvIGEgcHJvZ3JhbS4KCjEwLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCBzaW5jZSBpbnRyb2R1Y2luZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGQ6OnN0cmluZyBkZWxlZ2F0ZXMuCiAgICAgICAgICAgIFRoZSBmaXggb3ZlcmNvbWVzIGxpbmtlciBlcnJvcnMgd2hlbiB1c2luZyBtb3JlIHRoYW4gb25lIFNXSUcgbW9kdWxlLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEFuZHJlYXMgU2No9nJrLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODIzMzAyIF0gSW5jciBUY2wgc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgQWxleGV5IER5YWNoZW5rby4KICAgICAgICAgICAgTm90ZTogbmVlZHMgZG9jdW1lbnRhdGlvbi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMyNSBdIG5ldyBQeXRob24gTW9kdWxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzLgogICAgICAgICAgICBSb2JpbiBEdW5uIHdyaXRlczoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgYSBudW1iZXIgb2YgY2hhbmdlcyB0byB0aGUgU1dJRyBweXRob24gbW9kdWxlLgoKICAgICAgICAgICAgMS4gQWRkIC1hcHBseSBvcHRpb24sIGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQgY29kZQogICAgICAgICAgICBvdXRwdXQgdG8gdXNlIHRoZSBmb28oKmFyZ3MsICoqa3cpIGNhbGxpbmcgc3ludGF4CiAgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgYXBwbHkoKS4gSWYgdGhlIC1hcHBseSBvcHRpb24gaXMKICAgICAgICAgICAgZ2l2ZW4gdGhlbiBjb2RlIGlzIGdlbmVyYXRlZCBhcyBiZWZvcmUuIFRoaXMgaXMgdmVyeQogICAgICAgICAgICBzaW1pbGFyIHRvIFBhdGNoICM3MzcyODEgYnV0IHRoZSBuZXcgLW1vZGVybiBvcHRpb24KICAgICAgICAgICAgbWFrZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoYXQgcGF0Y2ggdW5uZWNlc3Nhcnkgc28gaXQKICAgICAgICAgICAgaXMgbm90IGluY2x1ZGVkIGhlcmUuCgkgICAgCiAgICAgICAgICAgIDIuIEFkZCAtbmV3X3JlcHIgb3B0aW9uLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG15IFBhdGNoCiAgICAgICAgICAgICM3OTcwMDIgd2hpY2ggSSB3aWxsIG1hcmsgYXMgY2xvc2VkIHNpbmNlIGl0IGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBuZWVkZWQuIFdoZW4gdGhpcyBuZXcgb3B0aW9uIGlzIHVzZWQgdGhlbiB0aGUKICAgICAgICAgICAgX19yZXByX18gbWV0aG9kcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgd2lsbCBiZSBtb3JlIGluZm9ybWF0aXZlIGFuZCBnaXZlIGRldGFpbHMgYWJvdXQgdGhlCiAgICAgICAgICAgIHB5dGhvbiBjbGFzcyBhbmQgdGhlIEMrKyBjbGFzcy4KCSAgICAKICAgICAgICAgICAgMy4gQWRkICVmZWF0dXJlKCJhZGR0b2Z1bmMiKS4gSXQgYWxsb3dzIHlvdSB0byBpbnNlcnQKICAgICAgICAgICAgb25lIG9yIG1vcmUgbGluZXMgb2YgY29kZSBpbnNpZGUgdGhlIHNoYWRvdyBtZXRob2Qgb3IKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBpcyBhbHJlYWR5IGdlbmVyYXRlZCwgaW5zdGVhZCBvZgogICAgICAgICAgICByZXBsYWNpbmcgdGhlIHdob2xlIHRoaW5nIGxpa2UgJWZlYXR1cmUoInNoYWRvdyIpIGRvZXMuCiAgICAgICAgICAgIEZvciBfX2luaXRfXyBpdCBnb2VzIGF0IHRoZSBlbmQsIGZvciBfX2RlbF9fIGl0IGdvZXMKICAgICAgICAgICAgYXQgdGhlIGJlZ2luaW5nIGFuZCBmb3IgYWxsIG90aGVycyB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgICAgaXMgZXhwYW5kZWQgb3V0IHRvIGJlIGxpa2UKCSAgICAKICAgICAgICAgICAgZGVmIEJhcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICB2YWwgPSBfbW9kdWxlLkZvb19CYXIoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdmFsCgkgICAgCiAgICAgICAgICAgIGFuZCB0aGUgImFkZHRvZnVuYyIgY29kZSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0aGUKICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IHVzZWQgZm9yIGEKICAgICAgICAgICAgcGFydGljdWxhciBtZXRob2Qgb3IgZnVuY3Rpb24gdGhlbiB0aGUgc2hvcnRlciBjb2RlIGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBqdXN0IGxpa2UgYmVmb3JlLgoJICAgIAogICAgICAgICAgICA0LiBBIGxpdHRsZSBiaXQgb2YgcmVmYWN0b3JpbmcgdG8gbWFrZSBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgYWRkdG9mdW5jIGEgbGl0dGxlIGVhc2llci4KCSAgICAKICAgICAgICAgICAgNS4gQWRkZWQgYSAtbW9kZXJuIGNvbW1hbmQtbGluZSBmbGFnIHRoYXQgd2lsbCBjYXVzZQogICAgICAgICAgICBTV0lHIHRvIG9taXQgdGhlIGNydWZ0IGluIHRoZSBwcm94eSBtb2R1bGVzIHRoYXQgYWxsb3dzCiAgICAgICAgICAgIGl0IHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4yLiBUaGUKICAgICAgICAgICAgcmVzdWx0IGlzIGEgc2ltcGxlciwgY2xlYW5lciBhbmQgZmFzdGVyIHB5dGhvbiBwcm94eQogICAgICAgICAgICBtb2R1bGUsIGJ1dCBvbmUgdGhhdCByZXF1aXJlcyBQeXRob24gMi4yIG9yIGdyZWF0ZXIuIAoKMTAvMzEvMjAwMzogYmVhemxleSAKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxOSBdIFhNTCBtb2R1bGUgdHdlYWtzLgogICAgICAgICAgICBUaGlzIGFkZHMgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAteG1sbGl0ZSB0aGF0IAogICAgICAgICAgICBncmVhdGx5IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBlbWl0dGVkIFhNTCBjb2RlIGJ5CiAgICAgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgZmllbGRzIG1vc3RseSB1c2VkIGluIFNXSUcncwogICAgICAgICAgICBpbnRlcm5hbCBwcm9jZXNzaW5nLiAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxNyBdIEFkZHMgRG9oU3BsaXRMaW5lcyBmdW5jdGlvbi4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4Mjc5MDcgXSBhcmdvdXQgb2JqZWN0cyBub3QgYmVpbmcgd3JhcHBlZCBwcm9wZXJseSAoUEFUSCkuCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoJICAgICAKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNjk5NiBdIHBlcmwgdHlwZSBjaGVja2luZyBpZ25vcmVzIHBlcmwgc3ViY2xhc3Nlcy4KICAgICAgICAgICAgVGhpcyBlbmhhbmNlbWVudCBtYWtlcyBpdCBzbyB3cmFwcGVkIGNsYXNzZXMgYW5kIHN0cnVjdHMgY2FuCiAgICAgICAgICAgIGJlIHN1YmNsYXNzZWQgaW4gUGVybCBhbmQgdXNlZCBub3JtYWxseS4gCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoKMTAvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW50UHRyIG1hcnNoYWxsZWQgd2l0aCBhIHZvaWQqIGluc3RlYWQgb2YgaW50IGluIEMgZnVuY3Rpb24gCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gVGhlIGNhc3RzIHRodXMgbG9vayBtb3JlIGNvbnZlbnRpb25hbCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgLy8gb2xkCiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeChpbnQgamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKihTaGFwZSAqKikmamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbmV3CiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeCh2b2lkICogamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKFNoYXBlICopamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCjEwLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIGEgY2xhc3MgaGFzIG92ZXJsb2FkZWQgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCB4KTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXIoaW50IHgsIGludCB5KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgYW5kIHRoZSBjbGFzcyBpcyB1c2VkIGFzIGEgc21hcnQgcG9pbnRlcjoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29QdHIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgU1dJRyB3b3VsZCB0cnkgdG8gZXhwb3NlIHRoZSBzdGF0aWMgbWVtYmVyIEZvbzo6YmFyCiAgICAgICAgICAgIHRocm91Z2ggRm9vUHRyLS0tcmVzdWx0aW5nIGJvZ3VzIHdyYXBwZXIgY29kZSBhbmQgYSBjb21waWxlcgogICAgICAgICAgICBlcnJvci4KCiAgICAgICAgICAgIER1ZSB0byB0aGUgd2F5IGluIHdoaWNoIG92ZXJsb2FkaW5nIGlzIGhhbmRsZWQsIGl0IGlzCiAgICAgICAgICAgIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gZWxpbWluYXRlIHRoZSBzdGF0aWMgbWV0aG9kIGluCiAgICAgICAgICAgIHRoaXMgY2FzZS4gIFRoZXJlZm9yZSwgaXQgaXMgc3RpbGwgZXhwb3NlZC4gIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSBub3cgY29tcGlsZXMgYW5kIHdvcmtzLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZSwgTXpTY2hlbWUsIENoaWNrZW5dOiBSZW1vdmUgc3ltYm9sIGNsYXNoZXMgYmV0d2VlbgoJICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBieSByZW5hbWluZyBhbGwgZXh0ZXJuIGNvbW1vbi5zd2cKCSAgICBmdW5jdGlvbnMgd2l0aCB0aGUgcHJlcHJvY2Vzc29yLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgYmFzaWMgR09PUFMgc3VwcG9ydCwgY29udHJpYnV0ZWQgYnkgSm9obiBMZW56LgoJICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KCSAgICAKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTmV3IG9wdGlvbiwgLW9ubHktc2V0dGVycywgd2hpY2ggZGlzYWJsZXMKCSAgICB0cmFkaXRpb25hbCBnZXR0ZXIgYW5kIHNldHRlciBwcm9jZWR1cmVzIGZvciBzdHJ1Y3R1cmUgc2xvdHMuCgoxMC8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBydW4gdGVzdCBmb3IgcmVmZXJlbmNlX2dsb2JhbF92YXJzIGJ5IEpvaG4gTGVuei4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUGFydGlhbCBzb2x1dGlvbiB0byBbIDc5MjE4MCBdIEMrKyBzbWFydC1wb2ludGVyL25hbWVzcGFjZSBtaXh1cCByZXZpc2l0ZWQuCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIGlzIG5vdCBlYXN5IHRvIGZpeCAoYXQgbGVhc3QgaXQgZG9lc24ndCBzZWVtIHNvKSwgYnV0IGlzCiAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIGluc3RhbnRpYXRpb24gb2YgcXVhbGlmaWVkIHRlbXBsYXRlcyBpbnNpZGUgb2Ygb3RoZXIKICAgICAgICAgICAgbmFtZXNwYWNlcy4gICBTV0lHIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UgcmF0aGVyCiAgICAgICAgICAgIHRoYW4gZ2VuZXJhdGluZyBicm9rZW4gd3JhcHBlcnMuCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODAwMDEyIF0gRU5URVIgbWFjcm8gZnJvbSBDT1JFL3Njb3BlLmggY2xhc2hlcyB3aXRoIGxpYmMgc2VhcmNoLmguCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMTUxOCBdIENhc3RpbmcgaW50cyB0byBkb3VibGVzICh3LyBzb2x1dGlvbj8pCiAgICAgICAgICAgIEFkZHJlc3NlcyBhIHByb2JsZW0gd2l0aCBvdmVybG9hZGluZyBpbiB0aGUgUGVybCBtb2R1bGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBEYWxsZXkuCgowOS8yOC8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlIHdpdGggLXNjbSBvcHRpb25dIEZpeCB0eXBvIGluIGdlbmVyYXRlZCBjb2RlIGZvcgoJICAgIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzLiAgUmVwb3J0ZWQgYnkgSm9obiBMZW56LgoKMDkvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMjUyOCBdIGV4dGVybnMgbm90IGNvcnJlY3Qgd2hlbiB0aHJvdyBpcyBpbiBzaWduYXR1cmUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgogICAgICAgICAgICAKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNXSUcgd2FzIGdlbmVyYXRpbmcgYSBudW1iZXIgb2Ygc3ltYm9scyB0aGF0IGRpZG4ndCBjb21wbHkgd2l0aCAKICAgICAgICAgICAgdGhlIElTTyBDL0MrKyBzdGFuZGFyZCwgaW4gcGFydGljdWxhciBJU08vSUVDIDE0ODgyOjE5OTgoRSkgMTcuNC4zLjEuMgogICAgICAgICAgICB3aGVyZSBkb3VibGUgdW5kZXJzY29yZXMgYXJlIGZvcmJpZGRlbiBhcyB3ZWxsIGFzIHN5bWJvbHMgc3RhcnRpbmcgd2l0aAogICAgICAgICAgICBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGFuIHVwcGVyIGNhc2UgbGV0dGVyLiBNb3N0IG9mIHRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiByb290ZWQgb3V0LiBTZWUgbmV3IHNlY3Rpb24gYWRkZWQgdG8gaW50ZXJuYWxzLmh0bWwgZGV2ZWxvcG1lbnQKICAgICAgICAgICAgbWFudWFsICdTeW1ib2wgTmFtaW5nIEd1aWRlbGluZXMgZm9yIEdlbmVyYXRlZCBDL0MrKyBDb2RlJy4KCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaXJlY3RvciB0eXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgaW52ICAgICA9PiBkaXJlY3RvcmluCiAgICAgICAgICAgIG91dHYgICAgPT4gZGlyZWN0b3JvdXQKICAgICAgICAgICAgYXJnb3V0diA9PiBkaXJlY3RvcmFyZ291dAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8xOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciBjb25zdHJ1Y3RvcnMgbm93IGRlZmF1bHQgdG8gX19kaXNvd24gPSAwLCAKCSAgICB3aGljaCBpcyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgYW5kIGZpeGVzIHRoZSBkaXJlY3Rvcl9maW5hbGl6ZXIgCgkgICAgdGVzdCBjYXNlIHVuZGVyIHB5dGhvbi4KCjA5LzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIC0gVHlwZW1hcHMgYWRkZWQgZm9yIHN0ZDo6c3RyaW5nIGFuZCBjb25zdCBzdGQ6OnN0cmluZyAmLgogICAgICAgICAgICAgICAgIC0gTmV3IGRlbGVnYXRlIGZvciBjcmVhdGluZyBhIEMjIHN0cmluZyBnaXZlbiBhIGNoYXIgKi4gSXQKICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNhbGxpbmcgU1dJR19jc2hhcnBfc3RyaW5nX2NhbGxiYWNrIGFzIHNob3duCiAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RkOjpzdHJpbmcgJ291dCcgdHlwZW1hcC4gVXNlZnVsIGlmIHRoZSByZXR1cm4gdHlwZSBpcwogICAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIGEgQyMgc3RyaW5nIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSAKICAgICAgICAgICAgICAgICAgIGZvciBjbGVhbmluZyB1cCBtZW1vcnkgYXMgdGhlIEMjIGdhcmJhZ2UgY29sbGVjdG9yIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlIG1lbW9yeSBjcmVhdGVkIGluIEMvQysrIGFuZCB0aGVuIHJldHVybmVkIGFzIGEgQyMgc3RyaW5nLgogICAgICAgICAgICAgICAgIC0gVGhlIGV4Y2VwdGlvbiBkZWxlZ2F0ZXMgaGF2ZSBtb3ZlZCBpbnRvIGFuIGlubmVyIGNsYXNzIGluIHRoZQogICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIGNsYXNzLCB0aGVyZWJ5IGZyZWVpbmcgdXAgdGhlIHN0YXRpYyBjb25zdHJ1Y3Rvci4KCjA5LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKEludGVybmFscykKICAgICAgICAgICAgTWFqb3IgcmVmYWN0b3Jpbmcgb2YgaXRlcmF0aW9uIG92ZXIgbGlzdHMgYW5kIGhhc2hlcy4gIFRoZQogICAgICAgICAgICBET0ggbGlicmFyeSBub3cgdXNlcyBpdGVyYXRvcnMuICBUaGV5IHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIExpc3QgKmwgPSAoc29tZSBsaXN0KTsKCiAgICAgICAgICAgICAgICBJdGVyYXRvciBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gY29udGFpbnMgdGhlIGFjdHVhbCBsaXN0IGl0ZW0uCiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGlzIE5VTEwgYXQgZW5kIG9mIGxpc3QKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIYXNoICpoID0gKHNvbWUgaGFzaCk7CiAgICAgICAgICAgICAgICBJdGVyYXRvciBqOwogICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QoaCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBqLml0ZW0gY29udGFpbnMgaGFzaCB0YWJsZSBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gai5rZXkgIGNvbnRhaW5zIGhhc2ggdGFibGUga2V5CiAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBqLml0ZW0gYW5kIGoua2V5IGFyZSBOVUxMIGF0IGVuZAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIFRoZSBvbGQgaXRlcmF0aW9uIGZ1bmN0aW9ucyBGaXJzdGl0ZW0oKSwgTmV4dGl0ZW0oKSwgRmlyc3RrZXkoKSwKICAgICAgICAgICAgYW5kIE5leHRrZXkoKSBhcmUgZ29uZS4gIAoKICAgICAgICAgICAgVGhlIG5ldyBpdGVyYXRvcnMgYXJlIHNpbXBsZXIsIHJlc3VsdCBpbiBiZXR0ZXIgbWVtb3J5IHVzZSwKICAgICAgICAgICAgYW5kIG1heSBiZSBmYXN0ZXIuICBBbHNvLCB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBwcm9ibGVtcwogICAgICAgICAgICBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSBsaXN0L2hhc2ggaW4gbXVsdGlwbGUgcGxhY2VzIGF0CiAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBmaW5lOgoKICAgICAgICAgICAgICAgICBJdGVyYXRvciBpLGo7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChsKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIChUaGlzIG5ldmVyIHdvcmtlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucykuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4gIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayAKICAgICAgICAgICAgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucyB0byBTV0lHIChvciBnaXZlIHRoZW0gZnVydGhlciBlbmNvdXJhZ2VtZW50CiAgICAgICAgICAgIHRvIGpvaW4gdGhlIFNXSUcgQ1ZTLXRyZWUgOi0pLgoKMDkvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IG1lbW9yeSBsZWFrcyBpbiB0aGUgImxpc3QtdmVjdG9yLmkiIHR5cGVtYXBzLgoKMDkvMDkvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBVc2UgQ19ta19ib29sIHJhdGhlciB0aGFuIENfbWtib29sLiAgVGhpcyBmaXhlcwoJICAgIHRoZSB3cmFwcGluZyBvZiBib29sZWFuIHZhbHVlcyBmb3IgQ2hpY2tlbiAxLjEwIGFuZCBuZXdlci4KCSAgICBSZXBvcnRlZCBieSBEYXZlIDxodW5kb0B5YWhvby5jb20+IC8gRmVsaXggV2lua2VsbWFubgoJICAgIDxmZWxpeEBwcm94aW1hLW10LmRlPi4KCjA5LzA1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3JzIGltcGxlbWVudGVkIGZvciBKYXZhLiBJbiBzdW1tYXJ5IHRoaXMgaXMgYSBiaWcgbmV3IGZlYXR1cmUgCiAgICAgICAgICAgIHdoaWNoIHN1cHBvcnRzIHVwY2FsbHMgZnJvbSBDKysgdG8gSmF2YS4gQ29kZSBpcyBnZW5lcmF0ZWQgdG8gc3VwcG9ydCBDKysgCiAgICAgICAgICAgIGNhbGxiYWNrcyB0byBjYWxsIGludG8gSmF2YSBhbmQgdHJ1ZSBwb2x5bW9ycGhpYyBiZWhhdmlvdXIgZm9yIEphdmEgY2xhc3NlcyAKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIEMrKyBjbGFzc2VzLiBTZWUgamF2YS5odG1sIGZvciBkZXRhaWxzLiBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgoKMDkvMDUvMjAwMzogVGlnZXIKICAgICAgICAgICAgQ3JlYXRlZCBjb250cmFjdCBleGFtcGxlIGRpcmVjdG9yeSBhdCAvU1dJRy9FeGFtcGxlcy9jb250cmFjdAogICAgICAgICAgICBBZGRlZCBzaW1wbGUgY29udHJhY3QgZXhhbXBsZXMgKHNpbXBsZV9jICYgc2ltcGxlX2N4eCkKICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgbW9kdWxlJ3Mgb3V0cHV0IGZvcm1hdAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRlc3Qtc3VpdGUgYnVpbGQgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAtIE11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIHdvcmtpbmcgZm9yIHRoZSB0ZXN0IHN1aXRlLCBzbyBpdCBpcyBub3cKICAgICAgICAgICAgICBwb3NzaWJsZSB0byBydW4gY29uZmlndXJlIGluIG11bHRpcGxlIHN1YmRpcmVjdG9yaWVzIGFuZCBydW4gdGhlIHRlc3QKICAgICAgICAgICAgICBzdWl0ZSBpbiBlYWNoIG9mIHRoZXNlIHN1YiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSAnbWFrZSBkaXN0Y2xlYW4nIGZpeGVkIHNvIGl0IGRvZXNuJ3QgYm9tYiBvdXQgb24gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeQogICAgICAgICAgICAgIHdoZW4gdXNpbmcgbXVsdGlwbGUgc3ViZGlyZXRvcnkgYnVpbGRzLiBSZXF1aXJlZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQ6CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BlcmwgLT4gRXhhbXBsZXMvR0lGUGxvdC9QZXJsNQogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QaHAgIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGhwNAogICAgICAgICAgICAgIFRoZXNlIG5ldyBkaXJlY3RvcmllcyB1c2VkIHRvIGJlIHN5bWJvbGljIGxpbmtzIHRvIHRoZSBvbGQgZGlyZWN0b3J5LgogICAgICAgICAgICAgIEFsc28gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvUGVybCBzeW1ib2xpYyBsaW5rIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICAgICAgIC0gUnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgb3RoZXIgdGhhbiBmcm9tIHRoZSByb290IGRpcmVjdG9yeSwgc2F5CiAgICAgICAgICAgICAgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9weXRob24gd2lsbCBub3cgZGlzcGxheSBhbGwgdGhlIGNvZGUgYmVpbmcKICAgICAgICAgICAgICBleGVjdXRlZC4KICAgICAgICAgICAgLSBUaGUgZm9sbG93aW5nIDMgQyMgY29tcGlsZXJzIGFyZSBkZXRlY3RlZCBkdXJpbmcgY29uZmlndXJlIGFuZCB3b3JrIHdpdGggCiAgICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGU6IE1vbm8sIFBvcnRhYmxlLk5FVCBhbmQgTWljcm9zb2Z0LgoKMDkvMDEvMjAwMzogVGlnZXIKICAgICAgICAgICAgQWRkZWQgaW5oZXJpdGFuY2Ugc3VwcG9ydCBmb3IgZGVzaWduIGJ5IGNvbnRyYWN0IGZlYXR1cmUuCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk0OTE0IF0gV3JvbmcgdHlwZXMgaW4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIFNXSUcgd2FzIG5vdCBoYW5kbGluZyBhcmd1bWVudHMgY29ycmVjdGx5IGluIHRlbXBsYXRlIAogICAgICAgICAgICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vPFQgKj4gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIFQgKmJsYWgoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0ludCkgRm9vPGludCAqPjsKCiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MsIHRoZSByZXR1cm4gdHlwZSBvZiBibGFoIHdhcyBzZXQgdG8KICAgICAgICAgICAgJ2ludCAqKicsIGJ1dCBpdCBzaG91bGQgcmVhbGx5IGJlICdpbnQgKicuICBUaGlzIGhhcyBiZWVuCiAgICAgICAgICAgIGZpeGVkLCBidXQgaXQgd2lsbCBhZmZlY3QgYWxsIHByaW9yIHVzZXMgb2YgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbi4KIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg2Mzk0IF0gUGF0Y2ggZm9yIGdlbmVyYXRlZCBwZXJsIGNvZGUgZG9lcyBub3QgY29tcGlsZSB1bmRlciBSZWRIYXQ5LgogICAgICAgICAgICBSZXBvcnRlZCBieSBTY290dCBGaW5uZXJhbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE1NzkgXSAodW5zaWduZWQpIGxvbmcgbG9uZyBoYW5kbGVkIGluY29ycmVjdGx5IChUY2wpLgogICAgICAgICAgICBUaGlzIHdhcyBhbiBlcnJvciBpbiB0aGUgVGNsIHR5cGVtYXBzLmkgZmlsZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEtqZWxsIFdvb2RpbmcuCiAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzMgXSBubyB3YXkgdG8gcmVuYW1lIGNsYXNzZXMgY29taW5nIGZyb20gQyBzdHJ1Y3R1cmVzLgogICAgICAgICAgICBUaGlzIHByb2JsZW0gcmVsYXRlcyB0byByZW5hbWluZyBvZiBhbm9ueW1vdXMgc3RydWN0dXJlcyB3aXRoIGEKICAgICAgICAgICAgdHlwZWRlZi4gIEZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCiAgICAgICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTc2IF0gLWhlbHAgc2VlbXMgdG8gaW1wbHkgdGhhdCBvbmx5IHRjbC1zcGVjaWZpYyBvcHRpb25zIGV4aXN0LgogICAgICAgICAgICBBZGRlZCBhIGNvbW1lbnQgdG8gYWxlcnQgdXNlciB0byBvdGhlciBvcHRpb25zLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTgyMDUgXSBTZWdmYXVsdCBpbiBTV0lHX0NvbnZlcnRQdHIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFByYWJodSBSYW1hY2hhbmRyYW4uCgowOC8zMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNb2RpZmllZCB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgaW4gcHl0aG9uL3N0ZF9jb21wbGV4LmkgdG8gdXNlIHRoZSAKCSAgICBuZXctc3R5bGUgbWFjcm8gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB3aGljaCBlbGltaW5hdGVkIHNvbWUKCSAgICByZWR1bmRhbnQgY29kZS4gIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlc2UgdHlwZW1hcHMgYXMgd2VsbCwgYWx0aG91Z2gKCSAgICBtb3JlIHRlc3RpbmcgaXMgbmVlZGVkLgoKMDgvMjkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ29tcGxldGVkIGluaXRpYWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYWJzdHJhY3QgY2xhc3NlcyB3aXRoIGRpcmVjdG9ycy4KCSAgICBDb25zdHJ1Y3RvciB3cmFwcGVycyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWJzdHJhY3QgY2xhc3NlcyB0aGF0IGhhdmUKCSAgICBkaXJlY3RvcnMsIGFuZCBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yIGNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGV0aGVyIHRoZSBwcm94eSBjbGFzcyBoYXMgYmVlbiBzdWJjbGFzc2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgTm8gY2hlY2tzIGFyZSBtYWRlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gZW5zdXJlIHRoYXQgYWxsIHB1cmUgdmlydHVhbAoJICAgIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBJbnN0ZWFkLCBjYWxscyB0bwoJICAgIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyB3aWxsIHRocm93IFNXSUdfRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTgoJICAgIGV4Y2VwdGlvbnMgaW4gQysrLgoKCSAgICBJbnRlZ3JhdGVkIFByYWJodSBSYW1hY2hhbmRyYW4ncyB0eXBlbWFwIHBhdGNoZXMsIHdoaWNoIHByb3ZpZGUgZGlyZWN0b3IKCSAgICB0eXBlbWFwIHN1cHBvcnQgZm9yIGVudW1zIGFuZCBzdGQ6OnNpemVfdCwgYW5kIGZpeCBhIGNvdXBsZSBidWdzIGluIHRoZSAKCSAgICBkaXJlY3RvciBzdGQ6OnZlY3Rvcjw+IHR5cGVtYXBzLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wbGVtZW50ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciB0aHJvd2luZyBDIyBleGNlcHRpb25zIGZyb20gQy9DKysgY29kZS4KICAgICAgICAgICAgQSBmZXcgZGVsZWdhdGUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGNhbGxpbmcgd2hpY2ggdGhlbiB0aHJvdyB0aGUgQyMKICAgICAgICAgICAgZXhjZXB0aW9uLiBVc2UgdGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24gZnVuY3Rpb24gZnJvbSBDL0MrKyB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIG9yIGNzaGFycGhlYWQuc3dnIGZvciBhbGwgYXZhaWxhYmxlIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oU1dJR19DU2hhcnBFeGNlcHRpb24sICJleGNlcHRpb24gZGVzY3JpcHRpb24iKTsKCiAgICAgICAgICAgIFRoZSAndGhyb3dzJyB0eXBlbWFwcyBhcmUgYWxzbyBub3cgaW1wbGVtZW50ZWQsIHNvIGNvZGUgaXMgYXV0b21hdGljYWxseSAKICAgICAgICAgICAgZ2VuZXJhdGVkIHRvIGNvbnZlcnQgYW55IEMrKyBleGNlcHRpb24gaW50byBhIEMjIFN5c3RlbS5FeGNlcHRpb24gd2hlbiB0aGUgQysrIAogICAgICAgICAgICBtZXRob2QgZGVjbGFyZXMgYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gc3VjaCBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhCYXIpOwoKICAgICAgICAgICAgQWxzbyBhbnkgcGFyYW1ldGVycyB0aGF0IGFyZSByZWZlcmVuY2VzIHRvIGEgQysrIGNsYXNzIG9yIGEgY2xhc3MgcGFzc2VkIGJ5IHZhbHVlCiAgICAgICAgICAgIGFuZCBhcmUgcGFzc2VkIGFzIGEgQyMgbnVsbCB3aWxsIG5vdyB0aHJvdyBhIEMjIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggdG8gbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBhbGwgcGludm9rZSBtZXRob2RzIHNvIHRoYXQgdGhleQogICAgICAgICAgICBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgYnkgZGVmYXVsdCBpbiB0aGUgQyMgJ3N0YXRpYyBleHRlcm4nIGRlY2xhcmF0aW9ucyAKICAgICAgICAgICAgKF9fc3RkY2FsbCBpcyB1c2VkIG9uIFdpbmRvd3MpLgoKMDgvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZXdvcmtlZCBzdGQ6OnN0cmluZyB0eXBlbWFwcy4gRml4ZXMgYSBudW1iZXIgb2Ygc3RyaW5nIGluIHN0ZCBuYW1lc3BhY2UgCiAgICAgICAgICAgIHByb2JsZW1zLiBGb3IgZXhhbXBsZSAldGVtcGxhdGUgdmVjdG9yPHN0cmluZz4uIFRoZSB0ZW1wbGF0ZWQgY2xhc3MnIGdldCBtZXRob2QgCiAgICAgICAgICAgIHdhc24ndCByZXR1cm5pbmcgYSBKYXZhIFN0cmluZywgYnV0IGEgU1dJR1RZUEVfcF9zdHJpbmcuIFJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFphY2ggQmF1bS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1MjIgXSAxLjMuMTkgc2VnZmF1bHQgaW4gU3dpZ1R5cGVfYWRkX3BvaW50ZXIvRG9oSW5zZXJ0aXRlbS4KICAgICAgICAgICAgUmVsYXRlZCB0byBwcm9ibGVtIHdpdGggdW5uYW1lZCBjbGFzcyBoYW5kbGluZyBpbiBQZXJsIG1vZHVsZS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1NjMgXSBNaXNzaW5nIGluZGljYXRpb24gb2Ygb3B0aW9uYWwgYXJndW1lbnRzLgogICAgICAgICAgICBUY2wgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODc0MzIgXSBsb25nIHBhcmFtIGhhbmRsZWQgYXMgaW50LiAgVGNsIG1vZHVsZQogICAgICAgICAgICBub3cgdXNlcyBUY2xfR2V0TG9uZ0Zyb21PYmogdG8gY29udmVydCBpbnRlZ2VyIHZhbHVlcy4KCjA4LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU5ODkgXSBudW1lcmljIHRlbXBsYXRlIHBhcmFtZXRlcnMuICAgVGhlcmUgd2VyZQogICAgICAgICAgICBzb21lIGVycm9ycyBpbiB0ZW1wbGF0ZSBleHBhbnNpb24gcmVsYXRlZCB0byB0aGUgdXNlIG9mCiAgICAgICAgICAgIGFycmF5cyB3aGVyZSB0aGUgYXJyYXkgZGltZW5zaW9uIHdhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KICAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUmVwb3J0ZWQgYnkgQnJ5YW4gR3JlZW4uCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIGRpcmVjdG9yIHR5cGVtYXAgKG91dHYpIGZvciByZXR1cm4gYnkgdmFsdWUgYW5kIGNsZWFuZWQgdXAgdXAgYSBmZXcgCgkgICAgb2YgdGhlIGNvbW1lbnRlZCBkaXJlY3RvciB0eXBlbWFwcy4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gZm9yIGRpcmVjdG9yIGNsYXNzZXMgdG8gaWdub3JlIHByaXZhdGUKCSAgICBjb25zdHJ1Y3RvcnMuICBQcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBhbHNvIGlnbm9yZWQgZm9yIG5vdywgcGVuZGluZwoJICAgIGEgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gb2Ygd3JhcHBpbmcgY2xhc3NlcyB0aGF0IG9ubHkgZGVmaW5lIHByb3RlY3RlZAoJICAgIGNvbnN0cnVjdG9ycy4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1vdXRkaXIgPGRpcj4gdG8gc3BlY2lmeSB3aGVyZSB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhcmdldCBsYW5ndWFnZXMgbGlrZSBQeXRob24sCiAgICAgICAgICAgIEphdmEgZXRjIHdoaWNoIGdlbmVyYXRlIHByb3h5IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsYW5ndWFnZS4KICAgICAgICAgICAgVGhpcyBvcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhlIEMvQysrIHdyYXBwZXIgZmlsZS4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBPbiBXaW5kb3dzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKG90aGVyIHRoYW4gdGhlIF93cmFwLmMgb3IgX3dyYXAuY3h4IGZpbGVzKQogICAgICAgICAgICB3ZXJlIHNvbWV0aW1lcyBpbmNvcnJlY3RseSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzCiAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIHVzZWQgdGhlIFVuaXggcGF0aCBzZXBhcmF0b3IuIFRoZSBXaW5kb3dzIHBhdGggc2VwYXJhdG9yIAogICAgICAgICAgICBzaG91bGQgbm93IGJlIHVzZWQuIEJ1ZyByZXBvcnRlZCBieSBSb2JlcnQgRGF2aWVzLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhcnJheSB2YXJpYWJsZSBzZXQgdHlwZW1hcCB0byBQZXJsIG1vZHVsZS4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU2NzcgXSBBcnJheSBpbml0IGNhdXNlcyBjb2RlZ2VuIGJ1Zy4uCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc5MDYyIF0gQ2xhc3MiXG4iOjpmb28gbm90IHN1cHBvcnRlZC4gIFNXSUcKICAgICAgICAgICAgc2hvdWxkIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHdoaXRlc3BhY2UgaW4gYmV0d2VlbiAKICAgICAgICAgICAgbmFtZXNwYWNlIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZSAiQSA6OiBGb28gOjogQmFyIi4KICAgICAgICAgICAgCjA3LzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgcGFyYW1ldGVycyB3aGljaCBhcmUgY2xhc3NlcyB0aGF0IGFyZSBwYXNzZWQgYnkgdmFsdWUgYW5kIGhhdmUgCiAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZS4gQSBjb3B5IGNvbnN0cnVjdG9yIGZvciBTd2lnVmFsdWVXcmFwcGVyIGlzIHJlcXVpcmVkIAogICAgICAgICAgICAoU0YgIzc4MDA1NikuIEFsc28gZml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4gVGhlc2UgbW9kcwogICAgICAgICAgICBhbHNvIGZpeCBTRiAjNzgwMDU0LgoKMDcvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBydW4tdGltZSBlcnJvciBtZXNzYWdlIGZvciBwb2ludGVycyBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBab29rby4KCjA3LzEwLzIwMDM6IGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgW0FsbW9zdCBhbGwgbGFuZ3VhZ2VzXSBXcmFwcGVycyBmb3Igc3RkOjpwYWlyIGFkZGVkLgoJICAgIFR5cGVtYXBzIGZvciBQeXRob24sIFJ1YnksIEd1aWxlIGFuZCBNelNjaGVtZS4KCjA3LzAxLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gSGFuZGxlIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgYXJnb3V0IHR5cGVtYXAKCSAgICBwZXIgZnVuY3Rpb24uCgowNi8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBTRiAjNjcwOTQ5IHJlcXVlc3QuIFRoZSBkZXN0cnVjdG9yIHdyYXBwZXIgZnVuY3Rpb24gbmFtZSBpcyBub3cgCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZS4gIEEgbmV3IGF0dHJpYnV0ZSBjYWxsZWQgbWV0aG9kbmFtZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFkZXN0cnVjdC9qYXZhZGVzdHJ1Y3RfZGVyaXZlZCAoSmF2YSkgb3IgY3NkZXN0cnVjdC9jc2Rlc3RydWN0X2Rlcml2ZWQgKEMjKQogICAgICAgICAgICB0eXBlbWFwcyBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lLiBGb3IgZXhhbXBsZSBpbiBKYXZhIHRoZSBkZXN0cnVjdG9yIGlzIAogICAgICAgICAgICB3cmFwcGVkIGJ5IGRlZmF1bHQgd2l0aCB0aGUgZGVsZXRlIG1ldGhvZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZGVzdHJ1Y3QsIG1ldGhvZG5hbWU9ImRlbGV0ZSIpIFNXSUdUWVBFIHsuLi59CgowNi8yNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgdGhyb3dzIGF0dHJpYnV0ZSBmb3IgYWRkaW5nIGV4Y2VwdGlvbiBjbGFzc2VzIHRvIHRoZSB0aHJvd3MKICAgICAgICAgICAgY2xhdXNlIGFsc28gbm93IHdvcmtzIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlbWFwczogCiAgICAgICAgICAgIG5ld2ZyZWUKICAgICAgICAgICAgamF2YWluLCBqYXZhb3V0IChKYXZhKQogICAgICAgICAgICBjc2luLCBjc291dCAoQyMpCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlICdBbkV4Y2VwdGlvbicgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGhyb3dzIGNsYXVzZSBpbiB0aGUKICAgICAgICAgICAgcHJveHkgZnVuY3Rpb246CgogICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0LCB0aHJvd3M9IkFuRXhjZXB0aW9uIikgaW50IHsKICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWx1ZT0kam5pY2FsbDsKICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZT09MCkgdGhyb3cgbmV3IEFuRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgICAgICAgIH0KCjA2LzI1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIHR5cGVtYXAgbWFyc2hhbGxpbmcgY2hlY2tzIGZvciBudWxsIHBvaW50ZXJzIHdoZW4KCSAgICB3YWxraW5nIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbnN0ZWFkIG9mIHJlbHlpbmcgc29sZXkgb24gdGhlIHBhcmFtZXRlcgoJICAgIGNvdW50LiAgQ3VyZXMgYSBzZWdmYXVsdCB0aGF0IG9jY3VycmVkIGZvciBtdWx0aXBsZSBhcmd1bWVudCBpbnYgdHlwZW1hcHMuCgkgICAgU29tZW9uZSB3aXRoIG1vcmUgU3dpZyBleHBlcmllbmNlIHNob3VsZCBwcm9iYWJseSByZXZpZXcgdGhpcyBjb2RlLgoKMDYvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBEb24ndCBlbWl0IGNhbGxzIHRvICJDX2NoZWNrX2Zvcl9pbnRlcnJ1cHQiLAoJICAgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gZW5kbGVzcyBsb29wLiAgUGF0Y2ggYnkgZmVsaXhAcHJveGltYS1tdC5kZS4KCjA2LzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpbmFsaXplcnMgbm93IHVzZSBkZXN0cnVjdG9yIHN5bnRheCBhcyB0aGUgb3ZlcnJpZGUgd2hpY2ggd2FzIHVzZWQgaW4gCiAgICAgICAgICAgIHRoZSBGaW5hbGl6ZSBtZXRob2QgaXMgbm90IGluIHRoZSBFQ01BIHN0YW5kYXJkcywgc3BvdHRlZCBieSB0aGUgTVMgY29tcGlsZXIuCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBIG51bWJlciBvZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHJlbW92ZSB0aGUgSmF2YSBuYW1pbmcgCiAgICAgICAgICAgIHRoYXQgd2FzIHVzZWQgaW4gdGhlIEMjIG1vZHVsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqbmkgICAgICAgICAgICAgICAgICAgICAgICAgLT4gY3R5cGUKICAgICAgICAgICAganR5cGUgICAgICAgICAgICAgICAgICAgICAgIC0+IGltdHlwZQogICAgICAgICAgICBqc3R5cGUgICAgICAgICAgICAgICAgICAgICAgLT4gY3N0eXBlCiAgICAgICAgICAgIGphdmFpbiAgICAgICAgICAgICAgICAgICAgICAtPiBjc2luCiAgICAgICAgICAgIGphdmFvdXQgICAgICAgICAgICAgICAgICAgICAtPiBjc291dAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcyAgICAgICAgICAgICAgLT4gY3NpbnRlcmZhY2VzCiAgICAgICAgICAgIGphdmFiYXNlICAgICAgICAgICAgICAgICAgICAtPiBjc2Jhc2UKICAgICAgICAgICAgamF2YWNsYXNzbW9kaWZpZXJzICAgICAgICAgIC0+IGNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgamF2YWNvZGUgICAgICAgICAgICAgICAgICAgIC0+IGNzY29kZQogICAgICAgICAgICBqYXZhaW1wb3J0cyAgICAgICAgICAgICAgICAgLT4gY3NpbXBvcnRzCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyAtPiBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFnZXRjcHRyICAgICAgICAgICAgICAgICAtPiBjc2dldGNwdHIKICAgICAgICAgICAgamF2YWZpbmFsaXplICAgICAgICAgICAgICAgIC0+IGNzZmluYWxpemUKCiAgICAgICAgICAgIEZlYXR1cmUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqYXZhY29uc3QgICAgICAgICAgICAgICAgICAgLT4gY3Njb25zdAogICAgICAgICAgICBqYXZhbWV0aG9kbW9kaWZpZXJzICAgICAgICAgLT4gY3NtZXRob2Rtb2RpZmllcnMKCiAgICAgICAgICAgIFByYWdtYSBjaGFuZ2VzOgogICAgICAgICAgICBwcmFnbWEoamF2YSkgICAgICAgICAgICAgICAgLT4gcHJhZ21hKGNzaGFycCkKICAgICAgICAgICAgam5pY2xhc3NiYXNlICAgICAgICAgICAgICAgIC0+IGltY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgICAgICAtPiBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3Njb2RlICAgICAgICAgICAgICAgIC0+IGltY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0cyAgICAgICAgICAgICAtPiBpbWNsYXNzaW1wb3J0cwogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZXMgICAgICAgICAgLT4gaW1jbGFzc2ludGVyZmFjZXMKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSAgICAgICAgICAgICAgLT4gJGNzY2xhc3NuYW1lCiAgICAgICAgICAgICRqYXZhaW5wdXQgICAgICAgICAgICAgICAgICAtPiAkY3NpbnB1dAogICAgICAgICAgICAkam5pY2FsbCAgICAgICAgICAgICAgICAgICAgLT4gJGltY2FsbAoKICAgICAgICAgICAgVGhpcyB3aWxsIGJyZWFrIFNXSUcgaW50ZXJmYWNlIGZpbGVzIHRoYXQgdXNlIHRoZXNlIHR5cGVtYXBzLCBmZWF0dXJlcwogICAgICAgICAgICBhbmQgcHJhZ21hcy4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgb3IgdXNlIG1hY3JvcyBmb3IgYmFja3dhcmRzCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gQXBwbGllZCBNelNjaGVtZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieQoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBtenNjaGVtZSB0byB1c2UgU1dJRydzIGNvbW1vbiBydW50aW1lIHR5cGUKICAgICAgICAgICAgICBzeXN0ZW0gZnJvbSBjb21tb24uc3dnLiAKCgkgICAgLSBUaGUgTGliL216c2NoZW1lIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyB0aGUgbGFuZ3VhZ2UgbW9kdWxlczoKICAgICAgICAgICAgICBtenNjaGVtZS5pIHdhcyBtb3ZlZCB0byBtenNjaGVtZS5zd2csIG16c2NoZW1lLnN3ZyBhbmQKICAgICAgICAgICAgICBtenNjaGVtZWRlYy5zd2cgaGF2ZSBiZWVuIHJlbW92ZWQsIG16cnVuLnN3ZyAod2hpY2gKICAgICAgICAgICAgICBjb250YWlucyB0aGUgcnVudGltZSBjb2RlKSBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgIC0gVGhlIHN3aWdfcHJveHkgc3RydWN0dXJlIHdhcyByZW5hbWVkIHRvIHN3aWdfbXpfcHJveHkuCiAgICAgICAgICAgICAgc3dpZ19tel9wcm94eSBub3cgY29udGFpbnMgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8KICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAKCgkgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQKICAgICAgICAgICAgICBTV0lHVFlQRSAmLgoKCSAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBieSBjYWxsaW5nIHNjaGVtZV9hZGRfZmluYWxpemVyKCkgaGFzCiAgICAgICAgICAgICAgYmVlbiBhZGRlZC4KCgkgICAgKioqIE5FVyBGRUFUVVJFIFtNelNjaGVtZV0gKioqCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwczogamF2YWRlc3RydWN0IGFuZCBqYXZhZGVzdHJ1Y3RfZGVyaXZlZAogICAgICAgICAgICBmb3IgdGhlIEMrKyBkZXN0cnVjdG9yIHdyYXBwZXIuIFRoZSBqYXZhZGVzdHJ1Y3QgdmVyc2lvbiBnZXRzIHVzZWQgYnkKICAgICAgICAgICAgY2xhc3NlcyBhdCB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGNoYWluIGFuZCB0aGUgamF2YWRlc3RydWN0X2Rlcml2ZWQgCiAgICAgICAgICAgIHZlcnNpb24gZ2V0cyB1c2VkIGJ5IG90aGVyIGNsYXNzZXMuCgogICAgICAgICAgICBbQyNdIGNpbGRpc3Bvc2UgYW5kIGNpbGRpc3Bvc2VvdmVycmlkZSB0eXBlbWFwcyByZXBsYWNlZCBieQogICAgICAgICAgICBjc2Rlc3RydWN0IGFuZCBjc2Rlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcHMuIFRoZSBkZWxldGUoKQogICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkgcHV0IGludG8gdGhlc2UKICAgICAgICAgICAgdHlwZW1hcHMgZGVzaWduZWQgZm9yIHRoZSBEaXNwb3NlKCkgbWV0aG9kLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcHMgY3NpbnRlcmZhY2VzIGFuZCBjc2ludGVyZmFjZXNfZGVyaXZlZCByZXBsYWNlCiAgICAgICAgICAgIHRoZSBqYXZhaW50ZXJmYWNlcyB0eXBlbWFwLiBBbHNvIGZpeGVzIHRoZSBwZWN1bGlhcml0eSBvZiBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiBpbmRpdmlkdWFsbHkgZGVyaXZpbmcgZnJvbSB0aGUgSURpc3Bvc2FibGUgCiAgICAgICAgICAgIGludGVyZmFjZS4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXAgY3NmaW5hbGl6ZSBmb3IgZmluYWxpemVycy4gQysrIGRlc3RydWN0b3JzIGFyZSBub3cgY2FsbGVkCiAgICAgICAgICAgIGJ5IGdhcmJhZ2UgY29sbGVjdG9yIGR1cmluZyBmaW5hbGl6YXRpb24uIFByb2JsZW0gcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEFuZHJlYXMgU2No9nJrLgoKMDYvMTAvMjAwMzogVGlnZXIKCSAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIGZvciBlcnJvciBtZXNzYWdlIG91dHB1dC4KICAgICAgICAgICAgQ29udHJhY3QgY29kZSBjYW4gbm93IHByaW50IG91dCBzaW1wbGUgZXJyb3IgbWVzc2FnZS4KICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSB0byBwcmVwYXJlIGZvciBpbmhlcml0YW5jZQogICAgICAgICAgICAKMDYvMDMvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZV0gQXBwbGllZCBHdWlsZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieSAKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uIAoKCSAgICAtIFNXSUcgY3VycmVudGx5IHVzZXMgR3VpbGUncyBnaF8gQVBJLCB3aGljaCBpcyBtYXJrZWQgYXMKCSAgICAgIGRlcHJlY2F0ZWQgaW4gR3VpbGUgMS42IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3VpbGUKCSAgICAgIDEuOS4gIFRoaXMgY2hhbmdlIGludHJvZHVjZXMgYSBjb21tYW5kLWxpbmUgZmxhZyAiLXNjbSIKCSAgICAgIHdoaWNoIGNhdXNlcyBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIHRoYXQgdXNlIEd1aWxlJ3MKCSAgICAgIFNDTSBBUEkgaW5zdGVhZDsgdGhpcyByZXF1aXJlcyBHdWlsZSA+PSAxLjYuCgkgICAgCgkgICAgLSBUaGUgTGliL2d1aWxlIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyBsYW5ndWFnZSBtb2R1bGVzOiBndWlsZWRlYy5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGUuc3dnIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGd1aWxlX2doX3J1bi5zd2csCiAgICAgICAgICAgICAgZ3VpbGUuaSBoYXMgYmVlbiBtb3ZlZCB0byBndWlsZV9naC5zd2csIGd1aWxlX3NjbS5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGVfc2NtX3J1bi5zd2cgd2hpY2ggY29udGFpbiB0aGUgU0NNIEFQSSBzdHVmZgogICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZAoKCSAgICAtIGdoaW50ZXJmYWNlLmksIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbmVzIGZyb20gdGhlIGdoXwogICAgICAgICAgICAgIGZ1bmN0aW9ucyB0byB0aGUgc2NtX2Z1bmN0aW9ucyBoYXMgYmVlbiBhZGRlZAoKCSAgICAtIFRoZSBBUEkgZm9yIGRlYWxpbmcgd2l0aCBwb2ludGVyIG9iamVjdHMgaXMgbm93CgkgICAgICBTV0lHX0NvbnZlcnRQdHIsIFNXSUdfTXVzdEdldFB0ciwgU1dJR19OZXdQb2ludGVyT2JqLgoKICAgICAgICAgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQgU1dJR1RZUEUgJgoKICAgICAgICAgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgW0d1aWxlXSAqKioKCSAgICAJCjA2LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaW1lbnNpb25sZXNzIGFycmF5cyBzdWNoIGFzIAoKICAgICAgICAgICAgICAgIGludCBmb29bXSA9IHsxLCAyfTsKICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYmFyW107CgogICAgICAgICAgICBwcm9kdWNlIGEgd2FybmluZyB0aGF0IHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkuIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlLCB0aGlzIHVzZWQgdG8gY2F1c2UgY29tcGlsZSBlcnJvcnMgb3IgZ2VuZXJhdGUgYSBzZXR0ZXIgdGhhdAogICAgICAgICAgICBnZW5lcmF0ZWQgYSBydW50aW1lIGVycm9yLiBBIHNldHRlciBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXJyYXkgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBTV0lHLiBBIHZhcmluLCBnbG9iYWxpbiAKICAgICAgICAgICAgb3IgbWVtYmVyaW4gdHlwZW1hcCAoZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpIG11c3QgYmUgd3JpdHRlbiAKICAgICAgICAgICAgYnkgdGhlIHVzZXIuCgowNS8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZW1lbnQgdG8gZGVmYXVsdCB0eXBlbWFwIG1hdGNoaW5nIGFuZCBhcnJheXMuICBXaGVuIGFuCiAgICAgICAgICAgIGFycmF5IGlzIGRlY2xhcmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvb1s0XTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXAgbm93IHJlc29sdmVzIHRvIAoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbQU5ZXQoKICAgICAgICAgICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgZm9yIHRoYXQsIGl0IHRoZW4gcmVzb2x2ZXMgdG8KCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KCiAgICAgICAgICAgIElmIG5vIGFycmF5IGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLAogICAgICAgICAgICB0aGUgU1dJR1RZUEUgW10gaXMgdXNlZCByaWdodCBhd2F5LiAKCiAgICAgICAgICAgIE5vdGU6IFRoaXMgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdG8gcmVzb2x2ZSBwcm9ibGVtcyByZWxhdGVkIHRvCiAgICAgICAgICAgIGFycmF5cyB3aXRoIGFuZCB3aXRob3V0IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgc29tZXRpbWVzIFNXSUcKICAgICAgICAgICAgd2FzIGdlbmVyYXRpbmcgc2V0dGVyIGZ1bmN0aW9ucyBmb3IgYXJyYXkgdmFyaWFibGVzIHdpdGggbm8gZGltZW5zaW9ucwogICAgICAgICAgICAoYW4gZXJyb3IpLiBMaWtld2lzZSwgU1dJRyBzb21ldGltZXMgbWFkZSBhcnJheXMgd2l0aCBkaW1lbnNpb25zCiAgICAgICAgICAgIHJlYWQtb25seSAoYWxzbyBhbiBlcnJvcikuICBUaGlzIGZpeGVzIHRoZSBhcnJheXNfZ2xvYmFsIHRlc3QKICAgICAgICAgICAgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA1LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHR5cGUgaGFuZGxpbmcgYnVnIHdpdGggcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIHlvdSBoYWQgZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgICAgICAgIEZvbyAqZnVuYzEoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jMihCYXIgJngpOwoKICAgICAgICAgICAgVGhlbiBmdW5jMigpIHdvdWxkbid0IGFjY2VwdCBvYmplY3RzIHJldHVybmVkIGJ5IGZ1bmMxKCkKICAgICAgICAgICAgYmVjYXVzZSBvZiBhIHR5cGUgZXJyb3IuICAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmlhbiBZYW5nLgoKMDUvMjEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHRvIHNvbWUgb2YgdGhlIFZpc3VhbCBDKysgZXhhbXBsZSBwcm9qZWN0IGZpbGVzIHdoaWNoIHdvdWxkIG5vdCAKICAgICAgICAgICAgd29yayB3aXRoIHNwYWNlcyBpbiB0aGUgcGF0aHMgaGVsZCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgdG8gCiAgICAgICAgICAgIHBvaW50IHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UncyBsaWJyYXJ5IC8gaW5jbHVkZSBkaXJlY3RvcnkuCiAgICAgICAgICAgIFNGIGJ1ZyAjNzQwNzY5CgowNS8yMS8yMDAzOiAgc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtY29udHJhY3RzIG9wdGlvbi4KICAgICAgICAgICAgRmlyc3QgdHJ5IG9mIHRoZSBpZGVhIG9mICJXcmFwIGJ5IENvbnRyYWN0IjogCiAgICAgICAgICAgIGJ1aWxkIHVwIHJlYWxpYWJsZSBjcm9zcy1sYW5ndWFnZSBtb2R1bGUgYnkgd3JhcHBpbmcgd2l0aCBTV0lHLgogICAgICAgICAgICBJbXBsZW1lbnRlZCBiYXNpYyBhc3NlcnRpb24KICAgICAgICAgICAgKHByZWFzc2VydGlvbiAmIHBvc3Rhc3NlcnRpb24gJiBpbnZhcmlhbnQpCiAgICAgICAgICAgIGZvciBzaW1wbGUgQy9DKysgZnVuY3Rpb25zLgogICAgICAgICAgICAKICAgICAgICAgICAgQ3VycmVudCBmb3JtYXQgb2YgY29udHJhY3RzIGFyZToKICAgICAgICAgICAgJWNvbnRyYWN0IGNsYXNzX25hbWUgOjogZnVuY19uYW1lIChwYXJhcy4uLikgewogICAgICAgICAgICByZXF1aXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByczsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBlbnN1cmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgaW52YXJpYW50OgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCSAgICAJCjA1LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCB0d2Vha3MuIFRoZXJlIHdlcmUgYSBmZXcgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIHdoaWNoIHdlcmUKICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBNYWtlZmlsZSBmb3IgcGFzc2luZyBvbiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjb21waWxpbmcuCiAgICAgICAgICAgIFRoZXNlIGFyZSBub3cgYWxsIGRlZmluZWQgaW4gc3dpZ2NvbmZpZy5oLiBBdXRvY29uZiBkb2Vzbid0IG5vcm1hbGx5IAogICAgICAgICAgICBhbGxvdyBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIGNvbmZpZyBoZWFkZXIgZmlsZSwgCiAgICAgICAgICAgIGJ1dCBhbiBhdXRvY29uZiBhcmNoaXZlIG1hY3JvIGVuYWJsZXMgdGhpcy4gVGhpcyBtYWNybyBhbG9uZyB3aXRoIGZ1dHVyZSAKICAgICAgICAgICAgYXV0b2NvbmYgbWFjcm9zIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIFRvb2xzL2NvbmZpZyBkaXJlY3RvcnkuCgogICAgICAgICAgICAnc3dpZyAtdmVyc2lvbicgbm93IHJlcG9ydHMgdGhlIHRhcmdldCBidWlsZCBwbGF0Zm9ybS4KCjA1LzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEZpeCB0byB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOgoKICAgICAgICAgICAgamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KCiAgICAgICAgICAgIFRoZXNlIGFyZSB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZy9nZW5lcmF0aW5nIHByb3h5IGNsYXNzZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIHdvdWxkIHVzZSB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgbm90IHRoZSAKICAgICAgICAgICAgQysrIHR5cGUsIHdoaWNoIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdHlwZW1hcHMuIAoKICAgICAgICAgICAgSW4gbW9zdCBjaXJjdW1zdGFuY2VzIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCB0aGUgQysrIGNsYXNzIG5hbWUvdHlwZSAKICAgICAgICAgICAgaXMgdGhlIHNhbWUgZXhjZXB0IGZvciBjbGFzc2VzIGluIG5hbWVzcGFjZSwgdGVtcGxhdGVkIGNsYXNzZXMgZXRjLiBzbwogICAgICAgICAgICB0aGlzIHNob3VsZG4ndCBhZmZlY3QgbW9zdCBjYXNlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIGFuZCBDIyBNT0RVTEVTICoqKgoKMDUvMDkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZpc3VhbCBDKysgUHJvamVjdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgICAgY2FuIGJlIGJ1aWx0IG9uIFdpbmRvd3MgKGZvciBUY2wsIFBlcmwsIFB5dGhvbiBhbmQgUnVieSkuCgowNS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCByZXR1cm4gYnkgdmFsdWUsIGNvbnN0LCBhbmQgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgIEIoKTsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIEIoY29uc3QgQiYpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgQiByZXR1cm5CKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcm9ibGVtIGFuZCBwYXRjaCBzdWdnZXN0aW9uIHJlcG9ydGVkIGJ5IEJpbGwgSG9mZm1hbi4KCjA0LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFNpbmdsZSBhdXRvY29uZiBpbnZvY2F0aW9uIC0gYXV0b2NvbmYgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeSBoYXMgZ29uZS4KCiAgICAgICAgICAgIC0gTGlidG9vbCBib290c3RyYXBwZWQgd2hlbiBydW5uaW5nIGF1dG9nZW4uc2guIFRoaXMgcmVxdWlyZXMgYW55b25lCiAgICAgICAgICAgICAgdXNpbmcgdGhlIGN2cyB2ZXJzaW9uIG9mIFNXSUcgdG8gaGF2ZSBsaWJ0b29sIGluc3RhbGxlZCBvbiB0aGVpcgogICAgICAgICAgICAgIG1hY2hpbmUuIFN1Z2dlc3QgdmVyc2lvbiAxLjQuMiBvciBoaWdoZXIsIHByZWZlcmFibHkgdGhlIGxhdGVzdCAtIDEuNS4KCiAgICAgICAgICAgIC0gQXV0b21ha2UgaXMgbm93IHVzZWQgdG8gYnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGluIGNvbmp1bmN0aW9uIAogICAgICAgICAgICAgIHdpdGggbGlidG9vbC4KCiAgICAgICAgICAgIC0gUnVudGltZSBsaWJyYXJpZXMgYXJlIG5vdyBzdWNjZXNzZnVsbHkgYnVpbHQgYXMgRExMcyBvbiBDeWd3aW4uCgogICAgICAgICAgICAtIFNraXBwaW5nIGxhbmd1YWdlcyBpcyBubyBsb25nZXIganVzdCBkZXRlcm1pbmVkIGluIHRoZSB0b3AgbGV2ZWwgCiAgICAgICAgICAgICAgbWFrZWZpbGUgYnV0IGluIGNvbmZpZ3VyZS5pbi4gVGhpcyBpbmZvIGlzIHVzZWQgZm9yIGJ1aWxkaW5nCiAgICAgICAgICAgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBmb3IgcnVubmluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAtIFRoZXNlIGNoYW5nZXMgaGF2ZSBmaXhlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcnkgYnVpbGRzLCB0aGF0IGlzCiAgICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAKICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZnJvbSBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBhbHNvIHdvcmtpbmcuIEFuIGluaXRpYWwKICAgICAgICAgICAgICBjb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhcyBkZXNjcmliZWQKICAgICAgICAgICAgICBpbiAwNC8wMi8yMDAzIGVudHJ5LiBBICdtYWtlIGRpc3RjbGVhbicgd2lsbCBiZSBuZWVkZWQgYmVmb3JlIGJ1aWxkaW5nCiAgICAgICAgICAgICAgaW4gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpZiB0aGUgYXV0b3Rvb2xzIAogICAgICAgICAgICAgIGhhdmUgYmVlbiBydW4gZnJvbSB0aGlzIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgc29tZSBwb2ludCwgYnV0IAogICAgICAgICAgICAgIGF1dG9jb25mIHdpbGwgdGVsbCB5b3UgdGhpcy4gTm90ZSB0aGF0ICdtYWtlIGNoZWNrJyBvbmx5IHdvcmtzIGZyb20gCiAgICAgICAgICAgICAgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgdGhlIG1vbWVudC4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3MjM0NzEgXSBXcmFwcGVyX3ByaW50KCkgZmFpbHMgd2l0aCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiBjb25zdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIGhhbmRsaW5nIAogICAgICAgICAgICBkZXNjcmliZWQgaW4gQ0hBTkdFUyAwOC8xMS8yMDAyLiAgIFByZXZpb3VzbHksIFNXSUcgbWVyZWx5CiAgICAgICAgICAgIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbiBpbml0aWFsaXplciBpbiB0aGUgZGVjbGFyYXRpb24uCiAgICAgICAgICAgIE5vdywgU1dJRyBhZGRpdGlvbmFsbHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIG1lbWJlcgogICAgICAgICAgICBpcyBjb25zdC4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIGtpbmQgb2YgbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSwKICAgICAgICAgICAgYWN0aXZhdGVkIHVzaW5nIHRoZSAtbWluaGVyaXQgY29tbWFuZC1saW5lIG9wdGlvbi4gSSd2ZSBhbHNvIHVwZGF0ZWQKICAgICAgICAgICAgdGhlICJDKysgSW5oZXJpdGFuY2UiIHNlY3Rpb24gb2YgdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byBkaXNjdXNzCiAgICAgICAgICAgIGhvdyB0aGlzIHdvcmtzLCBhbmQgaXRzIGxpbWl0YXRpb25zLiBBbHNvIGFsc28gbW9kaWZpZWQgdGhlIG1pbmhlcml0LmkKICAgICAgICAgICAgdGVzdCBjYXNlIHRvIHJ1biBhZ2FpbnN0IHRoaXMuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIC1nbG9iYWxtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbiBmb3IgdGhlIFJ1YnkKICAgICAgICAgICAgbW9kdWxlLCBmb3Igd3JhcHBpbmcgc3R1ZmYgaW50byB0aGUgZ2xvYmFsIG1vZHVsZSAoS2VybmVsKSBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGEgbmVzdGVkIG1vZHVsZS4gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgoKMDQvMjMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgc3ltbmFtZSBlcnJvciBpbiBkaXJlY3RvciBjYWxscyB0byBQeXRob24gbWV0aG9kcwoJICAgIHRoYXQgZXh0ZW5kIEMrKyBvcGVyYXRvcnMuCgoJICAgIFN0b3BwZWQgZGlyZWN0b3IgZGVzdHJ1Y3RvciB3cmFwcGVycyBmcm9tIGNhbGxpbmcgX19zZXRfdXAsCgkgICAgd2hpY2ggd2FzIGxlYXZpbmcgdGhlIGRpcmVjdG9yIGZsYWcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgoKMDQvMjMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggbmFtZXNwYWNlIHJlc29sdXRpb24gYW5kIG5lc3RlZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBbGZyZWQgTG9yYmVyIChhbmQgTWFyY2VsbyBNYXR1cykuCgowNC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUGF0Y2ggZm9yIEphdmEgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdG8gcnVuIG9uIE1hYyBPUyBYLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEluY29ycG9yYXRlZCBOb2J1IE5ha2FkYSdzIHBhdGNoZXMgZm9yIHN1cHBvcnRpbmcgdGhlIFJ1YnkKICAgICAgICAgICAgMS44IGFsbG9jYXRpb24gZnJhbWV3b3JrLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlcGxhY2VkIGFsbCB1c2VzIG9mIHRoZSBkZXByZWNhdGVkIFNUUjJDU1RSKCkgbWFjcm8gd2l0aCB0aGUKICAgICAgICAgICAgc2FmZXIgU3RyaW5nVmFsdWVQdHIoKSBtYWNyby4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBydWJ5LXRhbGs6NjcwNTkKICAgICAgICAgICAgYW5kIGZvbGxvdy11cHMgdG8gdGhhdCBwb3N0LgoKMDQvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcHJlcHJvY2Vzc29yIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1pbih4LHkpICgoeCkgPCAoeSkpID8gKHgpIDogKHkpIAogICAgICAgICAgICAgICAgaW50IGYoaW50IG1pbik7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBTZWJhc3RpZW4gUmVjaW8uCgowNC8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIGEgcnVudGltZSBjaGVjayB0byB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pIGxpYnJhcnkgdG8gY2hlY2sgCiAgICAgICAgICAgIHRoYXQgdGhlIEphdmEgYXJyYXkgcGFzc2VkIGluIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIEMgYXJyYXkgYW5kIHRocm93IGFuIAogICAgICAgICAgICBleGNlcHRpb24gaWYgbm90LgoKICAgICAgICAgICAgQWxzbyBmaXggdG8gdXNlIGRlbGV0ZSBpbnN0ZWFkIG9mIGZyZWUgZm9yIGFycmF5cyBjcmVhdGVkIHVzaW5nIG5ldy4KCjA0LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZW1vdmUgR0NDMyB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZToKCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogY2hhbmdpbmcgc2VhcmNoIG9yZGVyIGZvciBzeXN0ZW0gZGlyZWN0b3J5ICIvdXNyL2luY2x1ZGUiCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgYSBub24tc3lzdGVtIGRpcmVjdG9yeSAKCiAgICAgICAgICAgIFNlZSBTRiBwYXRjaCAjNzE1NTMxIHN1Ym1pdHRlZCBieSBHZXJhbGQgV2lsbGlhbXMKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcHJvdmVkIHdyYXBwaW5nIG9mIGVudW1zIGFuZCBjb25zdGFudHMuIFRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICB3cmFwcGVkIGFzIEMjIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBjb25zdGFudHMuIEVpdGhlciB0aGVzZSBhcmUgd3JhcHBlZAogICAgICAgICAgICBhcyByZWFkb25seSAocnVudGltZSkgY29uc3RhbnRzIG9yIGNvbXBpbGUgdGltZSBjb25zdGFudHMsIGRlcGVuZGluZyBvbgogICAgICAgICAgICB0aGUgJWphdmFjb25zdCBkaXJlY3RpdmUgKFRoZSBkaXJlY3RpdmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBuYW1lIHNvb24pLgogICAgICAgICAgICBGb3IgZXhhbXBsZSB3cmFwcGluZzoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDApOwogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDIyCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBYWVo7CiAgICAgICAgICAgICAgI2RlZmluZSBYWVogMzMKICAgICAgICAgICAgaXMgbm93OgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IEFCQyA9IGV4YW1wbGVQSU5WT0tFLmdldF9BQkMoKTsKICAgICAgICAgICAgICBwdWJsaWMgY29uc3QgaW50IFhZWiA9IDMzOwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBHbG9iYWwgY29uc3RhbnRzIGFuZCBlbnVtcyBhcmUgcHV0IGluIHRoZWlyIG93biBpbnRlcmZhY2UgY2FsbGVkCiAgICAgICAgICAgIHh4eENvbnN0YW50cywgd2hlcmUgeHh4IGlzIHRoZSBtb2R1bGUgbmFtZS4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCBhcyAKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gZGVyaXZlIChpbXBsZW1lbnQpIGEgSmF2YSBjbGFzcyBmcm9tIHRoZSB4eHhDb25zdGFudHMKICAgICAgICAgICAgaW50ZXJmYWNlIHRvIGltcHJvdmUgdGhlIHN5bnRheDsgbmFtZWx5IHdoZW4gd3JhcHBpbmc6CiAgICAgICAgICAgICAgZW51bSB7T05FPTEsIFRXTywgVEhSRUV9OwogICAgICAgICAgICBhY2Nlc3NpbmcgdGhlc2UgZnJvbSBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nIHh4eENvbnN0YW50cyBpcyBuZWF0ZXI6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IE9ORTsKICAgICAgICAgICAgdGhhbiB0aGUgcHJldmlvdXM6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IHh4eC5PTkU7CgogICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRGF2ZSBEcmliaW4uCgowNC8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgaW1wcm92ZW1lbnRzIGZvciBtdWx0aXBsZSBidWlsZHMuIFRoaXMgYWxsb3dzIG9uZSB0byBidWlsZAogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlIGFuZCBydW50aW1lIGxpYnJhcmllcyBmb3IgZGlmZmVyZW50IHBsYXRmb3Jtcy9jb21waWxlcnMgCiAgICAgICAgICAgIGV0YyBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuIFRoaXMgaXNuJ3QgMTAwJSBqdXN0IAogICAgICAgICAgICB5ZXQgYW5kIHdvbid0IGJlIHVudGlsIGxpYnRvb2wgaXMgYmV0dGVyIGNvbmZpZ3VyZWQuLi4gYSAnY29uZmlndXJlJyBhbmQgCiAgICAgICAgICAgICdtYWtlIGRpc3RjbGVhbicgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWZvcmUgaXQgYWxsIHdvcmtzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAkIC4vY29uZmlndXJlCiAgICAgICAgICAgICAgJCBtYWtlIGRpc3RjbGVhbgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMTsgY2QgY29uZmlnMTsgLi4vY29uZmlndXJlIENDPWdjYyBDWFg9ZysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMjsgY2QgY29uZmlnMjsgLi4vY29uZmlndXJlIENDPWNjIENYWD1jKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgIAogICAgICAgICAgICBUbyBiZSBpbXByb3ZlZC4gQSAnbWFrZSBjaGVjaycgZG9lcyBub3Qgd29yayB5ZXQgZWl0aGVyLiAKCjA0LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudCBleHBhbnNpb24gYnVnLgogICAgICAgICAgICBUaGlzIHNob3dlZCB1cCB3aGVuIHRyeWluZyB0byB1c2Ugc3RkX3ZlY3Rvci5pIHdpdGggdmVjdG9ycwogICAgICAgICAgICBvZiBwb2ludGVycy4KCjAzLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHBhcmFsbGVsIG1ha2UgYnVpbGRzIG9mIFNXSUcsIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgbWFrZSAtaiA0CiAgICAgICAgICAgIEJ1aWxkIGZhaWx1cmUgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UuCgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlbGVhc2VkIDEuMy4xOS4KCgoKVmVyc2lvbiAxLjMuMTkgKE1hcmNoIDI4LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFZhcmlldHkgb2YgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSAxLjMuMTggcmVsZWFzZSBpbmNsdWRpbmc6CgogICAgICAgICAgICAgICAgLSBTZWdtZW50YXRpb24gZmF1bHQgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICAgIC0gVHlwZW1hcCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBFeHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBMYXJnZSBtZW1vcnkgbGVhayB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4KClZlcnNpb24gMS4zLjE4IChNYXJjaCAyMywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0d28gcHJvYmxlbXMgd2l0aCB0aGUgJWV4dGVuZCBkaXJlY3RpdmUsIG92ZXJsb2FkaW5nLCBhbmQKICAgICAgICAgICAgdGVtcGxhdGUgZXhwYW5zaW9uLiAgU2VlIHRoZSAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkJyBhbmQKICAgICAgICAgICAgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZF8yJyB0ZXN0cyBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlIGZvcgogICAgICAgICAgICBkZXRhaWxzLgoKMDMvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQWRkZWQgc29tZSB0eXBlbWFwcyBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBTY2hvZXJrIGZvciBoYW5kbGluZwogICAgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBhcyBwb2ludGVycyBvciBieSByZWZlcmVuY2UuIFRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiBwdXQgaW4gdHlwZW1hcHMuaS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBDKysgc2NvcGluZyBidWcgcmVsYXRlZCB0byBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgRm9vOjpiYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5LCBTV0lHIGp1c3QgdG9zc2VkIG91dCB0aGUgRm9vOjpiYXIoKSBkZWNsYXJhdGlvbi4gTm93LAogICAgICAgICAgICB0aGUgZGVjbGFyYXRpb24gaXMgd3JhcHBlZCBwcm92aWRlZCB0aGF0IHRoZSBwcmVmaXggaXMgZXhhY3RseSB0aGUKICAgICAgICAgICAgc2FtZSBhcyB0aGUgY3VycmVudCBzY29wZSAoaW5jbHVkaW5nIGFueSBlbmNsb3NpbmcgbmFtZXNwYWNlcykuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJydWNlIExvd2VyeS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgNjk2NTE2IF0gRW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcgZm9yIGRhdGEgbWVtYmVyIGFjY2Vzcy4KICAgICAgICAgICAgSW4gc29tZSBjb21waWxlcnMsIGF0dHJpYnV0ZSBhY2Nlc3MgY2FuIGdlbmVyYXRlIGV4Y2VwdGlvbnMuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIG9yZGluYXJpbHkgYXNzdW1lcyB0aGF0IG5vIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuICBUbyBkaXNhYmxlIHRoaXMsCiAgICAgICAgICAgIHVzZSB0aGUgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCB4OyAgICAgLyogRXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgWWFrb3YgTWFya292aXRjaC4gCiAKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUGF0Y2guIFsgNzAxODYwIF0gSW1wcm92ZSBQZXJmb3JtYW5jZSAocHl0aG9uIHByb3hpZXMpLgogICAgICAgICAgICBHaXZlcyBhIHBlcmZvcm1hbmNlIGJvb3N0IHRvIHByb3h5IGNsYXNzIGNvZGUgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQogICAgICAgICAgICAudGhpcyBhbmQgLnRoaXNvd24gYXR0cmlidXRlcy4gIENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjAzLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEFkZGVkIG1pc3NpbmcgdmFyYXJnIHN1cHBvcnQuCgowMy8xOC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBSZW1vdmVkIGNvZGUgcmVsYXRlZCB0byB0YWdnaW5nIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgZGlyZWN0b3JzLgoJICAgIFRoZSBjb25jZXB0IG9mIGhhdmluZyBkaXJlY3RvcnMgZm9yIHNvbWUgYnV0IG5vdCBhbGwgdmlydHVhbCBtZXRob2RzCgkgICAgb2YgYSBjbGFzcyBpcyBkZWVwbHkgZmxhd2VkLiAgVGhlICVmZWF0dXJlKCJub2RpcmVjdG9yIikgdGFnIGlzIGFsc28KCSAgICBnb25lLiAgCgkgICAgCgkgICAgRGlyZWN0b3JzIGFyZSBvZmYgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtIGZvciBhIGNsYXNzLCBpc3N1ZQoJICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIGNsYXNzbmFtZTsgd2hpY2ggd2lsbCBjcmVhdGUgZGlyZWN0b3IgbWV0aG9kcwoJICAgIGZvciBldmVyeSB2aXJ0dWFsIG1ldGhvZCBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcy4KCjAzLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHBhc3NpbmcgYXJndW1lbnRzIG9mIHR5cGUgZnVuY3Rpb24uICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oaW50IHgoaW50LCBpbnQpKTsKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90IHgpOwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zLCB0aGlzIHdvdWxkIHByb2R1Y2UgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuICBOb3csCiAgICAgICAgICAgIFNXSUcgbWVyZWx5IGFkZHMgYW4gZXh0cmEgcG9pbnRlciwgbWFraW5nIHRoZXNlIGRlY2xhcmF0aW9ucyB0aGUgc2FtZQogICAgICAgICAgICBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oaW50ICgqeCkoaW50LCBpbnQpKTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgKngpOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2FydGggQnVzaGVsbC4KCjAzLzE3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciBkaXJlY3RvciBiYXNlIGNsYXNzIGNhbGxzIHRoYXQgaGF2ZSBubwogICAgICAgICAgICByZXR1cm4gdmFsdWUuCgowMy8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnN0IHNtYXJ0LXBvaW50ZXIgd3JhcHBpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5ICJ4IiBhbmQgImJhciIgYXJlIHZpc2libGUgZnJvbSBCbGFoIChzaW5jZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBvZiBzcGFtIHZpb2xhdGVzIGNvbnN0bmVzcykuICBNb3Jlb3ZlciwgYWNjZXNzIHRvICJ4IiBpcyByZWFkLW9ubHkuCiAgICAgICAgICAgCjAzLzE1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENsZWFuZWQgdXAgdHdvIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgY29tcGFyaXNvbnMgaW4gcHl0aG9uL3N0ZF92ZWN0b3IuaS4KCSAgICAKMDMvMTUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gR2xvYmFsIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgZ2V0IGFuZCBzZXQgbWV0aG9kcy4KICAgICAgICAgICAgTWVtYmVyIHZhcmlhYmxlIHdyYXBwaW5nIGJ1ZyBmaXhlcywgZm9yIGV4YW1wbGUgd3JhcHBpbmcgcG9pbnRlcnMgd29yayBub3cuCiAgICAgICAgICAgIFR5cGVtYXBzIGFyZSB1c2VkIGZvciBhbGwgdmFyaWFibGUgd3JhcHBpbmcgdG8gZ2VuZXJhdGUgdGhlIHByb3BlcnR5IGNvZGUuCgowMy8xMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgdmlydHVhbCBtZXRob2QgdW5yb2xsaW5nIGZvciBkaXJlY3RvcnMuIAoJICAgIFRoZSBvcmRlciBvZiB1bnJvbGxpbmcgaXMgbm93IGZyb20gYmFzZSB0byBkZXJpdmVkLCB0byBlbnN1cmUKCSAgICB0aGF0IHRoZSBtb3N0IGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBkaXJlY3RvciBtZXRob2QgaXMKCSAgICBmb3VuZC4KCgkgICAgRGlyZWN0b3IgbWV0aG9kcyBmb3IgcHVyZSB2aXJ0dWFsIG1ldGhvZHMgbm93IHRocm93CgkgICAgRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTiBpZiBfdXAgaXMgc2V0LgoKMDMvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gUG9seW1vcnBoaXNtIGZpeDogdmlydHVhbCBmdW5jdGlvbnMgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgQyMgcHJveHkgY2xhc3MsIHZpcnR1YWwgb3Igb3ZlcnJpZGUuCiAgICAgICAgICAgIFNvbWUgJ3VzaW5nIFN5c3RlbTsnIHN0YXRlbWVudCBmaXhlcyBuZWVkZWQgYnkgdGhlIE1vbm8gY29tcGlsZXIuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIFN3aWdWYWx1ZVdyYXBwZXI8PiB0bwogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcnVjZSBMb3dlcnkuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAkZGVzY3JpcHRvcih0eXBlKSB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgaW4gY29kZSBzdXBwbGllZCB0bwogICAgICAgICAgICAlZXh0ZW5kLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgd3JhcHBpbmcgCiAgICAgICAgICAgIChlc3BlY2lhbGx5IGNvbnRhaW5lciBjbGFzc2VzKS4KCjAzLzExLzIwMDM6IGx1aWdpCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN0ZDo6bWFwLgogICAgICAgICAgICAoYSkgSW50ZWdyYXRpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGEgbGEgc3RkOjp2ZWN0b3IpIGZvcgogICAgICAgICAgICAgICAgUHl0aG9uLCBSdWJ5LCBNelNjaGVtZSwgYW5kIEd1aWxlOwogICAgICAgICAgICAoYikgU2ltcGxlIHdyYXBwZXIgZm9yIG90aGVyIGxhbmd1YWdlcwoKMDMvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICBTV0lHCiAgICAgICAgICAgIHdhc24ndCBwYXJzaW5nIGNlcnRhaW4gb2N0YWwgY29kZXMgY29ycmVjdGx5LgoKMDMvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2Ygc3VidGxlIHByZXByb2Nlc3NvciBwcm9ibGVtcyByZXBvcnRlZCBieQogICAgICAgICAgICBTZWJhc3RpZW4gUmVjaW8uCgogICAgICAgICAgICAoYSkgRW1wdHkgcHJlcHJvY2Vzc29yIHZhbHVlcyBubyBsb25nZXIgZ2VuZXJhdGUgImJhZCBjb25zdGFudAogICAgICAgICAgICB2YWx1ZSIgZXJyb3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTwogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBCQVIKCiAgICAgICAgICAgIChiKSBNYWNybyBuYW1lcyBjYW4gbm93IHNwYW4gbXVsdGlwbGUgbGluZXMgKHRlY2huaWNhbGx5IHZhbGlkLAogICAgICAgICAgICBhbHRob3VnaCBxdWVzdGlvbmFibGUgcHJhY3RpY2UpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEFfTE9OR19NQUNST19cCiAgICAgICAgICAgICAgICAgIE5BTUUgNDIKCiAgICAgICAgICAgIChjKSBXaGl0ZXNwYWNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBiZWZvcmUgY2VydGFpbiBtYWNybyB2YWx1ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08iSGVsbG8iCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQkFSXAogICAgICAgICAgICAgICAgICAiSGVsbG8iCiAKMDMvMDcvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgaW4gdGhlIExpYi9ydWJ5L3R5cGVtYXBzLmkgbGlicmFyeSBmaWxlLgoKMDMvMDcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2NhbGxiYWNrIHRvIGRlbW9zdHJhdGUgaG93IGRpcmVjdG9ycyBjYW4KCSAgICBiZSB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3MgaW4gUHl0aG9uCgkgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2V4dGVuZCB0byBkZW1vbnN0cmF0ZSB2aXJ0dWFsIG1ldGhvZAoJICAgIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiAocmVhbGx5IHRoZSBzYW1lIGFzIHRoZSBjYWxsYmFjawoJICAgIGV4YW1wbGUsIGp1c3QgYSBkaWZmZXJlbnQgY29udGV4dCkuCgkgICAgQWRkZWQgZm91ciB0ZXN0cyBmb3IgdmVyeSBiYXNpYyBkaXJlY3RvciBmdW5jdGlvbmFsaXR5LiAgVGhlc2UKCSAgICBoYXZlIHJ1bnRpbWUgdGVzdHMgdW5kZXIgcHl0aG9uLgoJICAgIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbWl0cyAjZGVmaW5lIFNXSUdfRElSRUNUT1JTIG5lYXIgdGhlCgkgICAgdG9wIG9mIHRoZSBvdXRwdXQgZmlsZSBpZiBkaXJlY3RvcnMgYXJlIGVuYWJsZWQuICBUaGlzIGlzIHVzZWZ1bAoJICAgIGZvciBkaXNhYmxpbmcgcGFydHMgb2YgdGVzdHMgaW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvbid0CgkgICAgc3VwcG9ydCBkaXJlY3RvcnMuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIHNlY3Rpb24gdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbCBvbiBjcm9zcyBsYW5ndWFnZQoJICAgIHBvbHltb3JwaGlzbSAoZGlyZWN0b3JzKS4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFRoZSBzaG9ydC1saXZlZCAiLWZkaXJlY3RvcnMiIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgVG8gZW5hYmxlIGRpcmVjdG9ycywgaW5zdGVhZCB1c2UgdGhlIGV4dGVuZGVkICVtb2R1bGUgCgkgICAgZGlyZWN0aXZlIGFzIGZvbGxvd3M6CgoJICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIpIG1vZHVsZW5hbWUKCjAzLzA2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgbG9uZyBsb25nIHR5cGVtYXBzIGhhdmUgYmVlbiByZXdyaXR0ZW4gc28gdGhhdCB0aGV5IGNhbiBiZSBtb3JlCiAgICAgICAgICAgIGVhc2lseSB1c2VkIHdpdGggbm9uIElTTyBjb21waWxlcnMsIGxpa2UgVmlzdWFsIEMrKy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgaWYgeW91IGFyZSB3cmFwcGluZyB0aGUgV2luZG93cyA2NCBiaXQgdHlwZSBfX2ludDY0IHRoZSBsb25nIGxvbmcKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHk6CgogICAgICAgICAgICAgICAgJWFwcGx5IGxvbmcgbG9uZyB7IF9faW50NjQgfTsKICAgICAgICAgICAgICAgIF9faW50NjQgdmFsdWUxKF9faW50NjQgeCk7CgogICAgICAgICAgICBfX2ludDY0IHdpbGwgbm93IGFwcGVhciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5zdGVhZCBvZiBsb25nIGxvbmcuCiAgICAgICAgICAgIAowMy8wNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgQ0hBTkdFICoqKgogICAgICAgICAgICBTd2lnIG1vZHVsZSBtdXRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgV2hlbiBhIGxhbmd1YWdlCiAgICAgICAgICAgIGNsYXNzIG1ldGhvZCB3YW50cyB0byBzYXZlIG5vZGUgYXR0cmlidXRlcywgaXQgbm93IHVzZXMgb25lIG9mIHRoZQogICAgICAgICAgICBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCkKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVzZSBmdW5jdGlvbnMgaXMgYSBuYW1lc3BhY2UgaW4gd2hpY2gKICAgICAgICAgICAgc2F2ZWQgYXR0cmlidXRlcyBhcmUgcGxhY2VkLiAgRm9yIGV4YW1wbGUsdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgICBOb2RlICpuOwogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoImNEZWNsYXJhdGlvbiIsbiwidHlwZSIsInBhcm1zIiwibmFtZSIsTklMKTsKCiAgICAgICAgICAgIHNhdmVzIHRoZSBhdHRyaWJ1dGVzIGFzICJjRGVjbGFyYXRpb246dHlwZSIsICJjRGVjbGFyYXRpb246cGFybXMiLAogICAgICAgICAgICBhbmQgc28gZm9ydGguICAgSWYgbmVjZXNzYXJ5LCBhIGxhbmd1YWdlIG1vZHVsZSBjYW4gcmVmZXIgdG8KICAgICAgICAgICAgb2xkIHZhbHVlcyBieSB1c2luZyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIHF1YWxpZmllci4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGEgc3BlY2lhbCBhdHRyaWJ1dGUgInZpZXciIGNvbnRhaW5zIHRoZSBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5hbWVzcGFjZSB1c2VkIHRvIHNhdmUgYXR0cmlidXRlcy4gIEluIHRoZSBhYm92ZSAKICAgICAgICAgICAgZXhhbXBsZSwgInZpZXciIHdvdWxkIGhhdmUgdGhlIHZhbHVlICJjRGVjbGFyYXRpb24iLiAgIFRoZSB2YWx1ZQogICAgICAgICAgICBvZiAiY0RlY2xhcmF0aW9uOnZpZXciIHdvdWxkIGhhdmUgdGhlIHByZXZpb3VzIHZpZXcgYW5kIHNvIGZvcnRoLgoKICAgICAgICAgICAgU3dpZ19yZXN0b3JlKG4pIHJlc3RvcmVzIGEgbm9kZSB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBsYXN0CiAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpIG9yIFN3aWdfc2F2ZSgpIGNhbGwuCgogICAgICAgICAgICBOb3RlOiAgVGhpcyBjaGFuZ2UgbWFrZXMgaXQgZWFzaWVyIGZvciBsYW5ndWFnZSBtb2R1bGVzIHRvIHJlZmVyCiAgICAgICAgICAgIHRvIG9sZCB2YWx1ZXMgb2YgYXR0cmlidXRlcy4gIAoKCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1lcmdlZCB0aGUgY3Jvc3MtbGFuZ3VhZ2UgcG9seW1vcnBoaXNtIHBhdGNoLiAgV2hlbiBlbmFibGVkLCBDKysgCgkgICAgInByb3h5IiBjbGFzc2VzIChjYWxsZWQgZGlyZWN0b3JzKSBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHNwZWNpZmllZCAKCSAgICBDKysgY2xhc3MuICBEaXJlY3RvcnMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uLCBzaW1pbGFyIAoJICAgIHRvIHRoZSB3YXkgdGhlIHVzdWFsIHByb3h5IChzaGFkb3cpIGNsYXNzZXMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSAKCSAgICBQeXRob24gdG8gQysrLiAgVG9nZXRoZXIsIHRoZXNlIHR3byB0eXBlcyBvZiBwcm94aWVzIGFsbG93IEMrKyAKCSAgICBjbGFzc2VzIHRoYXQgYXJlIGV4dGVuZGVkIGluIFB5dGhvbiB0byBiZWhhdmUganVzdCBsaWtlIG9yZGluYXJ5IAoJICAgIEMrKyBjbGFzc2VzIGFuZCBiZSB1c2VkIGluIEMrKyBsaWtlIG5hdGl2ZSBvYmplY3RzLiAgCgkgICAgCgkgICAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIFRvIGVuYWJsZSBkaXJlY3RvciBzdXBwb3J0LCBzcGVjaWZ5ICctZmRpcmVjdG9ycycgb24gdGhlIFNXSUcgY29tbWFuZAoJICAgIGxpbmUgb3IgaW4gdGhlIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJbiB0aGUgaW50ZXJmYWNlCgkgICAgZmlsZSwgYWRkICVmZWF0dXJlKCJkaXJlY3RvciIpIHRvIGdlbmVyYXRlIGRpcmVjdG9ycyBmb3IgYWxsIGNsYXNzZXMKCSAgICB0aGF0IGhhdmUgdmlydHVhbCBtZXRob2RzLiAgCgkgICAgCgkgICAgU2VlIGh0dHA6Ly9zdG0ubGJsLmdvdi9+dG0yL3N3aWcvUHJveHlEb2MuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgoJICAgIAoKMDMvMDMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHNtYWxsIGdsaXRjaCBpbiB0eXBlbWFwIGxvY2FsIHZhcmlhYmxlIHJlcGxhY2VtZW50LiAgSWYgeW91IGhhZAogICAgICAgICAgICBhIHR5cGVtYXAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSAoJDFfdHlwZSB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAuLi47CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgbm8gb2NjdXJyZW5jZSBvZiAiJDFfdHlwZSIgYXBwZWFyZWQgaW4gdGhlIGJvZHksIHRoZW4gdGhlIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlIHR5cGUgd291bGRuJ3QgYmUgc3Vic3RpdHV0ZWQuCgowMy8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgdmVyc2lvbiBvZiB0aGUgQ1NoYXJwIG1vZHVsZSB3aGljaCBpcyB0eXBlbWFwIGJhc2VkLgogICAgICAgICAgICBJdCBhbHNvIHVzZXMgRUNNQSBDIyBhbmQgbm8gbG9uZ2VyIHVzZXMgTWljcm9zb2Z0IFZpc3VhbCBDKysuTkVUIAogICAgICAgICAgICBnbHVlLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgTmVpbCBDYXdzZS4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTM1NDggXSBlcnJvciBwYXJzaW5nIGNhc3Rpbmcgb3BlcmF0b3IgZGVmaW5pdGlvbi4KICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyBjYXN0aW5nIG9wZXJhdG9ycyBkZWNsYXJlZCBvdXRzaWRlIG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGlubGluZSBBOjpvcGVyYXRvciBjaGFyICooKSB7IC4uLiB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFydGluIENhc2Fkby4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYW5vbnltb3VzIGJpdC1maWVsZHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA6IDg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBpZ25vcmVkIGJ5IFNXSUcuICAgUHJvYmxlbQogICAgICAgICAgICByZXBvcnRlZCBieSBGcmFueiBI9nBmaW5nZXIuCgowMi8yNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJldHRlciB0eXBlbWFwcyBpbiB0aGUgRXhhbXBsZXMvamF2YS90eXBlbWFwIGV4YW1wbGUgYW5kIGFsc28gCiAgICAgICAgICAgIGZpeGVzIHN1YnRsZSBidWcgd2hlbiB1c2luZyB0aGUgU3RyaW5nQnVmZmVyIHR5cGVtYXBzIG1vcmUgdGhhbiBvbmNlLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0MjExMiBdIENvbnN0YW50cyBjaGFyIGJ1Zy4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzUzMzcgXSBQYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG5vdCBlbnRpcmVseSB3b3JraW5nLgogICAgICAgICAgICBUaGVyZSB3YXMgYSBzdWJ0bGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBuYW1pbmcgYW5kIG9yZGVyaW5nIG9mCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzLiAgTWF0Y2hpbmcgd29ya2VkIG9rYXksCiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIHdlcmVuJ3QgZXhwYW5kZWQgY29ycmVjdGx5LgoKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcGFyc2luZyAoYW5kIGdlbmVyYXRpbmcgY29kZSkgZm9yIAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIGFycmF5cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBmb28oaW50ICgmeClbMTBdKTsKICAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTM0NyBdIENvbXBpbGF0aW9uIHdhcm5pbmcgZnJvbSBsaWJweS5jLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWwgTC4gUmFsbC4KIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB2aXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBjaGVja2luZyBhbmQgdHlwZWRlZi4KCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKmludHB0cjsKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICpmb28oKSA9IDA7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludHB0ciBmb28oKSB7IH07CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyZWF0aW5nIHRoZXNlIGRlY2xhcmF0aW9ucyBhcyBkaWZmZXJlbnQgZXZlbiB0aG91Z2gKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgKHZpYSB0eXBlZGVmKS4KCjAyLzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgdGhlIE5VTTJVU0hSVCBtYWNybywgcGVyIFsgNjc1MzUzIF0uCgowMi8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IGRldGVybWluZWQgaWYgYSBjbGFzcyBpcyBhYnN0cmFjdAogICAgICAgICAgICBhbmQgY2FuIGJlIGluc3RhbnRpYXRlZC4gICAgSWYgeW91IGhhZCBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgc3RydWN0IEMgOiB2aXJ0dWFsIEEgeyAKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIC8qIE5vdGUgb3JkZXIgb2YgYmFzZSBjbGFzc2VzICovCQogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OyAgICAvKiBPayAqLwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRSA6IEMsIEIgeyB9OyAgICAvKiBCcm9rZW4gKi8KCiAgICAgICAgICAgIHRoZW4gU1dJRyBkZXRlcm1pbmVkIHRoYXQgaXQgY291bGQgaW5zdGFudGlhdGUgRCgpLCBidXQgbm90IEUoKS4KICAgICAgICAgICAgVGhpcyBpbmNvbnNpc3RlbmN5IGFyb3NlIGZyb20gdGhlIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0byBsb2NhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMuICAgVGhpcyBwcm9ibGVtIHNob3VsZCBub3cgYmUgZml4ZWQtLS1TV0lHIHdpbGwgYXR0ZW1wdAogICAgICAgICAgICB0byBsb2NhdGUgYW55IHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIGEgdmlydHVhbCBtZXRob2QgYnkKICAgICAgICAgICAgdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRpcmUgaGllcmFyY2h5LgoKMDIvMjIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHVzaW5nIGVudW0gdHlwZW1hcHMuIFRoZSBKYXZhIGZpbmFsIHN0YXRpYyB2YXJpYWJsZSB0eXBlCiAgICAgICAgICAgIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGpzdHlwZSB0eXBlbWFwLCBlbmFibGluZyBlbnVtcyB0byBiZSBtYXBwZWQgdG8gCiAgICAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGludC4gQnVnIHJlcG9ydGVkIGJ5IEhlaW5lciBQZXRpdGguCgowMi8yMS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIENTaGFycCAoQyMpIG1vZHVsZSBwcm90b3R5cGUKICAgICAgICAgICAgaS5lLiBjc2hhcnAuY3h4ICYgY3NoYXJwLmggYXQgU291cmNlL01vZHVsZXMvLgogICAgICAgICAgICBUaGV5IGFyZSBmb3IgdGVzdCB1c2FnZSBvbmx5IG5vdyBhbmQgbmVlZCBpbXByb3ZlbWVudC4KICAgICAgICAgICAgVGhlIGludGVyZmFjZSBhbHNvIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgCjAyLzIwLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgd2l0aCAtZnZpcnR1YWwuCiAgICAgICAgICAgIFNpbWlsYXIgYXMgYmVhemxleSdzIG1vZGlmaWNhdGlvbiB0b2RheS4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZ2NjLXN0eWxlIHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICAKICAgICAgICAgICAgUGF0Y2ggWyA2MjMyNTggXSBHQ0Mtc3R5bGUgdmFyYXJnIG1hY3JvIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZSBNYXNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgY2xhc3NlcyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKGludCB4KSA9IDA7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKEludGVnZXIgeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyBnZXR0aW5nIGNvbmZ1c2VkIGFib3V0IHRoZSBsYXR0ZXIgbWV0aG9kLS0tbWFraW5nIEJhcgogICAgICAgICAgICBhYnN0cmFjdC4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVqYXZhY29uc3QoZmxhZykgY2FuIGFsc28gYmUgdXNlZCBvbiBlbnVtcyBhcyB3ZWxsIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGVuYWJsZXMgdHJ1ZSBKYXZhIGNvbXBpbGVyIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIAogICAgICAgICAgICB1c2VkIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuIFRoYW5rcyB0byBIZWluZXIgUGV0aXRoIGZvciBwYXRjaGVzLgoKMDIvMTkvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBNb2RpZmllZCAtZmNvbXBhY3QgZmVhdHVyZSB0byBkZWFsIHdpdGggUFAgbGluZXMKCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODkwNDAgXSBNaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvYmVydCBILiBkZSBWcmllcy4KCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBmZXcgZXZpbCBzY29waW5nIHByb2JsZW1zIHdpdGggdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBhbmQgdGhlCiAgICAgICAgICAgICVleHRlbmQgZGlyZWN0aXZlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCgowMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW1J1YnldIEltcHJvdmVkIHN1cHBvcnQgZm9yIFZpc3VhbCBDKysgYW5kIG90aGVyIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4gCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSAiL0VYUE9SVDpJbml0Xzxtb2R1bGU+Iiwgd2hlcmUgPG1vZHVsZT4gaXMgdGhlCiAgICAgICAgICAgIHN3aWcgbW9kdWxlIG5hbWUgd2hlbiBsaW5raW5nIHVzaW5nIHRoZXNlIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4KCjAyLzE1LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWZ2aXJ0dWFsIG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIHJlZGlmaW5lZCB2aXJ0dWFsIGZ1bmN0aW9uIGluIGNoaWxkcmVuIGNsYXNzZXMuCgogICAgICAgICAgICBNb2RpZmllZCAtY29tcGFjdCBvcHRpb24gdG8gLWZjb21wYWN0IG9wdGlvbgoKICAgICAgICAgICAgQWRkZWQgLXNtYWxsIG9wdGlvbi4KICAgICAgICAgICAgLXNtYWxsID0gLWZ2aXJ0dWFsIC1mY29tcGFjdAogICAgICAgICAgICBBbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSBmZWF0dXJlIG9wdGlvbnMsCiAgICAgICAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIHJlZHVjZSB3cmFwcGVyIGZpbGUgc3ppZS4KCiAgICAgICAgICAgIEFkZGVkIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hlY2suCiAgICAgICAgICAgIFRvIGR5bmFtaWNhbGx5IHNldCB0aGUgZmVhdHVyZSBvcHRpb25zIHN1Y2ggYXMgLWZjb21wYWN0ICYgLWZ2aXJ0dWFsCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAyLzEzLzIwMDM6IGxlbnoKICAgICAgICAgICAgVXBkYXRlZCBEb2MvTWFudWFsL1Blcmw1Lmh0bWwgdG8gdGFsayBhYm91dCBDKysgY29tcGlsZSBwcm9ibGVtcwogICAgICAgICAgICBjb25maWd1cmUuaW4gbm93IGNoZWNrcyBmb3IgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBSdW50aW1lL01ha2VmaWxlLmluIGFuZCBFeGFtcGxlL01ha2VmaWxlLmluIG5vdyB1c2UgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBBZGRlZCBMaWIvcGVybDUvbm9lbWJlZC5oIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUga25vd24gbWFjcm8gY29uZmxpY3RzCgowMi8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg1NDEwIF0gQysrIEV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gY2F1c2VzIFNXSUcgdG8gZXhpdC4KICAgICAgICAgICAgRml4ZXMgYSBzeW50YXggZXJyb3Igd2l0aCBkZWNsYXJhdGlvbnMgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgaW5zdGFudGlhdGlvbiBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICBXZSBtaWdodCBkbyBtb3JlIGxhdGVyLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIFdpbGxpYW1zb24uCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmV3cm90ZSBib29sIHR5cGVtYXBzIHRvIHJlbW92ZSBwZXJmb3JtYW5jZSB3YXJuaW5nIGZvciBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgVmlzdWFsIEMrKy4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHdyYXBwaW5nIHJlZmVyZW5jZSB2YXJpYWJsZXMgKGNvbnN0IG5vbi1wcmltaXRpdmUgYW5kIGFsbCBub24tY29uc3QgdHlwZXMpIAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBpbnQmIGk7CiAgICAgICAgICAgICAgQ2xhc3MmIGM7CiAgICAgICAgICAgICAgY29uc3QgQ2xhc3MmIGM7CgowMi8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG1vcmUgdmVyeSBzdWJ0bGUgcHJlcHJvY2Vzc29yIGNvcm5lciBjYXNlcyByZWxhdGVkIHRvIHJlY3Vyc2l2ZQogICAgICAgICAgICBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGNhdCh4LHkpIHggIyMgeQoKICAgICAgICAgICAgICAgICAgIGNhdChjYXQoMSwyKSwzKSAgICAvLyBQcm9kdWNlczogY2F0KDEsMikzCiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgeGNhdCh4LHkpIGNhdCh4LHkpCgogICAgICAgICAgICAgICAgICAgeGNhdCh4Y2F0KDEsMiksMykgIC8vIFByb2R1Y2VzIDEyMwoKICAgICAgICAgICAgU2VlIEsmUiwgMm5kIEVkLiBwLiAyMzEuCgowMi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA2ODM4ODIgXSAtIHBhdGNoIHN1Ym1pdHRlZCBieSBGLiBQb3N0bWEgZm9yIFNXSUcgdG8gY29tcGlsZSBvbiBIUC1VWC4KCjAyLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByZXByb2Nlc3NvciBhcmd1bWVudCBleHBhbnNpb24gYnVnLiBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTAvMjAwMzogc29uZ3lhbmYKICAgICAgICAgICAgQWRkZWQgLWNvbXBhY3Qgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgY29tbWVudHMgYW5kIGNvbWJpbmluZyBzaG9ydCBsaW5lcy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTEzNTUgXSBTeW50YXggZXJyb3Igd2l0aCBjc3RyaW5nLmkKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgT21yaSBCYXJlbC4KCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NjM2MzIgXSBpbmNvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZCBjcHAuCiAgICAgICAgICAgIFRoaXMgaXMgYSByZWZpbmVtZW50IHRoYXQgZml4ZXMgdGhpcyBwcm9ibGVtOgoKICAgICAgICAgICAgICAgICAvLyBTb21lIG1hY3JvIHdpdGggYW4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyh4KSAgICAgICB4CgogICAgICAgICAgICAgICAgIGludCBGT087ICAgICAgICAvKiBOb3QgYSBtYWNyby0tLW5vIGFyZ3VtZW50cyAqLwogCjAyLzA1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzU0OTEgXSBwYXJzZSBlcnJvciB3aXRoIGdsb2JhbCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbi4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEplcmVteSBZYWxsb3AuCgowMi8wNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB2YXJhcmdzIHByb2Nlc3NpbmcgaW50cm9kdWNlZCBieSB0aGUgbnVtaW5wdXRzIHR5cGVtYXAgcGFyYW1ldGVyLgoKMDEvMDgvMjAwMzogdHRuCgkgICAgW3htbF0gRml4IHN0cmluZy1yZXBsYWNlbWVudCBvcmRlcmluZyBidWdsZXQuCgkgICAgVGhhbmtzIHRvIEdhcnkgSGVycm9uLgoKMTIvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZ1cnRoZXIgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBUaGUgU1dJRyBleGVjdXRhYmxlIGlzIG5vdyBidWlsdCB1c2luZyBhIHNpbmdsZSBNYWtlZmlsZS4KICAgICAgICAgICAgLSBUaGlzIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBieSBBdXRvbWFrZSAoU291cmNlL01ha2VmaWxlLmFtKS4KICAgICAgICAgICAgLSBEZXBlbmRlbmN5IHRyYWNraW5nIGFuZCB0YWdzIHN1cHBvcnQgYXJlIGluIHRoaXMgbWFrZWZpbGUuCiAgICAgICAgICAgIC0gQXV0b21ha2UgMS43LjIgYW5kIEF1dG9jb25mIDIuNTQgbWluaW11bSB2ZXJzaW9ucyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFNXSUcgZnJvbSBDVlMuCiAgICAgICAgICAgIC0gUnVubmluZyAuL2F1dG9nZW4uc2ggbm93IGluc3RhbGxzIEF1dG9jb25mL0F1dG9tYWtlIHN1cHBvcnQgZmlsZXMgaW50bwogICAgICAgICAgICAgIFRvb2xzL2NvbmZpZyBhbmQgdGhlc2UgZmlsZXMgYXJlIG5vIGxvbmdlciBzdG9yZWQgaW4gQ1ZTLgogICAgICAgICAgICAtIEJ1ZyBmaXhlcyBpbiAnbWFrZSBpbnN0YWxsJyBmb3Igc3lzdGVtcyB1c2luZyAuZXhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGFuZAogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1yZWxlYXNlLXN1ZmZpeD13aGF0ZXZlcgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vcmUgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBBdXRvY29uZidzIEFDX0NBTk9OSUNBTF9IT1NUIHJlcGxhY2VzIHByb3ByaWV0YXJ5IGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgYnVpbGQgaG9zdC4KICAgICAgICAgICAgLSBBdXRvY29uZiBzdXBwb3J0IGZpbGVzIG1vdmVkIHRvIFRvb2xzL2NvbmZpZy4KCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIHJ1biBvbiBNYWNPUywgc3VibWl0dGVkIGJ5IEJlcm5hcmQgRGVzZ3JhdXBlcy4KICAgICAgICAgICAgTWFpbmx5IGVuc3VyaW5nIGdlbmVyYXRlZCBmaWxlcyBhcmUgb3V0cHV0IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yCiAgICAgICAgICAgIHNvbWUgbW9kdWxlcy4KCjEyLzExLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWYXJpb3VzIGJ1aWxkIG1vZGlmaWNhdGlvbnMgYW5kIGJ1ZyBmaXhlczoKICAgICAgICAgICAgLSBTaW1wbGlmaWNhdGlvbiBvZiB2ZXJzaW9uIHN0cmluZy4gVXNlIGF1dG9jb25mJ3MgUEFDS0FHRV9WRVJTSU9OIGluc3RlYWQuCiAgICAgICAgICAgIC0gQnVpbGQgdGltZSByZW1vdmVkIGZyb20gU1dJRyB2ZXJzaW9uLgogICAgICAgICAgICAtIFVzaW5nIHN0YW5kYXJkIGF1dG9jb25mIGNvbmZpZyBoZWFkZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgLSBVcGRhdGVkIG9sZCBhdXRvY29uZiBtYWNyb3MgYXMgcmVwb3J0ZWQgYnkgYXV0b3VwZGF0ZS4KICAgICAgICAgICAgLSBSZW1vdmVkICRwcmVmaXggaW4gYXV0b2NvbmYgZnJvbSBzZWFyY2ggcGF0aHMgYXMgYXV0b2NvbmYgd29uJ3QgZXhwYW5kIHRoZW0uCiAgICAgICAgICAgIC0gU3VidGxlIGJ1ZyBmaXggd2hlcmUgJ21ha2UgcHJlZml4PS9zb21ld2hlcmU7IG1ha2UgY2xlYW47IG1ha2UgcHJlZml4PS9zb213aGVyZS9lbHNlJwogICAgICAgICAgICAgIHByb2R1Y2VkIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIGluY29ycmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtIEFkZGVkIC1sZGZsYWdzIGNvbW1hbmRsaW5lIG9wdGlvbiBmb3IgTXpTY2hlbWUsIE9jYW1sLCBQaWtlIGFuZCBQSFAuCiAgICAgICAgICAgIC0gRml4ZWQgcmVwb3J0aW5nIG9mIGNvbXBpbGVyIHVzZWQgd2hlbiB1c2luZyAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIC0gU1dJRyB3ZWIgYWRkcmVzcyBhZGRlZCB0byAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCgoxMi8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGZpeCB0byBUY2wgZHluYW1pYyBjYXN0IHR5cGVtYXBzLiBSZXBvcnRlZCBieQogICAgICAgICAgICBLcmlzdG9waGVyIEJsb20uCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0ZW1wbGF0ZSBhcmd1bWVudCByZXBsYWNlIGJ1Zy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIENocmlzIEZsYXRsZXkuCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJldmVydGVkIENIQU5HRVMgMDkvMDMvMjAwMiwgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV2YWx1YXRpb24uICBBcmd1bWVudHMKICAgICAgICAgICAgYXJlIG5vdCBldmFsdWF0ZWQgZHVyaW5nIGNvbGxlY3Rpb24sIEsmUiwgcC4gMjMwLgoKMTIvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0OTAyMiBdIENvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggS0FJL0tDQwoKMTIvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHICdyZWwtMS0zJyBDVlMgYnJhbmNoIG1lcmdlZCBiYWNrIGludG8gdGhlIG1haW4gYnJhbmNoLgoKClZlcnNpb24gMS4zLjE3IChOb3ZlbWJlciAyMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxMzkyMiBdIHByZXByb2Nlc3NvciBlcnJvcnMgd2l0aCBIQVZFX0xPTkdfTE9ORy4KICAgICAgICAgICAgCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTU0ODAgXSBtenNjaGVtZSBTV0lHX011c3RHZXRQdHJfLgoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTExOSBdIFNXSUdfY3JvYWsgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmcuCgoxMS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHR5cGVtYXBzIGZvciBwb2ludGVycyB0byBjbGFzcyBtZW1iZXJzLgoKMTEvMTUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMgd2hpY2ggY2Fubm90IGJlIG92ZXJsb2FkZWQgaW4gSmF2YSAKICAgICAgICAgICAgb25jZSBhZ2FpbiBpc3N1ZSBhIHdhcm5pbmcuCgoxMS8xNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEhhbmRsaW5nIG9mIE5VTEwgcG9pbnRlcnMgaXMgaW1wcm92ZWQuIEEgamF2YSBudWxsIG9iamVjdCB3aWxsIG5vdwogICAgICAgICAgICBiZSB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIGEgTlVMTCBDL0MrKyBwb2ludGVyIGJ5IGRlZmF1bHQuIFByZXZpb3VzbHkgd2hlbiAKICAgICAgICAgICAgd3JhcHBpbmc6CgogICAgICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNzIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzICpzKTsKCiAgICAgICAgICAgIGFuZCBpdCB3YXMgY2FsbGVkIGZyb20gSmF2YSB3aXRoIG51bGw6CgogICAgICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28obnVsbCkKCiAgICAgICAgICAgIGEgSmF2YSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiBFeHRyYSB0eXBlbWFwcyBoYWQgdG8gYmUgd3JpdHRlbiBpbgogICAgICAgICAgICBvcmRlciB0byBvYnRhaW4gYSBOVUxMIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jdGlvbnMgbGlrZSB0aGlzIG9uZS4gTm93IHRoZSAKICAgICAgICAgICAgZGVmYXVsdCB3cmFwcGluZyB3aWxsIGRldGVjdCAnbnVsbCcgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIGEgTlVMTCBwb2ludGVyLgogICAgICAgICAgICBBbHNvIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgZWc6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgU29tZUNsYXNzICpiYXIoKSB7IHJldHVybiBOVUxMOyB9CiAgICAgICAgICAgIAogICAgICAgICAgICBUaGVuIHRoaXMgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggYSBTb21lQ2xhc3MgcHJveHkgY2xhc3MgaG9sZGluZyBhIE5VTEwKICAgICAgICAgICAgcG9pbnRlci4gTm93IG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4gVGhlc2UgY2hhbmdlcyBhcmUgc3VidGxlIGJ1dCB1c2VmdWwuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCB0eXBlbWFwczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkJmphdmFjbGFzc25hbWUoJGpuaWNhbGwsIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCjExLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IG1ldGhvZHMgYW5kIHNpZ25hdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgICBtZXRoKGludCBtZXRoX3BhcmFtKSA9IDA7IAogICAgICAgICAgICB9OyAKIAogCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2JhciA6IHB1YmxpYyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIGludCBtZXRoKGludCBtZXRoX3BhcmFtXzEsIGludCBtZXRoX3BhcmFtXzIpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3RfYmFyIGlzIHN0aWxsIGFic3RyYWN0LgoKICAgICAgICAgICAgRml4ZXMgWyA2Mjg0MzggXSBEZXJpdmVkIGFic3RyYWN0IGNsYXNzIG5vdCBhYnN0cmFjdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYW5kIHBhdGNoZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIG1hdGNoaW5nIHByb2JsZW0gd2l0aCB0eXBlbWFwcyBhbmQgYXJyYXkgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICAgaGFkIHRoaXM6CgogICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgYmxhaFsyMF07CgogICAgICAgICAgICBhbmQgYSB0eXBlbWFwOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAgIC4uLiAkMV9kaW0wIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuICQxX2RpbSogdmFyaWFibGVzIHdlcmVuJ3QgYmUgZXhwYW5kZWQgcHJvcGVybHkuICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFua2FqIEt1bWFyIEdvZWwuCiAgICAgICAgICAgICAgIAoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgQWRkZWQgYW4gZXhwZXJpbWVudGFsIG5ldyBtb2R1bGUgdGhhdCBkdW1wcyBTV0lHJ3MgcGFyc2UKCSAgICB0cmVlIGFzIChDb21tb24pIExpc3Agcy1leHByZXNzaW9ucy4gIFRoZSBtb2R1bGUgaXMKCSAgICBpbnZva2VkIHdpdGggU1dJRydzIC1zZXhwIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGUgb3V0cHV0CgkgICAgY2FuIGJlIHJlYWQgaW50byBDb21tb24gTGlzcC4gIFRoZXJlIGlzIChwcm90b3R5cGUpCgkgICAgZXhhbXBsZSBMaXNwIGNvZGUgdGhhdCBnZW5lcmF0ZXMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKCSAgICBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggS2V2aW4gUm9zZW5iZXJnJ3MgVUZGSS4KCgkgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBSZW1vdmVkIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAiY3BwX3RlbXBsYXRlX2RlY2wiIGluCgkgICAgcGFyc2VyLnk7IGJpc29uIDEuNzUgY29tcGxhaW5lZC4KCjExLzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBwcmltaXRpdmUgYXJyYXkgaGFuZGxpbmcgaGFzIGNoYW5nZWQgbGlrZSBhcnJheXMgb2YgY2xhc3Nlcy4gCiAgICAgICAgICAgIEMgcHJpbWl0aXZlIGFycmF5cyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgYSBKYXZhIGFycmF5IGJ1dCB3aXRoIGEgcG9pbnRlciAKICAgICAgICAgICAgKHR5cGUgd3JhcHBlciBjbGFzcykuIEFnYWluIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIAogICAgICAgICAgICBUaGUgb3JpZ2luYWwgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYXJyYXlzX2phdmEuaSwgc28gdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIG1lcmVseSBpbmNsdWRpbmcgdGhpcyBmaWxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgoKICAgICAgICAgICAgVGhlIGFycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZXkgYXJlIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5jbHVkaW5nIHRoaXMgZmlsZSwgdGh1cyB0aGlzIG9mdGVuIHVudXNlZCBjb2RlIGlzIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gc3BlY2lmaWNhbGx5IHJlcXVpcmluZyB0aGlzIHR5cGUgb2YgYXJyYXkgc3VwcG9ydC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjExLzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYXMgd2FzCiAgICAgICAgICAgIHByZXZpb3VzbHkgYWRkZWQgZm9yIHRoZSBQZXJsIG1vZHVsZSkuIFNvIGEgJW1vZHVsZSBkaXJlY3RpdmUKICAgICAgICAgICAgb2YgdGhlIGZvcm06CgogICAgICAgICAgICAgICAgJW1vZHVsZSAiT3V0ZXI6OklubmVyOjpGb28iCgogICAgICAgICAgICB3aWxsIG5lc3QgZXZlcnl0aGluZyBhcyAoaW4gUnVieSBjb2RlKToKCiAgICAgICAgICAgICAgICBtb2R1bGUgT3V0ZXIKICAgICAgICAgICAgICAgICAgbW9kdWxlIElubmVyCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIEZvbwogICAgICAgICAgICAgICAgICAgICAgIyBzdHVmZiBnb2VzIGhlcmUKICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKIAoxMS8wNS8yMDAyOiBta29lcHBlIAoJICAgIFtNelNjaGVtZV0gQWRkIGFuIGFyZ3VtZW50ICgtZGVjbGFyZW1vZHVsZSkgdGhhdCBnZW5lcmF0ZXMKCSAgICBjb2RlIHRvIGNvcnJlY3RseSBkZWNsYXJlIGEgcHJpbWl0aXZlIG1vZHVsZSBleHRlbnNpb24uCgkgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEJydWNlIEJ1dHRlcmZpZWxkLgoKMTEvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBwYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBDYWhpbGwgdG8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgd2FybmluZ3MgZm9yIHRoZSBqZW52IGFuZCBjbHMgcGFyYW1ldGVycy4gVGhpcyBwYXRjaCBhbHNvIGFsc28gYWxsb3dzIG9uZQogICAgICAgICAgICB0byB1c2UgInZvaWQiIGluIHRoZSBqbmkgdHlwZW1hcCBmb3IgYW55IHR5cGUgd2l0aG91dCBjb2RlIGJlaW5nIGdlbmVyYXRlZAogICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHJldHVybiBhIHZhbHVlLgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBcnJheSBoYW5kbGluZyBpcyBkaWZmZXJlbnQuIEFycmF5cyBvZiBjbGFzc2VzIGFyZSBubyBsb25nZXIgd3JhcHBlZAogICAgICAgICAgICB3aXRoIHByb3h5IGFycmF5cywgZWcgd3JhcHBpbmcKCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwogICAgICAgICAgICAKICAgICAgICAgICAgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggdGhlc2UgSmF2YSBnZXR0ZXJzIGFuZCBzZXR0ZXJzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWFtdIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYW10gZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBpbmVmZmljaWVudCBhcyB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBudW1lcm91cwogICAgICAgICAgICB0aW1lcyBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGdldHRlciBvciBzZXR0ZXIuIFRoZXNlIGFycmF5cyBhcmUgbm93CiAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBhIHBvaW50ZXIgc28gaXQgaXMgb25seSBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgCiAgICAgICAgICAgIHVzaW5nIGEgcHJveHkgY2xhc3M6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBBcnJheXMgb2YgZW51bXMgaGF2ZSBhbHNvIGJlZW4gc2ltaWxhcmx5IGNoYW5nZWQuIFRoaXMgYmVoYXZpb3VyIGlzIG5vdyBsaWtlIHRoZSAKICAgICAgICAgICAgb3RoZXIgU1dJRyBsYW5ndWFnZSdzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgYXJyYXkgbGlicmFyeSBzaG91bGQgYmUgdXNlZCB0byAKICAgICAgICAgICAgYWNjZXNzIHRoZSBvdGhlciBlbGVtZW50cy4gVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdGhlIAogICAgICAgICAgICBtYWNyb3MgYW5kIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgSkFWQV9BUlJBWVNPRkNMQVNTRVMoWCkKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFR3byBuZXcgdHlwZW1hcHMgamF2YWluIGFuZCBqYXZhb3V0IGZvciBnZW5lcmF0aW5nIHRoZSBwcm94eSBjbGFzcyAKICAgICAgICAgICAgYW5kIHR5cGUgd3JhcHBlciBjbGFzcyBtZXRob2QgY2FsbHMgdG8gdGhlIEpOSSBjbGFzcy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgCiAgICAgICAgICAgIHJlYWxseSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgdGhlIGpzdHlwZSAodXNlZCBpbiBwcm94eSBjbGFzcyBhbmQgdHlwZSB3cmFwcGVyCiAgICAgICAgICAgIGNsYXNzZXMpIHRvIHRoZSBqdHlwZSAodXNlZCBpbiB0aGUgSk5JIGNsYXNzKSBhbmQgdmlzYSB2ZXJzYS4gQSBqYXZhaW4gdHlwZW1hcAogICAgICAgICAgICBpcyByZXF1aXJlZCB3aGVuZXZlciBhbiBpbiB0eXBlbWFwIGlzIHdyaXR0ZW4gYW5kIHNpbWlsYXJseSBqYXZhb3V0IGZvciBhbiBvdXQKICAgICAgICAgICAgdHlwZW1hcC4gQW4gZXhhbXBsZSBpcyBwcm9iYWJseSBiZXN0IHRvIHNob3cgdGhlbSB3b3JraW5nOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgQ2xhc3MgIkNsYXNzLmdldENQdHIoJGphdmFpbnB1dCkiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIHVuc2lnbmVkIHNob3J0ICIkamF2YWlucHV0IgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgQ2xhc3MgKiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcygkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzcyB7fTsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAqIGJhcihDbGFzcyBjbHMsIHVuc2lnbmVkIHNob3J0IHVzaCkgeyByZXR1cm4gbmV3IENsYXNzKCk7IH07CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBwcm94eSBjb2RlIGlzIHRoZW46CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzcyBiYXIoQ2xhc3MgY2xzLCBpbnQgdXNoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoZXhhbXBsZUpOSS5iYXIoQ2xhc3MuZ2V0Q1B0cihjbHMpLCB1c2gpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgU29tZSBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIHR5cGVtYXBzLgogICAgICAgICAgICBIZXJlICRqYXZhaW5wdXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2NscycgYW5kICd1c2gnLiAkam5pY2FsbCBoYXMgYmVlbiByZXBsYWNlZCBieSAKICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRob2QgY2FsbCwgJ2V4YW1wbGVKTkkuYmFyKC4uLiknIGFuZCAkb3duZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2ZhbHNlJy4KICAgICAgICAgICAgJGphdmFpbnB1dCBpcyBhbmFsb2dvdXMgdG8gdGhlICRpbnB1dCBzcGVjaWFsIHZhcmlhYmxlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICAgICAgICRqbmljYWxsIGlzIGFuYWxvZ291cyB0byAkYWN0aW9uIGluICVleGNlcHRpb24uIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgICRvd25lciBpcyByZXBsYWNlZCBieSBlaXRoZXIgdHJ1ZSBpZiAlbmV3b2JqZWN0IGhhcyBiZWVuIHVzZWQgb3RoZXJ3aXNlIGZhbHNlLgoKICAgICAgICAgICAgVGhlIGphdmEuc3dnIGZpbGUgY29udGFpbnMgZGVmYXVsdCBqYXZhaW4gYW5kIGphdm91dCB0eXBlbWFwcyB3aGljaCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgY29kZQogICAgICAgICAgICBhcyBwcmV2aW91c2x5LiBUaGlzIGNoYW5nZSBpcyBvbmx5IG9mIGNvbmNlcm4gdG8gdGhvc2Ugd2hvIGhhdmUgd3JpdHRlbiB0aGVpciBvd24gdHlwZW1hcHMgYXMKICAgICAgICAgICAgeW91IHdpbGwgdGhlbiBtb3N0IGxpa2VseSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGphdmFpbiBhbmQgamF2YW91dCB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBqYXZhb3V0IHR5cGVtYXAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgYSBKYXZhIGRvd25jYXN0IHRvIGJlIHVzZWQgb24gYWJzdHJhY3QgCiAgICAgICAgICAgIHByb3h5IGJhc2UgY2xhc3Nlcy4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gb24gZHluYW1pY19jYXN0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjQvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBVcGdhZGVkIHRvIGxpYnRvb2wgMS40LjMsIHByZXN1bWFibHkgdy8gYmV0dGVyCgkgICAgc3VwcG9ydCBmb3IgbmV3aXNoIHBsYXRmb3JtcyAobGlrZSBNYWNPUyBYKS4KCjEwLzIxLzIwMDI6IHR0bgoJICAgIEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYnVnIC0tIHRoYW5rcyB0byBSaWNoYXJkIENhbG1iYWNoLgoKMTAvMTgvMjAwMjogdHRuCgkgICAgRml4ZWQgdHlwbyBpbiBkb2guaCAtLSB0aGFua3MgdG8gTWF4IEhvcm4uCgpWZXJzaW9uIDEuMy4xNiAoT2N0b2JlciAxNCwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCAlZmVhdHVyZSByZXBvcnRlZAogICAgICAgICAgICBieSBXaWxsaWFtIEZ1bHRvbi4KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgT3BlblZNUyBidWlsZCBkaXJlY3RvcnkgKHZtcykuICBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgSmVhbi1GcmFu529pcyBQaWVyb25uZS4KCjEwLzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIGNsYXVzZSB0byB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICBUaGUgdGhyb3dzIGNsYXVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdlbmVyYXRlZCBmb3IgcHJveHkgZnVuY3Rpb25zCiAgICAgICAgICAgIGFuZCBtb2R1bGUgY2xhc3MgZnVuY3Rpb25zLgoKMDkvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIGFuZCBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgd2VyZSBkZWZpbmVkIGJ1dCBub3Qgd3JhcHBlZC4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTGVzbGllIEJyb29rcywKICAgICAgICAgICAgR2VycnkgV29vZHMsIGFuZCBvdGhlcnMuCgowOS8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbWUgZXJyb3IgY2hlY2tpbmcgYWRkZWQ6CiAgICAgICAgICAgIDEpIE91dE9mTWVtb3J5RXhjZXB0aW9uIGNoZWNrIGluIHRoZSBjaGFyICogdHlwZW1hcHMuIAogICAgICAgICAgICAyKSBBcyBTV0lHIHRyZWF0cyBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcGFzc2luZyBieSB2YWx1ZSBhbGwgdGhlCiAgICAgICAgICAgIHNhbWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMKICAgICAgICAgICAgYW4gb2JqZWN0IHBhc3NlZCBieSB2YWx1ZSBvciBieSByZWZlcmVuY2UuIEEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgCiAgICAgICAgICAgIG5vdyB0aHJvd24gdW5kZXIgdGhpcyBzY2VuYXJpby4KCjA5LzIwLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2xlYW4iIGFuZCAibWFrZSBpbnN0YWxsIgoJCQkgIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBFeHBsYWluIGhvdyB0byBleHRlbmQgIm1ha2UgaW5zdGFsbCIgdy8gZXh0cmEtaW5zdGFsbC5saXN0LgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGlvbiBvZiB0aGUgImlnbm9yZSIgdHlwZW1hcC4gICBUaGUgImlnbm9yZSIgdHlwZW1hcCBoYXMKICAgICAgICAgICAgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlICJpbiIgdHlwZW1hcC4KICAgICAgICAgICAgVG8gaWdub3JlIGFuIGFyZ3VtZW50LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluLG51bWlucHV0cz0wKSBpbnQgKm91dHB1dCAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uCiAgICAgICAgICAgIG9mIHRoZSAiaW4iIGFuZCAiaWdub3JlIiB0eXBlbWFwcyAod2hpY2ggd2VyZSBzdXBwb3NlZCB0byBiZQogICAgICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUpLgoKICAgICAgICAgICAgVGhlIHVzZSBvZiB0aGUgbnVtaW5wdXRzIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICBDdXJyZW50bHksIHZhbHVlcyA+MSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAgSG93ZXZlciwgZnV0dXJlCiAgICAgICAgICAgIHJlbGVhc2VzIG9mIFNXSUcgbWF5IHV0aWxpemUgdGhhdCB0byBzdXBwb3J0IG11bHRpLWlucHV0IHR5cGVtYXBzLgoKICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBzdGlsbCB3b3JrcywgYnV0IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaXMKICAgICAgICAgICAgdHJhbnNsYXRlZCB0byAldHlwZW1hcChpbixudW1pbnB1dHM9MCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgZm9yIHVubmFtZWQgc3RydWN0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICB9ICpibGFoOwoKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvZ2VyIEdpYnNvbi4KICAgICAgICAgICAgTm90ZTogd2UgbWlnaHQgYmUgYWJsZSB0byBnZW5lcmF0ZSB3cmFwcGVycyBpbiBzcGVjaWFsIGNhc2VzLgoKMDkvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBtb2RpZmljYXRpb24gdG8gZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAgUG9pbnRlciBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICBhbHdheXMgc2V0IHRvIGFuIGluaXRpYWwgdmFsdWUgb2YgMC4gICBTaW1wbGlmaWVzIHR5cGVtYXAgd3JpdGluZyBhbmQgY2xlYW51cAogICAgICAgICAgICBjb2RlIChzaW5jZSB5b3UgY2FuIHJlbHkgb24gemVyby12YWx1ZSBpbml0aWFsaXphdGlvbikuICAgVGhpcyBhbHNvIGdyZWF0bHkKICAgICAgICAgICAgcmVkdWNlcyB0aGUgbmVlZCB0byBldmVyIHdyaXRlIGFuICJhcmdpbml0IiB0eXBlbWFwLgoKMDkvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBzbWFydC1wb2ludGVyIHN1cHBvcnQuICBJZiBvcGVyYXRvci0+KCkKICAgICAgICAgICAgaXMgcGFydCBvZiBhbiBpZ25vcmVkIGJhc2UgY2xhc3MgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAlaWdub3JlIEJhcjsKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgICAgICAgICAvKiBJZ25vcmVkICovCiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIHRoZW4gbWV0aG9kcyBmcm9tIEZvbyBhcmUgc3RpbGwgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpCiAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgIFRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgdGhlIG9wZXJhdG9yLT4oKSBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKHNpbmNlIGl0IHdhc24ndCB3cmFwcGVkKS4gICBUaGVyZWZvcmUsIHRoZXJlIHdvbid0IGJlIGFueQogICAgICAgICAgICAgX19kZXJlZl9fKCkgb3BlcmF0aW9uIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGFkZGVkIHRvIFNwYW0KICAgICAgICAgICAgIChlaXRoZXIgdXNpbmcgJWV4dGVuZCBvciBqdXN0IHBsYWNpbmcgb3BlcmF0b3ItPigpIGluIHRoZQogICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBTcGFtKS4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2hlY2siIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBEb2N1ZW1lbnRlZCBtZXRob2RvbG9neSBpbiBNYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbRG9jc10gUHJlZml4ZWQgTWFudWFsLyouaHRtbCB3aXRoICI8IURPQ1RZUEUgaHRtbCAuLi4+IiB0bwoJICAgIHBhbmRlciBkb3RpbmdseSB0byAob3Zlci0pc2Vuc2l0aXZlIGVkaXRvcnMuCgowOS8xMC8yMDAyOiB0dG4KCSAgICBbR3VpbGVdIENvbnZlcnRlZCBFeGFtcGxlcy9ndWlsZS9zaW1wbGUgIm1ha2UgY2hlY2siCgkgICAgYmVoYXZpb3IgdG8gYWN0dWFsbHkgY2hlY2sgZXhlY3V0aW9uIHJlc3VsdHMuICBSZWR1Y2VkCgkgICAgaXRlcmF0aW9uIGNvdW50cyBzbyB0aGF0IHRoZSB0ZXN0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZy4KCjA5LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRy0xLjMuMTUgcmVsZWFzZWQuCgoKVmVyc2lvbiAxLjMuMTUgKFNlcHRlbWJlciA5LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG5hc3R5IHJ1bnRpbWUgdHlwZSBjaGVja2luZyBidWcgd2l0aCBzdWJ0eXBlcyBhbmQgaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4gCgowOS8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgZXhjZXB0aW9uIGNsYXNzZXMgZm9yIGEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IAogICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZW0gaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbiB0aGUgdGhyb3dzIGF0dHJpYnV0ZSBpbiBhbnkgb25lCiAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IGluLCBvdXQsIGNoZWNrLCBmcmVlYXJnLCBhcmdvdXQgYW5kIHRocm93cy4gQSBjbGFzc2ljCiAgICAgICAgICAgIGV4YW1wbGUgd291bGQgYmUgdG8gY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvIGEgc3RhbmRhcmQgSmF2YSBleGNlcHRpb246CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzLCB0aHJvd3M9ImphdmEuaW8uSU9FeGNlcHRpb24iKSBmaWxlX2V4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgamNsYXNzIGV4Y2VwID0gamVudi0+RmluZENsYXNzKCJqYXZhL2lvL0lPRXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwKQogICAgICAgICAgICAgICAgICAgICAgICBqZW52LT5UaHJvd05ldyhleGNlcCwgJDEud2hhdCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7IC8vIG9yIHVzZSBTV0lHX2ZhaWwKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBmaWxlX2V4Y2VwdGlvbiB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkgdGhyb3coZmlsZV9leGNlcHRpb24pOwoKICAgICAgICAgICAgVGhlIEphdmEgbWV0aG9kIHdpbGwgdGhlbiBiZSBkZWNsYXJlZCB3aXRoIGEgdGhyb3dzIGNsYXVzZToKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsuLi59CgowOS8wOC8yMDAyOiBta29lcHBlCgkgICogW0d1aWxlXSBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgYXJnbGlzdCBubwoJICAgIGxvbmdlciBnZXRzIGNsdXR0ZXJlZCB3aXRoIHR5cGUgc3BlY2lmaWNhdGlvbiwgbWFraW5nIGl0CgkgICAgbW9yZSByZWFkYWJsZS4gIChBbHNvIHRoZSBJTElTUCBmdW5jdGlvbiBDLXUgTS14CgkgICAgYGFyZ2xpc3QtbGlzcCcgUkVUIHdvcmtzIGJldHRlciB0aGlzIHdheS4pICBUaGUgdHlwZXMgb2YKCSAgICBhcmd1bWVudHMgYXJlIGV4cGxhaW5lZCBpbiBhbiBleHRyYSBzZW50ZW5jZSBhZnRlciB0aGUKCSAgICBhcmdsaXN0LiAKCSAgICAKCSAgICBUaGVyZSBhcmUgbm93IHR3byBkb2N1bWVudGF0aW9uLXJlbGF0ZWQgdHlwZW1hcCBhcmd1bWVudHM6CgoJICAgICAgICAldHlwZW1hcChpbiwgZG9jPSIkTkFNRSBpcyBhIHZlY3RvciBvZiBpbnRlZ2VycyIsIAoJCQkgYXJnbGlzdD0iJG5hbWUiKSAgaW50ICpWRUNUT1IgeyAuLi4gfQoJCQkgCiAgICAgICAgICAgIFRoZSAiYXJnbGlzdCIgdGV4dHMgb2YgYWxsIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIG1ha2UgdXAKCSAgICBpdHMgYXJnbGlzdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIFRoZSAiZG9jIiB0ZXh0cyBvZiBhbGwKCSAgICBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB0byBtYWtlIGEgc2VudGVuY2UgdGhhdCBkZXNjcmliZXMKCSAgICB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIFJlYXNvbmFibGUgZGVmYXVsdHMgYXJlCgkgICAgcHJvdmlkZWQuIAoKCSAgICBBcyB1c3VhbCwgJG5hbWUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCgkgICAgYXJndW1lbnQuIFRoZSBuZXcgdHlwZW1hcCB2YXJpYWJsZSAkTkFNRSBpcyBsaWtlICRuYW1lLAoJICAgIGJ1dCBtYXJrZWQtdXAgYXMgYSB2YXJpYWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcwoJICAgIHVwcGVyLWNhc2VkOyBpbiBUZVhpbmZvIG1vZGUgKCItcHJvY2RvY2Zvcm1hdCB0ZXhpbmZvIikgaXQKCSAgICBjb21lcyBvdXQgYXMgQHZhcntuYW1lfS4gCgkgICAgCgkgICAgVGhlIGRpcmVjdGl2ZXMgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICAlbXVsdGlwbGVfdmFsdWVzIG5vdyBhbHNvIGhhdmUgYW4gZWZmZWN0IG9uIHRoZQoJICAgIGRvY3VtZW50YXRpb24uIChUaGlzIGlzIGFjaGlldmVkIHZpYSB0aGUgbmV3IHByYWdtYXMKCSAgICByZXR1cm5fbm90aGluZ19kb2MsIHJldHVybl9vbmVfZG9jLCByZXR1cm5fbXVsdGlfZG9jLikKCgkgICAgRG9jdW1lbnRhdGlvbiBoYXMgYWxzbyBpbXByb3ZlZCBmb3IgdmFyaWFibGVzIHRoYXQgYXJlCgkgICAgd3JhcHBlZCBhcyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycyAoY29tbWFuZC1saW5lIHN3aXRjaAoJICAgICItZW1pdC1zZXR0ZXJzIikuCgogICAgICAgICAgKiBbR3VpbGVdIEVtaXQgY29uc3RhbnRzIGFzIF9pbW11dGFibGVfIHZhcmlhYmxlcy4gIChUaGlzCiAgICAgICAgICAgIHdhcyBicm9rZW4gcmVjZW50bHkuKQoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gVXBkYXRlZCB0aGUgdHlwZW1hcHMgaW4gbGlzdC12ZWN0b3IuaS4KCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBTaG9ydC1jaXJjdWl0IHRoZSB0eXBlY2hlY2tzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KCSAgICAoVGhlIGNoYW5nZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFyZSB2aXNpYmxlIGluIHRoZSBuZXcKCSAgICB0ZXN0Y2FzZSAib3ZlcmxvYWRfY29tcGxpY2F0ZWQiLikKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29sdXRpb24gZm9yIFsgNTk2NDEzIF0KICAgICAgICAgICAgTmV3IHR5cGVtYXAgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICB3cmFwcGVyIGNvbnN0cnVjdG9yIG1vZGlmaWVyIGNhbiBiZSB0YWlsb3JlZCBieSB1c2Vycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgCiAgICAgICAgICAgIHByb3RlY3RlZC4gTm9ybWFsbHkgU1dJRyBnZW5lcmF0ZXMgYSBjb25zdHJ1Y3RvciBsaWtlIHRoaXMgd2hpY2ggY2FuIG9ubHkgCiAgICAgICAgICAgIGJlIGFjY2Vzc2VkIHdpdGhpbiBvbmUgcGFja2FnZToKCiAgICAgICAgICAgICAgcHJvdGVjdGVkIEJhcihsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgU1dJRyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMgb3Igd2FudCB0byB1c2UgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAgICAgICBhbnl3YXksIGl0IGNhbiBub3cgYmUgYWNjZXNzZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gVG8gbW9kaWZ5IHVzZSBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSAicHVibGljIgoKICAgICAgICAgICAgdG8gY2hhbmdlIHRvIHB1YmxpYyBmb3IgYWxsIHByb3h5IGNsYXNzZXMgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHR5cGUgd3JhcHBlciBjbGFzc2VzOgogICAgICAgICAgICAKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAicHVibGljIgoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgdHlwZW1hcHMgZm9yIHRoZSBKYXZhIG1vZHVsZS4gQysrIGV4Y2VwdGlvbnMgZ2V0IGNvbnZlcnRlZCBpbnRvCiAgICAgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIEphdmEgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIAogICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1heSBjaGFuZ2UgZnJvbSBqYXZhLmxhbmcuUnVudGltZSBleGNlcHRpb24gaW4gdGhlIGZ1dHVyZS4KCjA5LzA1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB2YXJpYWJsZXMgZGVjbGFyZWQgYXMgcmVmZXJlbmNlcy4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDkvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vcmUgdXBkYXRlcyB0byB0aGUgUnVieSBtb2R1bGUgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCgkgICAgYSBuZXcgdHlwZW1hcCBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjb2xsZWN0IGtleS12YWx1ZQoJICAgIHBhaXJzIGZyb20gYW4gYXJndW1lbnQgbGlzdCBpbnRvIGEgSGFzaC4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uIGFuZCBjb25zdHJ1Y3RvcnMuCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBGb288VD4oKSB7IH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZXh0cmEgPFQ+IGluIHRoZSBjb25zdHJ1Y3RvciB3YXMgY2FycmllZCB0aHJvdWdoIGluIHRoZQogICAgICAgICAgICBuYW1lLS1jYXVzaW5nIHJ1bnRpbWUgcHJvYmxlbXMgaW4gZ2VuZXJhdGVkIG1vZHVsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvcmRpIEFybmFiYXQgQmVuZWRpY3RvLgogCjA5LzA1LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFN1cHBvcnQgb3ZlcmxvYWRpbmcuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZXMKCSAgICB0byB1c2UgUnVieSAxLjcgc3VwcG9ydCBmb3IgdGhlc2UgdHlwZXMgd2hlbiBhdmFpbGFibGUuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgb3V0cHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2UgdG8gcHJpbWl0aXZlCgkgICAgdHlwZXMuCgowOS8wNC8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggcGFzcy1ieS12YWx1ZSB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEFybm8KCSAgICBQZXRlcnMgdmlhIERlYmlhbiBidWd0cmFja2luZyAoIzE1NjkwMiksIHBhdGNoIGJ5IFRvcnN0ZW4KCSAgICBMYW5kc2Nob2ZmIDx0b3JzdGVuQGRlYmlhbi5vcmc+LgoKMDkvMDMvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQoJICAgIEJldHRlciByZWZlcmVuY2Ugc3VwcG9ydC4KCSAgICBGdW5jdGlvbnMgdGhhdCB3YW50IGEgdm9pZCoqIGNhbiB0YWtlIGEgTlVMTCBieSByZWZlcmVuY2UgYW5kCgkgICAgdGhlIHZvaWQqIHdpbGwgYmUgbWFkZSBmb3IgeW91IGFuZCB0aGVuIHBhc3NlZC1ieS1yZWZlcmVuY2UKCgkgICAgQWxzbyBhbGwgaW50ZWdlci1jbGFzcyBuYXRpdmUgdHlwZXMgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UKCSAgICB3aGVyZSBhbiBpbnQqIG9yIGludCYgZXRjIGlzIG5lZWRlZAoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VkIHRoZSBldmFsdWF0aW9uIG9yZGVyIG9mIHByZXByb2Nlc3NvciBtYWNybyBhcmd1bWVudHMuCiAgICAgICAgICAgIEFyZ3VtZW50cyBhcmUgbm93IGV4cGFuZGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgKmJlZm9yZSogdGhleQogICAgICAgICAgICBhcmUgcGFzc2VkIHRvIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgZml4ZXMgYSBzdWJ0bGUgZXhwYW5zaW9uCiAgICAgICAgICAgIGJ1ZyByZXBvcnRlZCBieSBBbnRob255IEhlYWRpbmcuCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRoZSBmaWxlIGluY2x1ZGUgb3JkZXIgKGFnYWluLCBhcHBhcmVudGx5KS4gU2VlIDIvMjcvOTkuCgowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBCZXR0ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuICBTaW5jZSBQZXJsIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHJlbGllcyBvbiBzZXRqbXAvbG9uZ2ptcCwgd3JhcHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNsaWdodGx5CiAgICAgICAgICAgIHRvIHByb3ZpZGUgYW4gZXh0cmEgYmxvY2sgc2NvcGU6CgogICAgICAgICAgICAgICAgWFMoZm9vKSB7CiAgICAgICAgICAgICAgICAgICBjaGFyIF9zd2lnbXNnW1NXSUdfTUFYX0VSUk1TR10gPSAiIjsKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9zd2lnZXJyID0gX3N3aWdtc2c7CiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgd3JhcHBlciBmdW5jdGlvbiBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFNXSUdfY3JvYWsoIkFuIGVycm9yIG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgWFNSRVRVUk4oYXJndmkpOyAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuICovCiAgICAgICAgICAgICAgICAgICAgICBmYWlsOgogICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNyb2FrKF9zd2lnX2Vycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgbWFjcm8gU1dJR19jcm9hayh4KSBzZXRzIHRoZSB2YWx1ZSBvZiBfc3dpZ2VyciB0byB4IGFuZAogICAgICAgICAgICBleGVjdXRlcyBhICJnb3RvIGZhaWwiLiAgVGhlIHdob2xlIHdyYXBwZXIgZnVuY3Rpb24gaXMgZW5jbG9zZWQKICAgICAgICAgICAgYmxvY2sgc2NvcGUgdG8gcHJvdmlkZSBwcm9wZXIgY2xlYW51cCBvZiBDKysgb2JqZWN0cy4gIFNpbmNlCiAgICAgICAgICAgIGNyb2FrIGV4ZWN1dGVzIGEgbG9uZ2ptcCgpLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkgcmVjbGFpbQogICAgICAgICAgICByZXNvdXJjZXMgaWYgdGhpcyBleGVjdXRlcyBpbiB0aGUgc2FtZSBzY29wZSBhcyB0aGUgd3JhcHBlcgogICAgICAgICAgICBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBfc3dpZ21zZ1tdIHZhcmlhYmxlIGlzIG5vcm1hbGx5IHVudXNlZCwgYnV0IGNhbiBiZSB1c2VkCiAgICAgICAgICAgIHRvIHN0b3JlIHNtYWxsIGVycm9yIG1lc3NhZ2VzIHVzaW5nIHNwcmludGYgb3Igc25wcmludGYuIEl0CiAgICAgICAgICAgIGhhcyBhIGNhcGFjaXR5IG9mIGF0IGxlYXN0IDI1NiBieXRlcyAoU1dJR19NQVhfRVJSTVNHKS4KICAgICAgICAgICAgCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgYmV0dGVyIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbnMuICBJbnN0ZWFkIG9mIHJldHVybmluZyBUQ0xfRVJST1IsCiAgICAgICAgICAgIHVzZSB0aGUgbWFjcm8gU1dJR19mYWlsIHRvIHJldHVybiB3aXRoIGFuIGVycm9yLiAgVGhpcyBlbnN1cmVzIHRoYXQKICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBwcm9wZXJseSBjbGVhbmVkIHVwLiAgRXhjZXB0aW9uIHNwZWNpZmllcnMgYXJlIG5vdwogICAgICAgICAgICBoYW5kbGVkIGJ5IGRlZmF1bHQuCgowOS8wMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVGhlIHR5cGUtY2hlY2tpbmcgc3lzdGVtIGZvciB0aGUgUnVieSBtb2R1bGUgaGFzIGhhZCBhIGZsYXcKCSAgICBpbiB0aGF0IHNvbWUgdHlwZXMgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAoJICAgIHdlcmVuJ3QuIFRoaXMgYnVnIHdhcyBiZXN0IGRlbW9uc3RyYXRlZCBieSB0aGUgaW5oZXJpdF9taXNzaW5nLmkKCSAgICB0ZXN0IHN1aXRlIGNhc2UsIHdoaWNoIGRlZmluZXMgYSBiYXNlIGNsYXNzICJGb28iIHRoYXQgaXMKCSAgICBzdWJjbGFzc2VkIGJ5ICJCYXIiLiBUaGUgIkZvbyIgY2xhc3MgaXNuJ3QgYWN0dWFsbHkgd3JhcHBlZCAoaS5lLgoJICAgIGl0J3Mgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBSdWJ5KSBidXQgd2UnZCBzdGlsbCBsaWtlIHRvIGJlCgkgICAgYWJsZSB0byBwYXNzICJCYXIiIGluc3RhbmNlcyB0byBmdW5jdGlvbnMgZXhwZWN0aW5nIEZvb3MgYW5kIGhhdmUKCSAgICB0aGF0IHdvcms7IGl0IHdhc24ndC4gVGhlIHJldmlzZWQgaW1wbGVtZW50YXRpb24gKHNpbWlsYXIgdG8gdGhhdAoJICAgIHVzZWQgZm9yIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcykgYWRkcyBhIG5ldyBpbnN0YW5jZSB2YXJpYWJsZQoJICAgIChfX3N3aWd0eXBlX18pIHRvIGVhY2ggb2JqZWN0IHRoYXQgaW5kaWNhdGVzIGl0cyBTV0lHIHR5cGU7CgkgICAgdGhhdCBpcywgZWFjaCAiQmFyIiBpbnN0YW5jZSB3aWxsIG5vdyBoYXZlIGEgc3RyaW5nIGluc3RhbmNlCgkgICAgdmFyaWFibGUgY2FsbGVkICJfX3N3aWd0eXBlX18iIHdob3NlIHZhbHVlIGlzICJfcF9CYXIiLgoKICAgICAgICAgICAgVW5sZXNzIGRldmVsb3BlcnMgd2VyZSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbG93LWxldmVsCgkgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGV5IHNob3VsZG4ndCBub3RpY2UgYW55IGNvbXBhdGliaWxpdHkKCSAgICBwcm9ibGVtczsgbmV2ZXJ0aGVsZXNzLCBJJ20gbWFya2luZyBpdCBhcyBhICJwb3RlbnRpYWwKCSAgICBpbmNvbXBhdGliaWxpdHkiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8wMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU0YgQnVnICM2MDMxOTkuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIE9VVFBVVCwgSU5QVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIEMrKyAKICAgICAgICAgICAgcmVmZXJlbmNlcy4KCjA4LzI3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeGVkIGVycm9yIGluICJsaWJfc3RkX3ZlY3RvciIgdGVzdGNhc2UgYW5kCgkgICAgY29tcGlsZXIgd2FybmluZyBpbiAibGliX2NkYXRhIiB0ZXN0Y2FzZS4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgIiVtaXhpbiIgZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KCSAgICBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRvIG1peC1pbiB0byBhCgkgICAgY2xhc3MuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91J2QgbGlrZSB0byBzcGVjaWZ5IHRoYXQgUnVieSdzCgkgICAgRW51bWVyYWJsZSBtb2R1bGUgc2hvdWxkIGJlIG1peGVkLWluIHRvIHlvdXIgY2xhc3MgRm9vLCB5b3UnZAoJICAgIHdyaXRlOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJFbnVtZXJhYmxlIjsKCQkKICAgICAgICAgICAgb3IgdG8gc3BlY2lmeSB0aGF0IHRoZSBtb2R1bGVzIEZlZSwgRmllIGFuZCBGbyBzaG91bGQgYmUgbWl4ZWQKCSAgICBpbiB0byBGb286CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkZlZSxGaWUsRm8iOwoJCQoJICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgJWFsaWFzIGRpcmVjdGl2ZSBzbyB0aGF0IG11bHRpcGxlIGFsaWFzZXMKCSAgICBjYW4gYmUgc3BlY2lmaWVkIGZvciBhbiBpbnN0YW5jZSBtZXRob2QgYnkgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKCSAgICBsaXN0IG9mIGFsaWFzZXMuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgInRocm93IiB0eXBlbWFwcyBmb3IgdGhlIFJ1YnkgbW9kdWxlLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBwcmludGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICdzd2lnIC1NJyBsaXN0cyBhbGwgZmlsZSBkZXBlbmRlbmNpZXMuICAnc3dpZyAtTU0nIGxpc3RzCiAgICAgICAgICAgIGRlcGVuZGVuY2llcywgYnV0IGV4Y2x1ZGVzIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuIAogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgJSBzd2lnIC1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3N3aWcuc3dnIFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3B5dGhvbi9weXRob24uc3dnIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAgICAlIHN3aWcgLU1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk3NTk5IF0gdW5pb24gaW4gY2xhc3M6IGluY29ycmVjdCBzY29wZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDAxMzIgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggbmFtZXNwYWNlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hpYnVrYXdhIFlvc2hpa2kuCiAKMDgvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBBdXRvbWF0aWMgQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkIGZvciBhbGwgbGFuZ3VhZ2UgbW9kdWxlcy4gICAgVGhpcyBpcwogICAgICAgICAgICBwcmV0dHkgc2ltcGxlLiAgSWYgeW91IGhhdmUgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHdyYXBfQmFyX2JsYWgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMS0+YmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvbyAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInRocm93IiB0eXBlbWFwIGNvZGUgaW5zZXJ0ZWQuICQxID0gX2UgKi8KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBUaGUgInRocm93IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGVycm9yIGluIHRoZSB0YXJnZXQgCiAgICAgICAgICAgIGxhbmd1YWdlLiAgSXQgY2FuIGRvIGFueXRoaW5nLiAgSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKCJ0aHJvdyIpIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJGb28gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRvIG1ha2UgdGhpcyB3b3JrIGluIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLCBzaW1wbHkgZGVmaW5lIGEgZmV3IGRlZmF1bHQKICAgICAgICAgICAgInRocm93IiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIFNXSUdUWVBFICosIGludCwgY29uc3QgY2hhciAqLCBhbmQgYQogICAgICAgICAgICBmZXcgY29tbW9uIGV4Y2VwdGlvbiB0eXBlcy4gICBUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0LgoKICAgICAgICAgICAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgLW5vZXhjZXB0IG9yCiAgICAgICAgICAgIHNldHRpbmcgdGhlIE5vRXhjZXB0IGdsb2JhbCB2YXJpYWJsZSB0byAxLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFsgUHl0aG9uIF0KICAgICAgICAgICAgQXV0b21hdGljIHRyYW5zbGF0aW9uIG9mIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgaW50byBlcnJvciBoYW5kbGluZyBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIEZvbyBpcyB3cmFwcGVkIGFzIGEgY2xhc3NpYy1zdHlsZSBjbGFzcyAoY29tcGF0aWJsZQogICAgICAgICAgICB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZykuICBGdXJ0aGVybW9yZSwgeW91IGNhbiB3cml0ZSBQeXRob24gY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgRm9vLGU6ICAgICAjIE5vdGUgdXNlIG9mIGV4Y2VwdGlvbiBjbGFzcyBoZXJlIQogICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIEZvbyBlcnJvcgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlIG9iamVjdCAiZSIgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGp1c3QgYSB3cmFwcGVkIEZvbwogICAgICAgICAgICBvYmplY3QuICBBY2Nlc3MgaXQgbGlrZSBhIG5vcm1hbCBvYmplY3QuCgogICAgICAgICAgICBJZiBhbiBleGNlcHRpb24gaXMgbm90IHdyYXBwZWQgYXMgYSBjbGFzcywgYSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGV4Y2VwdGlvbiBpcwogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG9iamVjdC4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KGludCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsZToKICAgICAgICAgICAgICAgICAgIHByaW50IGUuYXJnc1swXSAgICAgICAjIEludGVnZXIgZXhjZXB0aW9uIHZhbHVlCgogICAgICAgICAgICBDb21tZW50czoKCiAgICAgICAgICAgICAgICAtICBJZiBhIGNsYXNzIGlzIHVzZWQgYXMgYW4gZXhjZXB0aW9uLCBpdCAqbXVzdCogYmUgd3JhcHBlZAogICAgICAgICAgICAgICAgICAgYXMgYSBQeXRob24gY2xhc3NpYy1zdHlsZSBjbGFzcyAobmV3IGNsYXNzZXMgZG9uJ3Qgd29yaykuCgogICAgICAgICAgICAgICAgLSAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBjb21wYXRpYmxlIHdpdGggJWV4Y2VwdGlvbi4KCiAgICAgICAgICAgICAgICAtICBVc2UgLW5vZXhjZXB0IHRvIHR1cm4gb2ZmIHRoaXMgZmVhdHVyZS4KCiAgICAgICAgICAgICAgICAtICBUaGUgbmV3bHkgaW50cm9kdWNlZCAidGhyb3ciIHR5cGVtYXAgaXMgdXNlZCB0byByYWlzZQogICAgICAgICAgICAgICAgICAgUHl0aG9uIGVycm9ycyAobmF0dXJhbGx5KS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluZm9ybWF0aW9uIGZyb20gdGhyb3coKSBzcGVjaWZpZXJzIGlzIG5vdyBzdG9yZWQgaW4gdGhlIHBhcnNlCiAgICAgICAgICAgIHRyZWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHRocm93KHNwYW0sYmFyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBzdG9yZWQgaW5mb3JtYXRpb24gaXMgZnVsbHkgY29ycmVjdGVkIGZvciBuYW1lc3BhY2VzIGFuZCB3b3JrcwogICAgICAgICAgICB3aXRoIHRlbXBsYXRlcy4gIFVzZXMgd2lsbCBmb2xsb3cuCiAgICAgICAgICAgIAowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vIGxvbmdlciBhcHBsaWVkIHRvIG1lbWJlciBhY2Nlc3MKICAgICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaW4gdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCh3aGF0ZXZlcikgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBub3QgYXBwbGllZCB0byBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgICAgZm9yIEZvbzo6eC4gICBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIGFtb3VudCBvZiBleHRyYSBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRlZC4KCiAgICAgICAgICAgIENhdmVhdDogIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlICppcyogdXNlZCB3aGVuIGF0dHJpYnV0ZXMgYXJlCiAgICAgICAgICAgIGFjY2Vzc2VkIHRocm91Z2ggYSBzbWFydC1wb2ludGVyIG9yIGEgc3ludGhlc2l6ZWQgYXR0cmlidXRlZAogICAgICAgICAgICBhZGRlZCB3aXRoICVleHRlbmQgaXMgdXNlZC4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSBtb3JlIHBhdGNoZXMgdG8gaG9wZWZ1bGx5IGVsaW1pbmF0ZSBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyBTV0lHIAogICAgICAgICAgICBhcyBhIDY0LWJpdCBleGVjdXRhYmxlLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGNvbnN0IHJlZmVyZW5jZSBtZW1iZXJzLCB2YXJpYWJsZXMsIGFuZCBzdGF0aWMgbWVtYmVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAmcmVmOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJ5aW5nIHRvIGdlbmVyYXRlICJzZXQiIGZ1bmN0aW9ucyB3aGljaCB3b3VsZG4ndCBjb21waWxlLiAKCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSB0aGUgd2FybmluZyBtZXNzYWdlIGZvciAiQ2xhc3MgWCBtaWdodCBhYnN0cmFjdCIgb2ZmIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIEVuYWJsZSB3aXRoIC1XYWxsLgoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIGhhbmRsaW5nIG9mIGNvbnN0IGFuZCBub24tY29uc3Qgb3ZlcmxvYWRlZCBtZXRob2RzLiAgSWYKICAgICAgICAgICAgYSBjbGFzcyBkZWZpbmVzIGEgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVuIHRoZSBub24tY29uc3QgbWV0aG9kIGlzICphbHdheXMqIHNlbGVjdGVkIGluIG92ZXJsb2FkaW5nIGFuZAogICAgICAgICAgICB0aGUgY29uc3QgbWV0aG9kIHNpbGVudGx5IGRpc2NhcmRlZC4gIElmIHJ1bm5pbmcgd2l0aCAtV2FsbCwgYSB3YXJuaW5nCiAgICAgICAgICAgIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgowOC8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIGluaGVyaXRhbmNlLiAgIENvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibGFoKGRvdWJsZSB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vQmFyIDogcHVibGljIEZvbywgcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBjaGFyICpibGFoKGNoYXIgKngpOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgQmFyOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBTV0lHIHdyYXBzIEZvb0Jhcjo6YmxhaCBhcyBhbiBvdmVybG9hZGVkIG1ldGhvZCB0aGF0IHVzZXMgYWxsCiAgICAgICAgICAgIGFjY2Vzc2libGUgdmVyc2lvbnMgb2YgYmxhaCgpLiAgU2VlIHNlY3Rpb24gMTUuMi4yIGluIFN0cm91c3RydXAsIDNyZCBFZC4KCiAgICAgICAgICAgIFNXSUcgYWxzbyBzdXBwb3J0cyBhY2Nlc3MgY2hhbmdlIHRocm91Z2ggdXNpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBDYXZlYXQ6ICAgU1dJRyBkb2VzIG5vdCBhY3R1YWxseSBjaGVjayB0byBzZWUgaWYgZGVjbGFyYXRpb25zIGltcG9ydGVkCiAgICAgICAgICAgIHZpYSAndXNpbmcnIGFyZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgSWYgdGhpcyBvY2N1cnMsIHRoZQogICAgICAgICAgICB3cmFwcGVyIGNvZGUgd29uJ3QgY29tcGlsZSBhbnl3YXlzLS0tbm90IHN1cmUgaXQncyB3b3J0aCB3b3JyeWluZyBhYm91dC4KICAgICAgICAgIAowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIG92ZXJsb2FkaW5nIGRpc3BhdGNoIHRvIG5vdCBpbmNsdWRlIG5vZGVzIHdpdGggYW4gImVycm9yIiBhdHRyaWJ1dGUuCiAgICAgICAgICAgIEEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiBzZXQgdGhpcyBpZiBhIG5vZGUgY291bGRuJ3QgYmUgd3JhcHBlZCBhbmQgeW91IGRvbid0IHdhbnQKICAgICAgICAgICAgaXQgaW5jbHVkZWQgaW4gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uLgoKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIGRpc3BhdGNoLiAgIFRoZSBkaXNwYXRjaGVyIGlzIG5vdyBhd2FyZSBvZgogICAgICAgICAgICBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShGb28gKmYpOwogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkaXNwYXRjaGVyIHJlLW9yZGVycyB0aGUgZnVuY3Rpb25zIHNvIHRoYXQgc3BhbShCYXIgKmIpIGlzCiAgICAgICAgICAgIGNoZWNrZWQgZmlyc3QtLS1pdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gc3BhbShGb28gKmYpLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtV2Vycm9yIGNvbW1hbmQgbGluZSBvcHRpb24uICAgSWYgc3VwcGxpZWQsIHdhcm5pbmcgbWVzc2FnZXMgYXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgZXJyb3JzIGFuZCBTV0lHIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NjEzNSBdIFR5cGVkZWYgb2YgcmVmZXJlbmNlIGNhbid0IGNvbXBpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgJkludFJlZjsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhJbnRSZWYgaSk7CgogICAgICAgICAgICBTV0lHLTEuMy4xNCBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuCgpWZXJzaW9uIDEuMy4xNCAoQXVndXN0IDEyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgU3RhdGljIGNvbnN0IG1lbWJlcnMgaW5pdGlhbGl6ZWQgZHVyaW5nIGRlY2xhcmF0aW9uLCBhbmQKCSAgICBvbmx5IHRoZW0sIGllOgoKCSAgICBzdHJ1Y3QgQQoJICAgIHsJCSAKCQlzdGF0aWMgY29uc3QgaW50IGEgPSAxIDsgIC8vIHRoaXMgb25lCgkJc3RhdGljIGNvbnN0IGludCBiOyAgICAgICAvLyBub3QgdGhpcyBvbmUKICAgICAgICAgICAgfTsgICAgIAoKCSAgICBhcmUgZW1pdHRlZCBsaWtlIGNvbnN0YW50cyAoZXF1aXZhbGVudCB0byBlbnVtcyBvcgoJICAgIGV4cGxpY2l0ICVjb25zdGFudCkuCgkgICAgCgkgICAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvICdjdmFyJwoJICAgIHNpbmNlIHRoZXkgbGFjayB0aGUgbmVlZGVkIHJlZmVyZW5jZSAod2VsbCwgeW91IGNhbiBmb3JjZQoJICAgIHRoZW0gdG8gaGF2ZSBhIHJlYWwgcmVmZXJlbmNlLCBidXQgaW4gYW4gdWdseSB3YXkgd2hpY2gKCSAgICBnb2VzIGNvbXBsZXRlbHkgYWdhaW4gdGhlIG9yaWdpbmFsIHB1cnBvc2Ugb2YgaW5pdGlhbGl6ZQoJICAgIHRoZW0gZHVyaW5nIGRlY2xhcmF0aW9uLCB5b3UgYWxzbyBoYXZlIHRvIGRlYWwgd2l0aCBleHRyYQoJICAgIGxpbmtpbmcgbWF0dGVycywgYW5kIGl0IHRha2UgYSB3aGlsZSB0byBmaWd1cmUgb3V0IHdoYXQgaXMKCSAgICB0aGUgcHJvYmxlbSBhbmQgaG93IHRvIHNvbHZlIGl0KS4KCSAgICAKCSAgICBQbGVhc2UgdGVzdCBpdCB3aXRoIHlvdXIgcHJlZmVycmVkIHRhcmdldCBsYW5ndWFnZSwgYW5kCgkgICAgbm90IG9ubHkgdGhlIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJlYWxseSBydW4gdGhlIGV4YW1wbGUKCSAgICBpbiB0aGUgdGVzdC1zdWl0ZSAoc3RhdGljLWNvbnN0LW1lbWJlci0yLmkpIGJlY2F1c2UgdGhlCgkgICAgcHJvYmxlbSBhbmQgdGhlIHNvbHV0aW9uIGNhbm5vdCBiZSAiZnVsbHkiIGFwcHJlY2lhdGVkCgkgICAgdW50aWwgeW91IHRyeSB0byBsb2FkIHRoZSBtb2R1bGUgYW5kIHJ1biBpdC4KCgkgICAgSW4gc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIChweXRob24gc3BlY2lhbGx5KSwgdGhpcyBjYW4KCSAgICBwcm9kdWNlcyBhIGRpZmZlcmVuY2UgaW4gdGhlIHdheSB0aGF0IHRoZSBzdGF0aWMgY29uc3RhbnQKCSAgICBtZW1iZXJzICdhJyBhbmQgJ2InIGFyZSBpbnRlcm5hbGx5IHdyYXBwZWQuIEhvcGVmdWxseSwKCSAgICB0aGV5IHN0aWxsIGNhbiBiZSBhY2Nlc3NlZCBpbiB0aGUgc2FtZSB3YXkuCgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gTm93IHN0YXRpYyBjb25zdCBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBpbiBhIG1vcmUKCSAgICBuYXR1cmFsIHdheSwgaWUsIGlmIHlvdSBoYXZlCgoJICAgIHN0cnVjdCBBCiAgICAgICAgICAgICB7CQkgCgkJdHlwZWRlZiB1bnNpZ25lZCBpbnQgdmlld2ZsYWdzOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgZm9yd2FyZF9maWVsZCA9IDA7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBiYWNrd2FyZF9maWVsZDsKICAgICAgICAgICAgfTsgICAgIAoJICAgIAoJICAgIG5vdyB5b3UgY2FuIGRvOgoKCQlwcmludCBBLmJhY2t3YXJkX2ZpZWxkCgoJICAgIGFuZCBhbHNvCgoJICAgICAgICBhID0gQSgpCgkJcHJpbnQgYS5mb3J3YXJkX2ZpZWxkCgkJCgkgICAgTm90ZSB0aGF0IGlmIHRoZSBzdGF0aWMgY29uc3QgbWVtYmVycyBkb24ndCBoYXZlIGFuCgkgICAgaW5pdGlhbGl6ZXIgKGxpa2UgYmFja3dhcmRfZmllbGQpLCBzdGlsbCB5b3UgY2FuIGFjY2VzcwoJICAgIHRoZW0gaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBweXRob24gc2lkZSwgYnV0IHRoZQoJICAgIGltcGxlbWVudGF0aW9uIGlzIGEgcXVpdGUgZGlmZmVyZW50OiBiYWNrd2FyZF9maWVsZCB3aWxsCgkgICAgc3RpbGwgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSwgYW5kIGFsc28sIHlvdSBhcmUgCgkgICAgcmVzcG9uc2libGUgdG8gaW5pdGlhbGl6ZSBpdCBpbiBzb21lIGNvZGUgdW5pdCwgYW5kIGxpbmsgaXQKCSAgICBwcm9wZXJseS4gZm9yd2FyZF9maWVsZCwgYnkgdGhlIG90aGVyIGhhbmQsIHdpbGwgbm90CgkgICAgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSBidXQgb25seSBhcyBhIEEgbWVtYmVyLCBzaW1pbGFyCgkgICAgdG8gd2hhdCBoYXBwZW4gd2l0aCBlbnVtIG9yICVjb25zdGFudCBtZW1iZXJzLgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gQ29tbW9uIGNvZGUgaW4gdGhlIF9fc2V0YXR0cl9fL19fZ2V0YXR0cl9fIG5vdwoJICAgIGdvZXMgdG8gdHdvICJmcmVlIiBtZXRob2RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3h5CgkgICAgZmlsZSwgZnJvbSB3aGVyZSBlYWNoIGNsYXNzIHVzZSBpdC4gVGhpcyBjaGFuZ2UgcmVkdWNlcwoJICAgIHRoZSBzaXplIG9mIHRoZSBwcm94eSBmaWxlLCBzcGVjaWFsbHkgaWYgeW91IHdyYXAgYSBsb3Qgb2YKCSAgICBzbWFsbCBjbGFzc2VzIGluIG9uZSBtb2R1bGUgKHVwIHRvIDMzJSBpbiBzb21lIGNhc2VzKSwKCSAgICBtYWtpbmcgaXQgZmFzdGVyIHRvIGxvYWQgdG9vLgoKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIElmIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNoYXIgKiByZXR1cm5zIE5VTEwsCiAgICAgICAgICAgIHVuZGVmIGlzIHJldHVybmVkIHRvIHRoZSBQZXJsIGludGVycHJldGVyLgogCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFuZCBuYW1lc3BhY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vKigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGUgd3JhcHBlciBjb2RlLCBTV0lHIHdhcyB1c2luZyAtPm9wZXJhdG9yIEZvbyooKQogICAgICAgICAgICB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgLT5vcGVyYXRvciBuczo6Rm9vKigpLgoKICAgICAgICAgICAgTm90ZTogaWYgdXNpbmcgJXJlbmFtZSB3aXRoIGEgY29udmVyc2lvbiBvcGVyYXRvciwgeW91CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVyZW5hbWUodG9Gb29QdHIpIG5zOjpvcGVyYXRvciBuczo6Rm9vKigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgXl5eXiBub3RlIGV4dHJhIHF1YWxpZmllcgogICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gTWlub3IgZW5oYW5jZW1lbnQgdG8gJ2NvbnN0JyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgICBOb3JtYWxseSBjb25zdCBkZWNsYXJhdGlvbnMgYXJlIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcwogICAgICAgICAgICBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCB0aGUgY3ZhciBhdHRyaWJ1dGUgKHNlZSBTV0lHLmh0bWwgZm9yCiAgICAgICAgICAgIGEgZGlzY3Vzc2lvbiBvZiB3aHkpLiAgSG93ZXZlciwgaW4gbWFueSBwcm9ncmFtcywgImNvbnN0IiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zIG1heSBqdXN0IGJlIGNvbnN0YW50cy0tLW1ha2luZyB0aGUgY3Zhci4gYWNjZXNzCiAgICAgICAgICAgIGF3a3dhcmQuICBUbyBmaXggdGhpcywgImNvbnN0IiBkZWNsYXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUKICAgICAgICAgICAgYm90aCB0aHJvdWdoIGN2YXIuIGFuZCBhcyBhIHNpbXBsZSBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNvbnN0IGludCBGT08gPSA0MjsKCiAgICAgICAgICAgIEluIFB5dGhvbjoKCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuY3Zhci5GT08KICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLkZPTwogICAgICAgICAgICAgICAgIDQyCgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgImNvbnN0IiB2YXJpYWJsZQogICAgICAgICAgICBtaWdodCBjaGFuZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgQkFSID0gIkhlbGxvIFdvcmxkIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHBvaW50ZXIgaXRzZWxmIGNhbiBub3QgY2hhbmdlLCBidXQgdGhlIAogICAgICAgICAgICBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gY291bGQgYmUgbW9kaWZpZWQuICBJbiB0aGVzZSBzaXR1YXRpb25zLAogICAgICAgICAgICBjdmFyLkJBUiBzaG91bGQgYmUgYWNjZXNzZWQgdG8gb2J0YWluZWQgdGhlIGN1cnJlbnQgdmFsdWUuCgowOC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGdlbmVyYXRpb24gb2YgdGhlIHByb3h5IGNvZGUgKC5weSBmaWxlcykgdG8gbW9yZQogICAgICAgICAgICBjbG9zZWx5IGZvbGxvdyB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb25zIGFzIHRoZXkgYXBwZWFyIGluCiAgICAgICAgICAgIHRoZSAuaSBmaWxlLiAgIEluIHRoZSBwYXN0LCBhbGwgb2YgdGhlIGNsYXNzIHdyYXBwZXJzIGFwcGVhcmVkCiAgICAgICAgICAgIGZpcnN0LCBmb2xsb3dlZCBieSBmdW5jdGlvbiBzdHVicywgaW5zZXJ0ZWQgUHl0aG9uIGNvZGUsIGFuZAogICAgICAgICAgICBvdGhlciBkZXRhaWxzLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eSBtZXRob2QgX2RlbGV0ZSgpIGNoYW5nZWQgdG8gZGVsZXRlKCkuIFRoZXJlIHNob3VsZG4ndCBldmVyCiAgICAgICAgICAgIGJlIGEgd3JhcHBlZCBmdW5jdGlvbiBjYWxsZWQgZGVsZXRlKCkgYXMgaXQgaXMgYSBDKysga2V5d29yZCBhbmQgdGhlcmUKICAgICAgICAgICAgaXMgbm8gc3VjaCB0aGluZyBhcyBhIG1lbWJlciBmdW5jdGlvbiBpbiBDLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGUgZnVuY3Rpb24gYmFjayBpbgogICAgICAgICAgICBmb3IgYWxsIHByb3h5IGNsYXNzZXM6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBKYXZhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1bW1hcnkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIGltcHJvdmluZyB0aGUgSmF2YSBtb2R1bGUgCiAgICAgICAgICAgIGZvciB2ZXIgMS4zLjE0LiAgSWYgYXQgYWxsIHBvc3NpYmxlIGNoYW5nZSB5b3VyIGNvZGUgdG8gdGFrZSBhZHZhbnRhZ2VzIG9mIHRoZSAKICAgICAgICAgICAgaW1wcm92ZW1lbnRzLiBJZiB5b3Ugd2VyZSB1c2luZyBwcm94eSBjbGFzc2VzIHlvdSBtYXkgbm90IG5vdGljZSBhbnkgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IGlzc3Vlcy4gSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIHdpbGwgaGVscCB3aXRoIG1vc3QgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdoZXJlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIGNvZGUgdGhhdCB1c2VzCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgb3V0cHV0OgoKICAgICAgICAgICAgUmVwbGFjZToKICAgICAgICAgICAgICAgICVtb2R1bGUgbW9kdWxlbmFtZQoKICAgICAgICAgICAgV2l0aDoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibW9kdWxlbmFtZSIpIG1vZHVsZW5hbWU7CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnM9InB1YmxpYyI7CgogICAgICAgICAgICBUaGUgcHJveHkgY29uc3RydWN0b3JzIHRoYXQgdG9vayBwYXJhbWV0ZXJzIChsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikKICAgICAgICAgICAgd2VyZSBwdWJsaWMgYW5kIGFyZSBub3cgcHJvdGVjdGVkLiBJZiB5b3Ugd2VyZSBtYWtpbmcgdXNlIG9mIHRoZXNlIHRoZW4geW91J2xsIAogICAgICAgICAgICBoYXZlIHRvIG1vZGlmeSB5b3VyIGNvZGUgYW5kIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgbmV3IHR5cGUgCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBvdGhlciBtYWluIGFyZWFzIGFyZSB0aGUgcHJhZ21hcyBhbmQgZ2xvYmFsIHZhcmlhYmxlIHdyYXBwaW5nLiBSZXBsYWNlIAogICAgICAgICAgICB0aGUgcHJhZ21hcyB3aXRoIG9uZSBvZiB0aGUgbmV3IGRpcmVjdGl2ZXMgb3IgdHlwZW1hcHMgbWVudGlvbmVkIGJlbG93IGFuZCB1c2UKICAgICAgICAgICAgJXJlbmFtZSBvbiB0aGUgdmFyaWFibGVzLgoKICAgICAgICAgICAgSWYgeW91IHdlcmUgbm90IHVzaW5nIHByb3h5IGNsYXNzZXMsIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lIGEganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYXMgd2VsbCBhcyBhIGp0eXBlIHR5cGVtYXAuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3Igd3JhcHBpbmcgdHdvIGRpbWVuc2lvbiBhcnJheSB2YXJpYWJsZXMuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsXQogICAgICAgICAgICBPYmplY3QgbWFuYWdlbWVudCBub3cgaGFzIGEgbXVjaCBiZXR0ZXIgc2Vuc2Ugb2Ygb3duZXJzaGlwLgogICAgICAgICAgICBPd25lcnNoaXAgYml0cyBpcyBjaGFuZ2VkIHdoZW5ldmVyIGFuIG9iamVjdCBpcyBzdG9yZWQgaW4gYQogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgb3Igc3RydWN0dXJlIG1lbWJlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICAgICAgRm9vICpuZXh0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBpbiBQeXRob24KCiAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGYudGhpc293bgogICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgID4+PiBnID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGcubmV4dCA9IGYgICAgICAgICAgIyBBc3NpZ24gYSBwb2ludGVyCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24gICAgICAgICAgICMgTm90aWNlIG93bmVyc2hpcCBjaGFuZ2UKICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgIFRoaXMgc2NoZW1lIGlzIG1vc3RseSBhIGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgZGVzaWduZWQgdG8gCiAgICAgICAgICAgIHByb3ZpZGUgc2VnbWVudGF0aW9uIGZhdWx0cy4gIEl0IGNvdWxkIGNhdXNlIGEgbWVtb3J5IGxlYWsKICAgICAgICAgICAgaWYgb3duZXJzaGlwIGlzIGNoYW5nZWQgdW5uZWNlc3NhcmlseS4gIEluIHRoaXMgY2FzZSwgeW91IGNhbgogICAgICAgICAgICBlaXRoZXIgd3JpdGUgYSB0eXBlbWFwICh0aGF0IGRvZXNuJ3QgY2hhbmdlIG93bmVyc2hpcCksIG9yCiAgICAgICAgICAgIG1hbnVhbGx5IHNldCB0aGUgdGhpc293biBhdHRyaWJ1dGUgYmFjayB0byAxLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBNYWpvciB1c2FiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIHRoZSBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgICBTdXBwb3NlIHlvdSBoYWQgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyAKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdm9pZCAgYmxhaChGb28gKmYpOwoKICAgICAgICAgICAgSW4gcGFzdCB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgY291bGQgY3JlYXRlIG9iamVjdHMgYW5kIHVzZQogICAgICAgICAgICB0aGVtIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlIEZvbyBmCiAgICAgICAgICAgICAgICAlIGYgY29uZmlndXJlIC14IDMKICAgICAgICAgICAgICAgICUgZiBzcGFtCiAgICAgICAgICAgICAgICAzNwogICAgCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdCBpZiB5b3UgdHJpZWQgdG8gY2FsbCBibGFoKCksIGl0IGRpZG4ndAogICAgICAgICAgICB3b3JrOgoKICAgICAgICAgICAgICAgICUgYmxhaCBmCiAgICAgICAgICAgICAgICBUeXBlIEVycm9yLiBFeHBlY3RlZCBfcF9Gb28KICAgICAgICAgICAgICAgICUKCiAgICAgICAgICAgIEluc3RlYWQsIHlvdSBoYWQgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICAlIGJsYWggW2YgY2dldCAtdGhpc10KICAKICAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBleHRyYWN0cyB0aGUgLXRoaXMgcG9pbnRlciwgYXZvaWRpbmcgdGhpcwogICAgICAgICAgICBwcm9ibGVtLiAgVGhpcyBtZWFucyB0aGF0IHNheWluZyAiYmxhaCBmIiBpcyBwZXJmZWN0bHkgbGVnYWwgYW5kCiAgICAgICAgICAgIGV2ZXJ5dGhpbmcgd2lsbCBzdGlsbCB3b3JrIG5vcm1hbGx5LgoKICAgICAgICAgICAgQ2F2ZWF0OiBTaW5jZSBwb2ludGVyIHN0cmluZ3Mgc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZSAoXyksCiAgICAgICAgICAgIGRvbid0IHVzZSB0aGlzIGluIG9iamVjdCBuYW1lcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICUgRm9vIF9mIAogICAgICAgICAgICAgICAgJSBibGFoIF9mICAgICAgICAjIFBvdGVudGlhbCBjcmFzaAoKICAgICAgICAgICAgT2JqZWN0cyBub3cgaGF2ZSBhIC10aGlzb3duIGF0dHJpYnV0ZSB0aGF0IHNob3dzIHRoZSBvd25lcnNoaXAuCiAgICAgICAgICAgIFRoaXMgYnVpbGRzIHVwb24gdGhlIENIQU5HRVMgMTEvMjQvMjAwMSBlbnRyeS4KCjA4LzA3LzIwMDI6IHNhbWphbSwgU2FtIExpZGRpY290dAogICAgICAgICAgICBQcm9wZXJseSBpbXBsZW1lbnRlZCBwb2ludGVyIHN5c3RlbSB1c2luZyBwaHAgcmVzb3VyY2VzLgogICAgICAgICAgICBTdGlsbCBuZWVkIHRvIHdvcmsgb3V0IHdoZXRoZXIgb3Igbm90IHRvIGxldCBzY3JpcHQtdXNlcnMgY2FsbAogICAgICAgICAgICBkZXN0cnVjdG9ycyBkaXJlY3RseQoKMDgvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBVcGdyYWRlZCBtenNjaGVtZSBtb2R1bGUgdG8gc3VwcG9ydCB2ZXJzaW9uIDIwMSBhbmQgYWRkZWQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcgc3VwcG9ydC4KCjA4LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBleHRyYSBncm91cGluZyAoaW4gdmVyeSBsaW1pdGVkIGNhc2VzKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IChGdW5jUHRyKShpbnQsIGRvdWJsZSk7CgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMICoqKgogICAgICAgICAgICAKMDgvMDMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZXMgdG8gdHlwZW1hcHMuaSBhcyB0aG9zZSBkb25lIHByZXZpb3VzbHkgZm9yIFBlcmwsCiAgICAgICAgICAgIFB5dGhvbiBhbmQgVGNsIG1vZHVsZXMuIE5vdyBzdXBwb3J0cyByZWZlcmVuY2UgdHlwZXMgd2l0aCBJTlBVVCwKICAgICAgICAgICAgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcy4KCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBjc3RyaW5nLmkgYWRkZWQuICBQcm92aWRlcyBtYWNyb3MgZm9yCiAgICAgICAgICAgIG1hbmlwdWxhdGluZyBjaGFyICogZGF0YS4KIAowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgVXNlICVuZXdvYmplY3QgaW5zdGVhZC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgJW5ld29iamVjdCBmb287CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICBjaGFyICpmb28oKTsKCiAgICAgICAgICAgICVuZXdvYmplY3QgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwKICAgICAgICAgICAgZXRjLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBhdHRyaWJ1dGUgJ2puaWNsYXNzbmFtZScgZm9yIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGFsbG93cyBhIHdheSBvZgogICAgICAgICAgICBjaGFuZ2luZyB0aGUgSk5JIGNsYXNzIG5hbWUgZnJvbSB0aGUgZGVmYXVsdCB3aGljaCB1c2VzIHRoZSBtb2R1bGVuYW1lIHdpdGggSk5JCiAgICAgICAgICAgIGFwcGVuZGVkIGFmdGVyIGl0LgoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibmFtZSIpIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIElmICduYW1lJyBpcyB0aGUgc2FtZSBhcyAnbW9kdWxlbmFtZScgdGhlbiB0aGUgbW9kdWxlIGNsYXNzIG5hbWUgZ2V0cyBjaGFuZ2VkCiAgICAgICAgICAgIGZyb20gJ21vZHVsZW5hbWUnIHRvIG1vZHVsZW5hbWVNb2R1bGUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmaWxlIGluY2x1ZGUgb3JkZXIuICBMYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBkaXJlY3RvcmllcyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZ2VuZXJpYyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICAic3dpZ19saWIvcHl0aG9uL2Zvby5pIiBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICAic3dpZ19saWIvZm9vLmkiLiAgICBJIHRob3VnaHQgdGhpcyB3YXMgdGhlIGNhc2UgYWxyZWFkeSwgYnV0CiAgICAgICAgICAgIGFwcGFyZW50bHkgaXQgaGFzIGJlZW4gYnJva2VuIGZvciBxdWl0ZSBzb21lIHRpbWUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN0ZF9kZXF1ZS5pIGxpYnJhcnkgZmlsZS4gIFdvcmsgaW4gcHJvZ3Jlc3MuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsLFBlcmxdCiAgICAgICAgICAgIEltcHJvdmVtZW50cyB0byB0eXBlbWFwcy5pLiAgSU5QVVQvSU5PVVQgdHlwZW1hcHMgcGVyZm9ybSBiZXR0ZXIKICAgICAgICAgICAgZXJyb3IgY2hlY2tpbmcuICBUeXBlbWFwcyBhcmUgbm93IHN1cHBsaWVkIGZvciByZWZlcmVuY2VzIGxpa2UgCiAgICAgICAgICAgIGludCAmT1VUUFVULCBkb3VibGUgJklOT1VULCBldGMuCiAgICAgICAgICAKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBEZXByZWNhdGVkIHRoZSBUXyogYW5kIExfKiB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgogICAgICAgICAgICBNdWx0aXBsZSByZXR1cm4gdmFsdWVzIGFyZSBhbHdheXMgcGxhY2VkIGluIGEgdHVwbGUuIERlcHJlY2F0ZWQKICAgICAgICAgICAgdGhlIEJPVEggdHlwZW1hcHMuICBUaGlzIGlzIG5vdyBJTk9VVCAoZS5nLiwgaW50ICpJTk9VVCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgYXJyYXkuaSwgY2FycmF5LmksIGFuZCB0aW1lci5pIGxpYnJhcnkgZmlsZXMuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBVc2UgY3BvaW50ZXIuaSBpbnN0ZWFkLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRm9yIGNvbnNpc3RlbmN5IHRoZSBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB1c2UgdGhlIEphdmFCZWFuIAogICAgICAgICAgICBwcm9wZXJ0eSBkZXNpZ24gcGF0dGVybiBsaWtlIG1lbWJlciB2YXJpYWJsZXMgYWx3YXlzIGhhdmUuIFRoaXMgbWVhbnMgaWYgeW91IGFyZSAKICAgICAgICAgICAgd3JhcHBpbmcgYSB2YXJpYWJsZSBjYWxsZWQgZm9vLCB0aGUgZ2V0dGVyIGlzIGNhbGxlZCBnZXRGb28oKSBhbmQgdGhlIHNldHRlciBpcyAKICAgICAgICAgICAgY2FsbGVkIHNldEZvbygpLiBCZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBKYXZhIG1vZHVsZSB0aGUgZ2V0dGVycyBhbmQgCiAgICAgICAgICAgIHNldHRlcnMgd2VyZSBjYWxsZWQgZ2V0X2ZvbygpIGFuZCBzZXRfZm9vKCkuIElmIHlvdSByZWFsbHkgd2FudCB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzIHVzZSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgbGlrZSB0aGlzOiAlcmVuYW1lKF9mb28pIEZvbzsKCjA3LzMxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY2FzdGluZyBwcm9ibGVtIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgICBjbGFzcyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJhciA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJheiA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIHNwYW0gOiBwdWJsaWMgYmFyLCBwdWJsaWMgYmF6IHt9OwoKICAgICAgICAgICAgdGhlbiB0aGUgd3JhcHBlcnMgd291bGRuJ3QgY29tcGlsZSBkdWUgdG8gYW4gYW1iaWd1b3VzIGNhc3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIER1ZSB0byBuZXcgc3RhdGljIHR5cGVjaGVja2luZyBhbGwgcG9pbnRlcnMgaGVsZCBpbiBhIEphdmEgbG9uZyBhcmUgcGFydCBvZiAKICAgICAgICAgICAgdGhlIGludGVybmFsIHdvcmtpbmdzIGFuZCB0aGlzIHBvaW50ZXIgdmFsdWUgaW4gdGhlIEphdmEgbG9uZyBoYXMgYmVjb21lIGFic3RyYWN0ZWQKICAgICAgICAgICAgZGF0YS4gVGhlIHR5cGUgd3JhcHBlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFzIHN1Y2ggcHJvdGVjdGVkLgogICAgICAgICAgICBJZiB5b3UgbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBvaW50ZXJzIGZyb20gSmF2YSBvciBmb3IgZXhhbXBsZSBjcmVhdGUgYSBwcm94eSAKICAgICAgICAgICAgY2xhc3Mgb3IgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCBhIG51bGwgcG9pbnRlciwgYWRkIGEgZnVuY3Rpb24vY29uc3RydWN0b3IgCiAgICAgICAgICAgIHRvIGRvIHNvIHdpdGggdGhlICVqYXZhY29kZSB0eXBlbWFwLiBZb3UgY2FuIGFsc28gbWFrZSBnZXRDUHRyKCkgcHVibGljIGFnYWluIHdpdGgKICAgICAgICAgICAgdGhlICVqYXZhZ2V0Y3B0ciB0eXBlbWFwLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBmb3IgJXR5cGVtYXAoaWdub3JlKS4gSW4gcGFydGljdWxhciB3aGVuIGlnbm9yaW5nIHRoZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICBpbiBhIGZ1bmN0aW9uLiBBbHNvIGZvciBhbGwgcGFyYW1ldGVycyBpbiBjb25zdHJ1Y3RvcnMuIFRoZXNlIG1vZHMgaGF2ZSBhbHNvIGZpeGVkCiAgICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIGZvciBwcm94eSBjbGFzc2VzIC0gU0YgNTgxNzkxLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlbmV3b2JqZWN0IChyZXBsYWNlbWVudCBmb3IgJW5ldykgbm93IGltcGxlbWVudGVkIGZvciBKYXZhLiAKCjA3LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVtYXAgY29waWVzLCAlYXBwbHksIGFuZCAlY2xlYXIgaW5zaWRlCiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2VzLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSk5JIGNsYXNzIG5vdyBoYXMgcGFja2FnZSBhY2Nlc3MgYXMgdGhlIGNsYXNzIG1vZGlmaWVyCiAgICAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAicHVibGljIiB0byBub3RoaW5nLiBUaGlzIGhhcyBiZWVuIGRvbmUKICAgICAgICAgICAgYXMgdGhpcyBjbGFzcyBpcyBub3cgbW9yZSBmb3IgdGhlIGludGVybmFsIHdvcmtpbmdzIG9mIFNXSUcgc2luY2UgdGhlIG1vZHVsZQogICAgICAgICAgICBjbGFzcyBoYXMgc3RhdGljIHR5cGUgY2hlY2tpbmcgZm9yIGFsbCB0eXBlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgJWpuaWNsYXNzY2xhc3Ntb2RpZmllciAKICAgICAgICAgICAgcHJhZ21hIHRvIGNoYW5nZSBpdCBiYWNrIHRvICJwdWJsaWMiLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eS9TaGFkb3cgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZSAtcHJveHkgYW5kIAogICAgICAgICAgICAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBkZXByZWNhdGVkLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIAogICAgICAgICAgICBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhlbiB1c2UgdGhlIG5ldyAtbm9wcm94eSBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJlbWFpbmluZyBwcmFnbWFzIHNoYWtldXAuIFRoZXNlIHdlcmUgdGhlIHJlbWFpbmluZyBwcmFnbWFzIGFuZCB0aGVpcgogICAgICAgICAgICBuZXcgbmFtZXMgd2hlcmUgY2hhbmdlZDoKCiAgICAgICAgICAgIG1vZHVsZWJhc2UKICAgICAgICAgICAgbW9kdWxlY29kZQogICAgICAgICAgICBtb2R1bGVjbGFzc21vZGlmaWVycwogICAgICAgICAgICBtb2R1bGVpbXBvcnQgPT4gbW9kdWxlaW1wb3J0cwogICAgICAgICAgICBtb2R1bGVpbnRlcmZhY2UgPT4gbW9kdWxlaW50ZXJmYWNlcwoKICAgICAgICAgICAgVGhlIG1vZHVsZWltcG9ydHMgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdG8gaG93IHRoZSBtb2R1bGVpbXBvcnQgcHJhZ21hIHdvcmtlZC4gCiAgICAgICAgICAgIE5vdyBpdCBhY3R1YWxseSB0YWtlcyBjb2RlIHdoaWNoIGdldHMgcGxhY2VkIGJlZm9yZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBzbyB0aGUgCiAgICAgICAgICAgIHdob2xlIGltcG9ydCBzdGF0ZW1lbnQgaGFzIHRvIGJlIGdpdmVuLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW1wb3J0cz0lewogICAgICAgICAgICBpbXBvcnQgamF2YS5pby4qOwogICAgICAgICAgICBpbXBvcnQgamF2YS5tYXRoLio7CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbW9kdWxlaW50ZXJmYWNlcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG9sZCBtb2R1bGVpbnRlcmZhY2UgaW4gdGhhdCBpZiAKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgdGhleSBtdXN0IGJlIGNvbW1hIHNlcGFyYXRlZCBpbiBvbmUgdXNlIG9mIAogICAgICAgICAgICB0aGUgcHJhZ21hLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW50ZXJmYWNlcz0iU2VyaWFsaXphYmxlLCBNeUludGVyZmFjZSIKCiAgICAgICAgICAgIFRoZXNlIGxhc3QgdHdvIHByYWdtYXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgamF2YWludGVyZmFjZXMgYW5kIGphdmFpbXBvcnRzIAogICAgICAgICAgICB0eXBlbWFwLgoKICAgICAgICAgICAgQSBzaW1pbGFyIHNldCBvZiBwcmFnbWFzIGhhcyBiZWVuIGludHJvZHVjZWQsIG5hbWVseToKCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2ltcG9ydAogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZQoKICAgICAgICAgICAgVGhlc2Ugd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgbW9kdWxlIGNvdW50ZXJwYXJ0cy4gTm90ZSB0aGF0IHByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG1vZHVsZVhYWCBwcmFnbWFzIHdvcmtlZCBvbiB0aGUgb2xkIG1vZHVsZSBjbGFzcyB3aGljaCBpcyBub3cgY2FsbGVkIHRoZQogICAgICAgICAgICBKTkkgY2xhc3MgKHRoZSBjbGFzcyB3aXRoIHRoZSBuYXRpdmUgZnVuY3Rpb25zKS4gVGhlIGpuaWNsYXNzWFhYIHByYWdtYXMgbm93IAogICAgICAgICAgICB3b3JrIG9uIHRoZSBuZXcgbW9kdWxlIGNsYXNzICh0aGUgY2xhc3MgdGhhdCBoYXMgYWxsIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGFuZAogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMsIHBsdXMgYWxsIG90aGVyCiAgICAgICAgICAgIHJlbWFpbmluZyBmdW5jdGlvbnMgd2hlbiB1c2luZyB0aGUgbG93LWxldmVsIHByb2NlZHVyYWwgaW50ZXJmYWNlKS4KCiAgICAgICAgICAgIEluIHN1bW1hcnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcmFnbWFzIG1ha2UgdXAgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICA8am5pY2xhc3NpbXBvcnRzPgogICAgICAgICAgICA8am5pY2xhc3Ntb2RpZmllcnM+IGNsYXNzIG1vZHVsZW5hbWUgZXh0ZW5kcyA8am5pY2xhc3NiYXNlPiBpbXBsZW1lbnRzIDxqbmljbGFzc2ludGVyZmFjZXM+IHsKICAgICAgICAgICAgICAgIDxqbmljbGFzc2NvZGU+CiAgICAgICAgICAgICAgICAuLi4gU1dJRyBnZW5lcmF0ZWQgZnVuY3Rpb25zIC4uLgogICAgICAgICAgICB9Cn0KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZXByZWNhdGVkIG1vZHVsZW1ldGhvZG1vZGlmaWVycyBwcmFnbWEgYW5kIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIGEgYmV0dGVyICVmZWF0dXJlIGJhc2VkIGRpcmVjdGl2ZSBjYWxsZWQgJWphdmFtZXRob2Rtb2RpZmllcnMuCiAgICAgICAgICAgIEEgdXNlZnVsIGV4YW1wbGUgd291bGQgYmUgZm9yIHN5bmNocm9uaXNhdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBzOgoKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgZm9vKGludCBhKSAicHVibGljIHN5bmNocm9uaXplZCI7CgogICAgICAgICAgICBDaGFuZ2VzIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZGVmYXVsdCAoInB1YmxpYyIpIHRvICJwdWJsaWMgc3luY2hyb25pemVkIi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU2V2ZXJhbCBkaXJlY3RpdmVzIG5vdyBhbGxvdyBvcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIFRoZXNlIGluY2x1ZGU6CgogICAgICAgICAgICAgICAgJW1vZHVsZShuYW1lPSJ2YWx1ZSIsIG5hbWU9InZhbHVlIiwgLi4uKSBtb2R1bGVuYW1lCiAgICAgICAgICAgICAgICAlaW1wb3J0KG5hbWU9InZhbHVlIiwgLi4uKSAiZmlsZW5hbWUuaSIKICAgICAgICAgICAgICAgICVleHRlbmQobmFtZT0idmFsdWUiLCAuLi4pIGNsYXNzbmFtZSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZXNlIGN1cnJlbnRseSBoYXZlIG5vIGVmZmVjdCBhbmQgYXJlIHJlc2VydmVkIGZvcgogICAgICAgICAgICBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICAgICAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudHMgdG8gc21hcnQtcG9pbnRlciBoYW5kbGluZy4gIFNXSUcgb25seSBwcm92aWRlcwogICAgICAgICAgICBleHRyYSBzdXBwb3J0IGZvciBhIHNtYXJ0LXBvaW50ZXIgaWYgb3BlcmF0b3ItPigpIHJldHVybnMKICAgICAgICAgICAgYSBwcm9wZXIgcG9pbnRlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKCiAgICAgICAgICAgIElmIG9wZXJhdG9yLT4oKSByZXR1cm5zIGFuIG9iamVjdCBieSB2YWx1ZSBvciByZWZlcmVuY2UsCiAgICAgICAgICAgIHRoZW4gU1dJRyBleGFtaW5lcyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHNlZSBpZiBpdCBhbHNvCiAgICAgICAgICAgIGltcGxlbWVudHMgb3BlcmF0b3ItPigpLiAgSWYgc28sIFNXSUcgY2hhc2VzIG9wZXJhdG9yLT4oKQogICAgICAgICAgICB1bnRpbCBpdCBjYW4gZmluZCBvbmUgdGhhdCByZXR1cm5zIGEgcG9pbnRlci4gIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNhc2VzIGxpa2UgdGhpcyB0byB3b3JrOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgQmFyIG9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkgICAgICAjIEludm9rZXMgRm9vOjpibGFoKCkKCiAgICAgICAgICAgIFRoZSBzLmJsYWgoKSBjYWxsIGFjdHVhbGx5IGludm9rZXM6CgogICAgICAgICAgICAgICAgICAoKHMub3BlcmF0b3ItPigpKS5vcGVyYXRvci0+KCkpLT5ibGFoKCk7CiAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHR5cGVkZWYgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gJiBGb29SZWY7CiAgICAgICAgICAgICAgICAgRm9vUmVmIGJsYWgoKTsKCiAgICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndAogICAgICAgICAgICBjb21waWxlLgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBXcmFwcGluZyBvZiBzdGF0aWMgbWV0aG9kcyBoYXMgYmVlbiBpbXByb3ZlZCBpbiBwcm94eSBjbGFzc2VzLiAgSW4gb2xkZXIKICAgICAgICAgICAgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCBiYXIoKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBzdGF0aWMgbWV0aG9kIHdhcyBvbmx5IGF2YWlsYWJsZSBhcyBhIGZ1bmN0aW9uIEZvb19iYXIoKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvb19iYXIoKQoKICAgICAgICAgICAgTm93LCB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYWxzbyBiZSBpbnZva2VkIHRocm91Z2ggYW4gaW5zdGFuY2UgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICAgICA+Pj4gZi5iYXIoKSAgICAgICAgIyBJbnZva2VzIHN0YXRpYyBtZXRob2QKCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uLiAgQWRkaXRpb25hbGx5LCBmb3IgUHl0aG9uLTIuMiwKICAgICAgICAgICAgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGJlIGludm9rZWQgYXM6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vLmJhcigpCgogICAgICAgICAgICBUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uIGlzIHN0aWxsIHN1cHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZgogICAgICAgICAgICB5b3UgY2FyZSBhYm91dCBtYWtpbmcgeW91ciBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uLAogICAgICAgICAgICBlaXRoZXIgdXNlIEZvb19iYXIoKSBvciBhY2Nlc3MgdGhlIG1ldGhvZCB0aHJvdWdoIGFuIGluc3RhbmNlLgogCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZS4gIFByb3h5IGNsYXNzZXMgbm93IHV0aWxpemUgbmV3IFB5dGhvbi0yLjIKICAgICAgICAgICAgZmVhdHVyZXMgaW5jbHVkaW5nIHByb3BlcnRpZXMgYW5kIHN0YXRpYyBtZXRob2RzLiAgSG93ZXZlciwgdGhlc2UgZmVhdHVyZXMKICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpbiBhIHdheSB0aGF0IHByb3ZpZGVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25zLiAgSW4gb3RoZXIgd29yZHMsIHByb3h5IGNsYXNzZXMgd29yayB3aXRoIGFsbCB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gYW5kIG9ubHkgdXNlIG5ldyBmZWF0dXJlcyB3aGVuIHJ1bm5pbmcgb24gUHl0aG9uLTIuMi4KCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICVleHRlbmQgc28gdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgeCkgeyB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpzKSB7IH07CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGJvdGggQysrICphbmQqIEMuCgowNy8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE1vcmUgbmV3IHR5cGVtYXBzIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSAKICAgICAgICAgICAgZmluYWxpemUoKSBtZXRob2RzIChwcm94eSBjbGFzc2VzIG9ubHkpIGFuZCB0aGUgZ2V0Q1B0cigpIG1ldGhvZHMgZm9yIHByb3h5IAogICAgICAgICAgICBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFmaW5hbGl6ZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgICAgICAgIF9kZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwIHdpbGwgZW5hYmxlIHVzZXJzIHRvIGhhbmRsZSBKYXZhIG51bGwgYnkgb3ZlcnJpZGluZwogICAgICAgICAgICB0aGlzIHR5cGVtYXAgLSBhIHJlcXVlc3RlZCBmZWF0dXJlLgoKICAgICAgICAgICAgVGhlIC1ub2ZpbmFsaXplIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBUaGUgamF2YWZpbmFsaXplCiAgICAgICAgICAgIHR5cGVtYXAgaXMgbW9yZSBwb3dlcmZ1bCBhcyBpdCB3aWxsIGFsbG93IHRoZSByZW1vdmFsIG9mIHRoZSBmaW5hbGl6ZSBtZXRob2RzIAogICAgICAgICAgICBmb3IgYWxsIG9yIGFueSBvbmUgb3IgbW9yZSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzLgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgZ2V0Q1B0clhYWCgpIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gYSBzdGF0aWMgZnVuY3Rpb24gYW5kCiAgICAgICAgICAgIGlzIG5vdyBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKFhYWCBvYmopIHsuLi59CgogICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWVzdGVkIGNoYW5nZSB3aGljaCB3aWxsIGFsbG93IEphdmEgbnVsbCBwb2ludGVycyB0byBiZSB1c2VkIGFzIG51bGwKICAgICAgICAgICAgY2FuIGJlIHBhc3NlZCBpbiBmb3Igb2JqLiBIb3dldmVyLCB0byBhY2hpZXZlIHRoaXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgbXVzdCBiZQogICAgICAgICAgICB3cml0dGVuIHVzaW5nIHRoZSBuZXcgamF2YWdldGNwdHIgdHlwZW1hcCBkaXJlY3RpdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoaXMgZnVuY3Rpb24gYmFjayBpbiB1c2luZyB0aGUKICAgICAgICAgICAgbmV3IGphdmFjb2RlIHR5cGVtYXA6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKCiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTIgYW5kIFNXSUctMS4zLjEzCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMSBhbmQgZWFybGllcgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJX0KCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBkaXJlY3RpdmUgdG8gY29udHJvbCBjb25zdGFudCBjb2RlIGdlbmVyYXRpb24gLSAlamF2YWNvbnN0LgogICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgaGFuZGxpbmcgY29uc3RhbnRzIGlzIHRvIGdldCB0aGUgdmFsdWUgdGhyb3VnaAogICAgICAgICAgICBhIEpOSSBjYWxsLCBlZwoKICAgICAgICAgICAgI2RlZmluZSBZRUxMT1cgNQogICAgICAgICAgICAjZGVmaW5lIEJJRyAxMjM0TEwKCiAgICAgICAgICAgIHJlc3VsdHMgaW46CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSBtb2R1bGVuYW1lLmdldF9ZRUxMT1coKTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IG1vZHVsZW5hbWUuZ2V0X0JJRygpOwoKICAgICAgICAgICAgRWFybGllciB2ZXJzaW9ucyBvZiB0aGUgSmF2YSBtb2R1bGUgaW5pdGlhbGlzZWQgdGhlIHZhbHVlIHVzaW5nIHRoZSBDIHZhbHVlOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gNTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEyMzRMTDsKCiAgICAgICAgICAgIFRoaXMgd29ya3MgaW4gbW9zdCBjYXNlcywgYnV0IHRoZSB2YWx1ZSBmb3IgQklHIHdvbid0IGNvbXBpbGUgYXMgMTIzNExMIGlzIG5vdAogICAgICAgICAgICB2YWxpZCBKYXZhIGNvZGUgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gZ2V0IHRoZSAKICAgICAgICAgICAgdmFsdWVzIHRocm91Z2ggYSBKTkkgY2FsbC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlc2UgJ2NvbnN0YW50cycgY2Fubm90IGJlIHVzZWQgCiAgICAgICAgICAgIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGUgJWphdmFjb25zdCBkaXJlY3RpdmUgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoZQogICAgICAgICAgICB3YXkgdGhlIGNvbnN0YW50IHZhbHVlIGlzIGluaXRpYWxpc2VkIGFuZCB3b3JrcyBsaWtlIG90aGVyICVmZWF0dXJlCiAgICAgICAgICAgIGRpcmVjdGl2ZXMsIGVnCgogICAgICAgICAgICAlamF2YWNvbnN0KDApOyAgICAgLy8gYWxsIGNvbnN0YW50cyBmcm9tIHRoaXMgcG9pbnQgb24gYXJlIGluaXRpYWxpc2VkIHVzaW5nIHRoZSBDIHZhbHVlCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQklHOyAvLyBqdXN0IEJJRyBpbml0aWFsaXNlZCB1c2luZyBKTkkgY2FsbCAobXVzdCBiZSBwYXJzZWQgYmVmb3JlIEJJRyBpcyBkZWZpbmVkKQoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICAqKiogSU1QT1JUQU5UIENIQU5HRVMgVE8gVEhFIFBZVEhPTiBNT0RVTEUgKioqCgogICAgICAgICAgICAoMSkgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVuYWJsZXMgc2hhZG93L3Byb3h5IGNsYXNzZXMgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHR3byBmaWxlcyBhcmUgYWx3YXlzIGNyZWF0ZWQgYnkgU1dJRy4gIEZvcgogICAgICAgICAgICBpbnN0YW5jZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICAgLy8gZmlsZTogZm9vLmkKICAgICAgICAgICAgICAgICAlbW9kdWxlIGZvbwogICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlbiBzd2lnIGdlbmVyYXRlcyB0d28gZmlsZXMgImZvb193cmFwLmMiIGFuZCAiZm9vLnB5Ii4KCiAgICAgICAgICAgICgyKSBUaGUgbmFtZSBvZiB0aGUgbG93LWxldmVsIEMgZXh0ZW5zaW9uIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAgVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlCiAgICAgICAgICAgIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICQgY2MgLWMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4yIGZvb193cmFwLmMKICAgICAgICAgICAgICAgICQgY2MgLXNoYXJlZCBmb29fd3JhcC5vICQoT0JKUykgLW8gX2Zvby5zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgZXh0cmEgdW5kZXJzY29yZQoKICAgICAgICAgICAgVGhpcyBuYW1pbmcgc2NoZW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQeXRob24gbW9kdWxlcyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgZXh0ZW5zaW9uIGNvZGUuICBGb3IgaW5zdGFuY2UsIHRoZSBzb2NrZXQgbW9kdWxlIGNvbnNpc3RzCiAgICAgICAgICAgIG9mICJfc29ja2V0LnNvIiBhbmQgInNvY2tldC5weSIuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLAogICAgICAgICAgICB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHdhcyBuYW1lZCAiZm9vY21vZHVsZS5zbyIuCgogICAgICAgICAgICAoMykgQSBuZXcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBQeXRob24gY29kZSBpbnRvCiAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIC5weSBmaWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgJXsKICAgICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiSGVsbG8gV29ybGQiCiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vZHVsZXMgYXMgYSBtaXggb2YgQyBhbmQgUHl0aG9uLgogICAgICAgICAgICAgUHl0aG9uIGNvZGUgaXMgc2VhbWxlc3NseSBhZGRlZCB0byB0aGUgbW9kdWxlLgoKICAgICAgICAgICAgKDQpIFRoZSAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIFRoaXMgaXMgdHVybmVkIG9uCiAgICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAgICAgICAgICAoNSkgVG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0cmEgcHl0aG9uIGZpbGUsIHVzZSB0aGUgIi1ub3Byb3h5IgogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgbGlrZWx5IGJyZWFrIHRoZSBidWlsZCBlbnZpcm9ubWVudCBvZiBwcm9qZWN0cyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgc2hhZG93IGNsYXNzZXMuICAgVG8gZml4IHRoaXMsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgLnNvIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKICAgICAgICAgICAgTWFrZWZpbGUgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IGV4YW1wbGVjbW9kdWxlLnNvCgogICAgICAgICAgICBKdXN0IGNoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBfZXhhbXBsZS5zbwoKICAgICAgICAgICAgKioqIERPQ1VNRU5UQVRJT04gVVBEQVRFICoqKgogICAgICAgICAgICBUaGUgZmlsZSBEb2MvTWFudWFsL1B5dGhvbi5odG1sIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbmdlcy4KCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1ub2V4dGVybiBvcHRpb24uICAgSWYgc3VwcGxpZWQsIFNXSUcgd2lsbCBub3QgZ2VuZXJhdGUKICAgICAgICAgICAgZXh0cmEgZXh0ZXJuIGRlY2xhcmF0aW9ucy4gIFRoaXMgaXMgc29tZXRpbWVzIGFuIGlzc3VlIG9uIAogICAgICAgICAgICBub24tdW5peCBwbGF0Zm9ybXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBmb3IgaWdub3JlZCBmcmllbmQgZnVuY3Rpb25zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NDQ5OCBdIC1wcm94eSBhbmQgJWluY2x1ZGUgInBvaW50ZXIuaSIgY2xhc2guCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhdmlkIENyZWFzeS4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzYxMDMgXSBnbG9iYWwgZGVzdHJ1Y3Rpb24gd2FybmluZyB3aXRoIHNoYWRvdy4KICAgICAgICAgICAgUGVybCBleHRlbnNpb25zIHNob3VsZCBubyBsb25nZXIgcmVwb3J0IHRoZSB3YXJuaW5nCgogICAgICAgICAgICAgICAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZHVyaW5nIGdsb2JhbCBkZXN0cnVjdGlvbi4iCiAKICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggInBlcmwgLXciLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJldHQgV2lsbGlhbXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluIEMrKyBtb2RlLCBTV0lHIG5vdyBhbHdheXMgZGVmaW5lcyBuYW1lc3BhY2Ugc3RkLiAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgaXQncyBlbXB0eS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzaWxlbmNlIGVycm9ycyBmcm9tIHByb2dyYW1zCiAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBzdGF0ZW1lbnRzIHN1Y2ggYXMgInVzaW5nIG5hbWVzcGFjZSBzdGQ7Ii4KICAgICAgICAgICAgVGhpcyBmaXhlcyBCdWcgWyA1ODQwMTcgXSB1c2luZyBuYW1lc3BhY2Ugc3RkIGdlbmVyYXRlcyBlcnJvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCgowNy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWVzc2FnZSBmb3IgJWFwcGx5LiAgSWYgeW91IHVzZSAlYXBwbHkgYnV0IG5vIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBkZWZpbmVkLCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIHNob3VsZCBoZWxwIHdpdGgKICAgICAgICAgICAgcHJvYmxlbXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICVhcHBseSBjaGFyICpPVVRQVVQgeyAuLi4gfTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCB0aGlzIHNpbGVudGx5IGRpZCBub3RoaW5nLiAgTm93IHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzOgogIAogICAgICAgICAgICAgICAgICAgZmlsZTpsaW5lLiBXYXJuaW5nLiBDYW4ndCBhcHBseSAoY2hhciAqT1VUUFVUKS4gTm8gdHlwZW1hcHMgYXJlIGRlZmluZWQuCgowNy8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN0YXJ0ZWQgSmF2YSBwcmFnbWEgZGVwcmVjYXRpb24uIFJlcGxhY2VtZW50cyB1c2UgJXR5cGVtYXAgYmFzZWQgCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgYW5kIGVuYWJsZSBwcm94eSBjbGFzc2VzIGFuZCB0aGUgbmV3IHR5cGUgd3JhcHBlciBjbGFzc2VzIHRvIGJlIAogICAgICAgICAgICB0YWlsb3JlZCBpbiB2YXJpb3VzIHdheXMuIFRoZXNlIGFyZSB0aGUgbmV3IHR5cGVtYXBzOgogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UpICAgICAgICAgICAtIGJhc2UgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgLSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBKYXZhIGNsYXNzOiBkZWZhdWx0IGlzICJwdWJsaWMiCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSAgICAgICAgICAgLSBqYXZhIGNvZGUgaXMgY29waWVkIHZlcmJhdGltIHRvIHRoZSBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSAgICAgICAgLSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW50ZXJmYWNlcykgICAgIC0gaW50ZXJmYWNlcyAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgCiAgICAgICAgICAgIEFuZCB0aGVzZSBhcmUgdGhlICVwcmFnbWEgZGlyZWN0aXZlcyBiZWluZyBkZXByZWNhdGVkOgogICAgICAgICAgICBhbGxzaGFkb3diYXNlCiAgICAgICAgICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFsbHNoYWRvd2NvZGUKICAgICAgICAgICAgYWxsc2hhZG93aW1wb3J0CiAgICAgICAgICAgIGFsbHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICBzaGFkb3diYXNlCiAgICAgICAgICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIHNoYWRvd2NvZGUKICAgICAgICAgICAgc2hhZG93aW1wb3J0CiAgICAgICAgICAgIHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICAKICAgICAgICAgICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRhcmdldCBhIHBhcnRpY3VsYXIgcHJveHkgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBGb28gImltcG9ydCBqYXZhLnV0aWwuKiIKICAgICAgICAgICAgb3IgYSBwYXJ0aWN1bGFyIHR5cGUgd3JhcHBlciBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIGRvdWJsZSogImltcG9ydCBqYXZhLm1hdGguKiIKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAoY29ycmVjdGVkIHR5cG8gaW4gbGluZSBiZWxvdyAtIDA2LzI2LzIwMDgpCiAgICAgICAgICAgICAgICVmcmFnbWVudCgidHlwZV9oZWFkZXIiLCJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0idHlwZV9oZWFkZXIiKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGNvZGUgZnJhZ21lbnQgaXMgb25seSBlbWl0dGVkIGlmIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFjdHVhbGx5IHVzZWQuICAgQSBzaW1pbGFyIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIGFubm90YXRpb24gYW5kIHRoZSAlZmVhdHVyZSBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJmcmFnbWVudCIsInR5cGVfaGVhZGVyIikgIFNvbWVEZWNsYXJhdGlvbjsKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byAlZnJhZ21lbnQgaXMgdGhlIGZyYWdtZW50IG5hbWUuICBUaGUgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgICAgIGlzIHRoZSBmaWxlIHNlY3Rpb24gd2hlcmUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkLiAgCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUgaXMgZm9yIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgICBhbmQgYWR2YW5jZWQgdXNlcnMgd2FudGluZyB0byBzdHJlYW1saW5lIHR5cGVtYXAgY29kZS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIG1lbWJlcmluIHR5cGVtYXBzIGZvciBhbGwgYXJyYXlzIGluIGFuIGF0dGVtcHQgdG8gZWxpbWluYXRlCiAgICAgICAgICAgIGNvbmZ1c2lvbiBhYm91dCB0aGVpciB1c2UuCgowNi8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBzbWFydC1wb2ludGVycy4gIFdoZW4gYSBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIG9wZXJhdG9yLT4oKSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBCYXIgKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIGxvY2F0ZXMgY2xhc3MgQmFyIGFuZCB0cmllcyB0byB3cmFwIGl0cyBtZW1iZXIgdmFyaWFibGVzIGFuZAogICAgICAgICAgICBtZXRob2RzIGFzIHBhcnQgb2YgRm9vLiAgRm9yIGV4YW1wbGUsIGlmIEJhciB3YXMgZGVmaW5lZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFlvdSBjb3VsZCBkbyB0aGlzIChpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKToKCiAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgZi54ID0gNCAgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjp4CiAgICAgICAgICAgICAgZi5zcGFtKCkgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjpzcGFtCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEMrKwogICAgICAgICAgICBzbWFydC1wb2ludGVycy0tLXdoaWNoIGFsbG93IGF0dHJpYnV0ZXMgdG8gYWNjZXNzZWQgdHJhbnNwYXJlbnRseQogICAgICAgICAgICB0aHJvdWdoIG9wZXJhdG9yLT4uCgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkgaW4gU1dJRy0tLW5vIHNwZWNpYWwgZGlyZWN0aXZlcwogICAgICAgICAgICBhcmUgbmVlZGVkLiAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4gIFVzZSAlaWdub3JlIHRvIGlnbm9yZSAKICAgICAgICAgICAgb3BlcmF0b3ItPi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDYvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlZXhjZXB0IGRpcmVjdGl2ZS4gICAlZXhjZXB0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgowNi8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNsZWFudXAgb2YgdGhlIG1vZHVsZXMgZGlyZWN0b3J5LiAgRWxpbWluYXRlZCBtb3N0CiAgICAgICAgICAgIGhlYWRlciBmaWxlcywgY29uc29saWRhdGVkIG1vZHVsZSBjb2RlIGludG8gc2luZ2xlIGZpbGVzLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaW5zdGFudGlhdGlvbiBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgQWxsIGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMgbXVzdCBub3cgZGVmaW5lIGEgZmFjdG9yeSBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqCiAgICAgICAgICAgICAgICBzd2lnX3B5dGhvbih2b2lkKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBZVEhPTigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbiBhIHRhYmxlIGFuZCBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICAgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIHN3aWdtYWluLmN4eC4gIAoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBoYXMgYSBudW1iZXIgb2YgYmVuZWZpdHMuICBJdCBkZWNvdXBsZXMgdGhlIAogICAgICAgICAgICBTV0lHIG1haW4gcHJvZ3JhbSBmcm9tIGhhdmluZyB0byBrbm93IGFib3V0IHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9ucyBmb3IgZWFjaCBtb2R1bGUuICBBbHNvLCBieSB1c2luZyBhIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIGxvYWRpbmcKICAgICAgICAgICAgb2YgbW9kdWxlcyAoc2ltcGx5IGxvYWQgdGhlIGZpbGUgYW5kIGludm9rZSB0aGUgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbikuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3IgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28gJigpOwoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIG9wZXJhdG9yIG5ld1tdIGFuZCBvcGVyYXRvciBkZWxldGVbXS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHByb2JsZW0gZm9yIGNvbnN0YW50cyBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgaW52b2x2aW5nIHRlbXBsYXRlcy4KCjA2LzE5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBhIGJ1ZyBmb3IgdGhlICctZmVhdHVyZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50OwogICAgICAgICAgICB0aGF0IHNldHRpbmcgd2FzIGVmZmVjdGl2ZWx5IGJlaW5nIGlnbm9yZWQgYW5kIHNvIHRoZSBmZWF0dXJlCiAgICAgICAgICAgIG5hbWUgd2FzIGFsd2F5cyBzZXQgZXF1YWwgdG8gdGhlIG1vZHVsZSBuYW1lLgoKMDYvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBtZW1iZXJzIGFuZCBlbnVtcyBpbiB0ZW1wbGF0ZXMuCgpWZXJzaW9uIDEuMy4xMyAoSnVuZSAxNywgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgY2hhciAqZGF0YSB7IC4uLiB9CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHJlbmFtaW5nIGFuZCBkZWNsYXJhdGlvbgogICAgICAgICAgICBtYXRjaGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgRm9vOjpwcmludDsgICAgICAgICAgLy8gUmVuYW1lIGluIG5hbWVzcGFjZSBGb28KICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyOjpibGFoOyAgICAgICAgICAgICAgIC8vIElnbm9yZSBhIGRlY2xhcmF0aW9uCgogICAgICAgICAgICAlcmVuYW1lIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbnNpZGUgbmFtZXNwYWNlIGJsb2NrcyBhcyB3ZWxsLiBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgcHJpbnQ7ICAgICAgICAgLy8gQXBwbGllcyB0byBwcmludCBiZWxvdwoKICAgICAgICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3N0IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBzaG91bGQgd29yayBwcm9wZXJseSBpbnNpZGUgbmFtZXNwYWNlcy4KICAgICAgICAgICAgTm8gb3RoZXIgY2hhbmdlcyBhcmUgbmVlZGVkLgogICAgICAKMDMvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nLiAgIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIG1hbmFnZXMgc3RydWN0dXJlcyBhbmQgdW5pb25zIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlIHRoYW4gbm9ybWFsCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIEFOU0kgQy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IGhhdmUgYSBzdHJ1Y3R1cmUKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IEZvbygpIHsgLi4uIH0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgbW9yZSBsaWtlIEMrKy4gICBJdCdzIG5vdCBjbGVhciB0aGF0IFNXSUcgZXZlcgogICAgICAgICAgICByZWFsbHkgc3VwcG9ydGVkIHRoZSBBTlNJIEMgYW55d2F5cy0tLXVzaW5nIHRoZSBzYW1lIG5hbWUgd291bGQKICAgICAgICAgICAgYWxtb3N0IGNlcnRhaW5seSBnZW5lcmF0ZSBhIG5hbWUtY2xhc2ggaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjAzLzIyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDUxNzMwMiBdIGZvciBoYW5kbGluZyBvZiByZW5hbWVkIG92ZXJsb2FkZWQKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBOb3csIHJlbmFtZWQgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBpbnRvIGNsYXNzIHNpbmdsZXRvbiBtZXRob2RzIChiYXNpY2FsbHkgYWN0aW5nIGFzICJmYWN0b3J5IgogICAgICAgICAgICBtZXRob2RzKS4KCjAzLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MzI5NTcgXSAlaWdub3JlIHBhcnNlIGVycm9yIGFuZCBjYXN0aW5nIG9wZXJhdG9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjAzLzE4LzIwMDI6IGJlYXpsZXkgKCoqIEFEVkFOQ0VEIFVTRVJTIE9OTFkgKiopCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgY2FzdGluZyBpbiByZXR1cm4gdmFsdWVzLiAgQSBzb21ld2hhdAogICAgICAgICAgICBjb21tb24gcHJvYmxlbSBpbiBjZXJ0YWluIEMrKyBwcm9ncmFtcyBpcyBmdW5jdGlvbnMgdGhhdCBoaWRlCiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB1bmRlcmx5aW5nIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCAKICAgICAgICAgICAgZnJvbSBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBwcm9ncmFtIG1pZ2h0IGluY2x1ZGUKICAgICAgICAgICAgc29tZSBnZW5lcmljIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgTm9kZSAqZ2V0Tm9kZSgpOwoKICAgICAgICAgICAgSG93ZXZlciwgTm9kZSAqIG1heSBqdXN0IGJlIGJhc2UgY2xhc3MgdG8gYSB3aG9sZSBoaWVyYXJjaHkKICAgICAgICAgICAgb2YgZGlmZmVyZW50IG9iamVjdHMuICAgSW5zdGVhZCBvZiByZXR1cm5pbmcgdGhpcyBnZW5lcmljIE5vZGUgKiwKICAgICAgICAgICAgaXQgbWlnaHQgYmUgbmljZSB0byBhdXRvbWF0aWNhbGx5IGRvd25jYXN0IHRoZSBvYmplY3QgaW50byB0aGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZSB1c2luZyBzb21lIGtpbmQgZHluYW1pYyBjYXN0LgoKICAgICAgICAgICAgQXNzdW1pbmcgeW91IHVuZGVyc3RhbmQgdGhlIHBlcmlsIGludm9sdmVkLCBhIGRvd25jYXN0IGNhbiBub3cKICAgICAgICAgICAgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaW4gdGhlIHJ1bi10aW1lIHR5cGUKICAgICAgICAgICAgY2hlY2tlcjoKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKlNXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICosIHZvaWQgKipwdHIpOwoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgogICAgICAgICAgICB0eXBlLiAgSWYgc28sIGEgZGlmZmVyZW50IHR5cGUgZGVzY3JpcHRvciAoZm9yIHRoZSBjb252ZXJ0ZWQgdHlwZSkKICAgICAgICAgICAgaXMgcmV0dXJuZWQuICAgVGhpcyB0eXBlIGRlc2NyaXB0b3Igd291bGQgdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZQogICAgICAgICAgICBhIHBvaW50ZXIgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCiAgICAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3Ugd291bGQgd3JpdGUgYSB0eXBlbWFwIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogewogICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU1dJR19UeXBlRHluYW1pY0Nhc3QoJDFfZGVzY3JpcHRvciwgKHZvaWQgKiopICYkMSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gU1dJR19OZXdQb2ludGVyT2JqKCQxLCB0eSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogPSBTV0lHVFlQRSAqRFlOQU1JQzsKCiAgICAgICAgICAgIFRvIG1ha2UgdGhlIHR5cGVtYXAgaGF2ZSBhbnkgZWZmZWN0LCB5b3UgaGF2ZSB0byB3cml0ZSBhIHN1cHBvcnRpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHBlcmZvcm0gZG93bmNhc3RpbmcuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHN0YXRpYyBzd2lnX3R5cGVfaW5mbyAqCiAgICAgICAgICAgICAgTm9kZV9keW5hbWljX2Nhc3Qodm9pZCAqKnB0cikgewogICAgICAgICAgICAgICAgIE5vZGUgKipucHRyID0gKE5vZGUgKiopIHB0cjsKICAgICAgICAgICAgICAgICBFbGVtZW50ICplID0gZHluYW1pY19jYXN0PEVsZW1lbnQgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRWxlbWVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRGF0YSAqZCA9IGR5bmFtaWNfY2FzdDxEYXRhICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBkOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0RhdGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHR5cGVzIGFyZSBkZXRlcm1pbmVkLiBkeW5hbWljX2Nhc3Q8PgogICAgICAgICAgICB1c2VzIEMrKyBSVFRJLiAgSG93ZXZlciwgaWYgeW91IGhhZCBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcKICAgICAgICAgICAgdGhlIHR5cGUsIHlvdSBjb3VsZCB1c2UgdGhhdCBoZXJlLiAgTm90ZTogaXQgaXMgaW1wb3J0YW50IHRvIHNhdmUKICAgICAgICAgICAgdGhlIG5ldyBwb2ludGVyIHZhbHVlIGJhY2sgaW50byB0aGUgYXJndW1lbnQgYXMgc2hvd24uICBXaGVuIGRvd25jYXN0aW5nLAogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgY291bGQgY2hhbmdlLiAKCiAgICAgICAgICAgIEZpbmFsbHksIHRvIG1ha2UgdGhlIGNhc3RpbmcgZnVuY3Rpb24gYXZhaWxhYmxlLCB5b3UgaGF2ZSB0byByZWdpc3RlcgogICAgICAgICAgICBpdCB3aXRoIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIuIFB1dCB0aGlzIG1hY3JvIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICAgICBEWU5BTUlDX0NBU1QoU1dJR1RZUEVfcF9Ob2RlLCBOb2RlX2R5bmFtaWNfY2FzdCk7CgogICAgICAgICAgICBOb3RlOiB0aGlzIGZlYXR1cmUgZG9lcyBub3QgaW50cm9kdWNlIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiAKICAgICAgICAgICAgbm9ybWFsIFNXSUcgb3BlcmF0aW9uLiAgVGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGJ5IHdyaXRpbmcKICAgICAgICAgICAgYSBuZXcgdHlwZW1hcCB0aGF0IGV4cGxpY2l0bHkgY2FsbHMgU1dJR19UeXBlRHluYW1pY0Nhc3QoKSB0bwogICAgICAgICAgICBtYWtlIGEgY29udmVyc2lvbi4gCiAgCiAgICAgICAgICAgIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZHluYW1pY19jYXN0LmkgY29udGFpbnMgYSBzaW1wbGUgZXhhbXBsZS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEphdmEgbW9kdWxlIGR1ZSB0byBkaWZmZXJlbmNlcwogICAgICAgICAgICBpbiB0aGUgdHlwZS1jaGVja2luZyBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjAzLzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU21hbGwgY2hhbmdlIHRvIHR5cGUtbmFtZSBoYW5kbGluZyBvZiB1bm5hbWVkIHN0cnVjdHVyZXMgYW5kCiAgICAgICAgICAgIHR5cGVkZWYuICBJZiBhIHN0cnVjdHVyZSBvZiB0aGlzIGZvcm0gYXBwZWFyczoKCiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBUaGVuICdGb28nIGlzIHVzZWQgYXMgdGhlIHByb3BlciB0eXBlbmFtZSBmb3IgdGhlIHN0cnVjdHVyZS4KICAgICAgICAgICAgRnVydGhlcm1vcmUsIEZvbyBjYW4gbm93IGJlIHVzZWQgYXMgYSBuYW1lIGluIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgICAgU1dJRyB3YXMgYWxyZWFkeSBraW5kIG9mIGRvaW5nIHRoaXMsIGJ1dCB0aGlzIG1vZGlmaWNhdGlvbiByZWZpbmVzCiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBtb3JlIGNsb3NlbHkgZm9sbG93IHRoZSBDKysgQVJNLCBzZWN0aW9uCiAgICAgICAgICAgIDcuMS4zLCBwLiAxMDYuICBUaGlzIGZpeGVzIGEgY291cGxlIG9mIG9ic2N1cmUgY29ybmVyIGNhc2VzLgoKMDMvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBhIGZldyBlbmhhbmNlbWVudHMuICBGaXJzdCwgdHlwZSBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZWVkZWQgZm9yIGNhc3RpbmcgYW5kIHR5cGUtZXF1aXZhbGVuY2UgaXMgZ2VuZXJhdGVkIGV2ZW4gd2hlbiBiYXNlLWNsYXNzZXMKICAgICAgICAgICAgYXJlbid0IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgIHsgICAgLyogQmFyIHVuc3BlY2lmaWVkICovCiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHZvaWQgYmxhaChCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmxhaCgpIGZ1bmN0aW9uIHN0aWxsIGFjY2VwdHMgRm9vICogZXZlbiB0aG91Z2ggbm90aGluZwogICAgICAgICAgICBpcyByZWFsbHkga25vd24gYWJvdXQgQmFyLiAgIFByZXZpb3VzIFNXSUcgdmVyc2lvbnMgd291bGQganVzdCBnZW5lcmF0ZQogICAgICAgICAgICBhIHR5cGUgZXJyb3IuCgogICAgICAgICAgICBJbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgdGhyb3VnaCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBCYXIgT3RoZXJCYXI7CiAgICAgICAgICAgICAgIGNsYXNzIEZvbzogcHVibGljIE90aGVyQmFyIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBjbGFzcyBvZiBPdGhlckJhciBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgYmFjayB0bwogICAgICAgICAgICBCYXIuICAgVGhlIHVzZSBvZiB0aGUgbmFtZSBPdGhlckJhciBpcyBsb3N0IGluIHRoaXMgcmVzb2x1dGlvbiAodGhlIHdyYXBwZXJzCiAgICAgICAgICAgIHdpbGwgc2ltcGx5IHVzZSBCYXIgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIE90aGVyQmFyKS4KICAgICAgICAgICAKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICAldHlwZW1hcCwgJWFwcGx5LCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGNhbiBub3cgYXBwZWFyIGluc2lkZQogICAgICAgICAgICBjbGFzcyBkZWZpbml0aW9ucy4gICAKCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gY29tcGlsaW5nIFNXSUcgb24gNjQtYml0CiAgICAgICAgICAgIHBsYXRmb3Jtcy4KCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoICJpZ25vcmUiIGFuZCAiaW4iIHR5cGVtYXBzLiAgTG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAiaW4iIHdlcmUgYmVpbmcgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gZXZlbgogICAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIG5ldmVyIHVzZWQuICAgTW9zdGx5IGhhcm1sZXNzLCBidXQgaXQgd291bGQgbGVhZAogICAgICAgICAgICB0byBhIHZhcmlldHkgb2YgY29tcGlsYXRpb24gd2FybmluZ3MuCiAgCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCB0eXBlIHN5c3RlbSBhbmQgaGFuZGxpbmcgb2YgbmVzdGVkIEMrKwogICAgICAgICAgICB0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNvbWVtZXRob2QoQmxhaCB4KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdvdWxkIGltcGxpY2l0bHkgYmUgc2V0IHRvIEJhcjo6QmxhaC4KICAgICAgICAgICAgQWx0aG91Z2ggdGhpcyBpcyB0ZWNobmljYWxseSBhbGxvd2VkLCBpdCBicmVha3MgdHlwZW1hcHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzo6QmxhaCB7IC4uLiB9CgogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIGxpa2UgeW91IGV4cGVjdC4gICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgaW4gU1dJRy0xLjMuMTIuCiAgICAgICAgICAgIE5vdywgdHlwZXMgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjbGFzcyBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZC4KICAgICAgICAgICAgU28sIHRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3aWxsIGJlIEZvbzo6QmxhaC0tLXNpbmNlIHRoZQogICAgICAgICAgICB0eXBlIEJsYWggd2FzIGRlZmluZWQgaW4gRm9vLgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBzdWJ0bGUgdHlwZSBzY29waW5nIHByb2JsZW1zIHdpdGggdHlwZWRlZiBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBCbGFoOwogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKEJsYWggeCwgOjpCbGFoIHkpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwgY2hhbmdlIHRvIGhhbmRsZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgogICAgICAgICAgICBGaXJzdCwgdGhlcmUgaXMgbm8gcG9ydGFibGUgb3IgcmVsaWFibGUgd2F5IHRvIHdyYXAKICAgICAgICAgICAgYSB2YXJhcmdzIGZ1bmN0aW9uIGluIGZ1bGwgZ2VuZXJhbGl0eS4gIEhvd2V2ZXIsIHlvdSAqY2FuKiBjaGFuZ2UKICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2luZyAldmFyYXJncy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKikgZnByaW50ZjsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIC4uLik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyICIuLi4iIGlzCiAgICAgICAgICAgIHNpbXBseSByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiAldmFyYXJncy4gVGhpcwogICAgICAgICAgICByZXN1bHRzIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgY2hhciAqcyk7CgogICAgICAgICAgICBNb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgICBjYW4gYmUgZGVmaW5lZC4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgc3BlY2lmaWVzIGEKICAgICAgICAgICAgbWF4aW11bSBvZiBmb3VyIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKngxID0gMCwgY2hhciAqeDIgPSAwLCBjaGFyICp4MyA9IDAsIGNoYXIgKng0ID0gMCkgZnByaW50ZjsKIAogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIGhhbmRsaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuICB2YXJhcmdzCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGFzIGEgcHJvcGVyIHBhcmFtZXRlciBhbmQgaXMgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICBjb2RlIGdlbmVyYXRvci4gIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbid0IGJlIGhhbmRsZWQgY29ycmVjdGx5CiAgICAgICAgICAgIChhbmQgd2lsbCBnZW5lcmF0ZSBhIHR5cGVtYXAgd2FybmluZykuICAgVGhpcyBjaGFuZ2UgaGFzIGJlZW4KICAgICAgICAgICAgbWFkZSB0byBiZXR0ZXIgaW5jb3Jwb3JhdGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyB3aXRoIG90aGVyCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgc3VjaCBhcyAlaWdub3JlLCAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLgoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUyMjU1NSBdIFN5bnRheCBlcnJvciBwYXJzaW5nICJkZWZpbmUiIGNvbnN0cnVjdC4gU1dJRwogICAgICAgICAgICBpcyBhIGxpdHRsZSBtb3JlIHJlc3RyaWN0aXZlIGluIGRldGVybWluaW5nICNkZWZpbmUgc3RhdGVtZW50cwogICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBhcyBjb25zdGFudHMuICBBbHNvIGFkZGVkIGEgYmV0dGVyIHBhcnNlcgogICAgICAgICAgICBlcnJvciBydWxlIGZvciBoYW5kbGluZyBiYWQgY29uc3RhbnRzLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBDbGFzc2VzIHJlbmFtZWQgd2l0aCAlcmVuYW1lIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSAKICAgICAgICAgICAgYW5vdGhlciBjbGFzcyBnZW5lcmF0ZSBtb3JlIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBjb2RlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBTRiBbICM1MjM2MzIgXSBhbmQgWyAjNTEzMzM1IF0gYm90aCByZXBvcnRlZCBieSBJc3JhZWwgCiAgICAgICAgICAgIFRhbm5lci4gU3VwcG9ydCBmb3IgdHlwZXMgdGhhdCBhcmUgdXNlZCB3aGljaCBhcmUgaW4gYSB0eXBlZGVmLiBUaGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIG5hbWUgaXMgZ2VuZXJhdGVkLiBBbHNvIGdlbmVyYXRlZCBjb3JyZWN0CiAgICAgICAgICAgIHNoYWRvdyBjbGFzc25hbWUgd2hlbiBhIHRlbXBsYXRlZCBjbGFzcyBpcyB1c2VkIHdpdGhpbiBhbm90aGVyIAogICAgICAgICAgICB0ZW1wbGF0ZWQgY2xhc3MuIFNlZSB0aGUgY3BwX3R5cGVkZWYuaSB0ZXN0Y2FzZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gdHlwZSB3YXMgZ2VuZXJhdGVkIGluIHNoYWRvdyBjbGFzc2VzIGZvciB0eXBlcyAKICAgICAgICAgICAgdGhhdCB3ZXJlbid0IHdyYXBwZWQgYnkgU1dJRy4gIFRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSByYXcgCiAgICAgICAgICAgIHBvaW50ZXIsIGllIG5vIHNoYWRvdyBjbGFzcy4KCjAyLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZWQgYnkgJXJlbmFtZSwgJWlnbm9yZSwgYW5kCiAgICAgICAgICAgICVmZWF0dXJlLiAgIElmIGEgdHlwZSBzaWduYXR1cmUgaXMgc3VwcGxpZWQsIGl0IG11c3QgZXhhY3RseQogICAgICAgICAgICBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uLS0taW5jbHVkaW5nIGFueSB1c2Ugb2YKICAgICAgICAgICAgY29uc3QuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvbzEpICAgZm9vKGludCk7CiAgICAgICAgICAgICAgICAlcmVuYW1lKGJhcjEpICAgYmFyKGludCkgY29uc3Q7CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOyAgICAgICAvLyBNYXRjaGVkIC0tPiBmb28xCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpIGNvbnN0OyAvLyBOb3QgbWF0Y2hlZCAKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7ICAgICAgIC8vIE5vdCBtYXRjaGVkCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpIGNvbnN0OyAvLyBNYXRjaGVkIC0tPiBiYXIxCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBub24tY29uc3Qgc3BlY2lmaWNhdGlvbiB3b3VsZCBtYXRjaAogICAgICAgICAgICBib3RoIHRoZSBub24tY29uc3QgYW5kIGNvbnN0IGRlY2xhcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSB3aG9sZQogICAgICAgICAgICBwb2ludCBvZiAlcmVuYW1lIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgaXMgdGhhdCB0aGV5IGJlIGFibGUKICAgICAgICAgICAgdG8gcHJlY2lzZWx5IHBpbnBvaW50IGV4YWN0IGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIHRoZSBwcm9ibGVtLgoKMDIvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMuCiAgICAgICAgICAgIFNXSUcgbm93IG1ha2VzIGEgcHJlbGltaW5hcnkgcGFzcyBvdmVyIHRoZSBwYXJzZSB0cmVlIHRvIGRpc2NvdmVyCiAgICAgICAgICAgIHdoaWNoIGNsYXNzZXMgc3VwcG9ydCBkZWZhdWx0IGFsbG9jYXRpb24uICAgVGhpcyBmaXhlcyBhIG51bWJlcgogICAgICAgICAgICBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFuZCBjYWxsL3JldHVybiBieSB2YWx1ZS4KCjAyLzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IG9uIEN5Z3dpbjogUGVybCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIEphdmEgc2hvdWxkCiAgICAgICAgICAgIHdvcmsgb3V0IG9mIHRoZSBib3gsIGJhcnJpbmcgdGhlIHJ1bnRpbWUgbGlicmFyeS4gUmVtb3ZlZCBkbGx3cmFwIAogICAgICAgICAgICBhbmQgcmVwbGFjZWQgd2l0aCBuZXdseSB3b3JraW5nIGdjYyAtc2hhcmVkIGluc3RlYWQgZm9yIEN5Z3dpbi4gCiAgICAgICAgICAgIEFsbCB0aGlzIHdpbGwgcmVxdWlyZSB0aGUgbmV3IGltcHJvdmVkIGJpbnV0aWxzIDIwMDEwODAyIGFuZCBsYXRlciwKICAgICAgICAgICAgYnV0IHRoZSBsYXRlc3QgQ3lnd2luIGlzIHVzdWFsbHkgdGhlIGJlc3QgcmVjb21tZW5kYXRpb24uCgowMi8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFuZCBQZXJsIHNoYWRvdyBjbGFzc2VzLiBSZXBvcnRlZCBieSBDaGlhLWxpYW5nIEthby4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZml4IHRvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIEMrKyBjbGFzcwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgc28gdGhhdCB3ZSBnZXQgYm90aCBhICJuZXciIHNpbmdsZXRvbiBtZXRob2QKICAgICAgICAgICAgYW5kIGFuICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yIGVhY2ggY2xhc3MuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIGVuYWJsZXMgZGV2ZWxvcGVycyB0byBkZXJpdmUgbmV3IFJ1YnkgY2xhc3NlcyBmcm9tCiAgICAgICAgICAgIFNXSUctd3JhcHBlZCBDKysgY2xhc3NlcyBhbmQgdGhlbiBvdmVycmlkZSB0aGVpciBpbml0aWFsaXplCiAgICAgICAgICAgIG1ldGhvZHMgdG8gcHJvdmlkZSBzdWJjbGFzcy1zcGVjaWZpYyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYXNzaXZlIGRvY3VtZW50YXRpb24gdXBkYXRlIGZvciB0aGUgUnVieSBtb2R1bGUsCiAgICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEZpbGVzLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEFuIGVycm9yIGluIHRoZSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUnVieQogICAgICAgICAgICB3YXMgY2F1c2luZyBzZXZlcmFsIG9mIHRoZSBleGFtcGxlcyB0byBmYWlsLiBSZXBvcnRlZCBieQogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBFbnVtZXJhdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcyAoc3VjaAogICAgICAgICAgICBhcyB0aG9zZSBzZWVuIGluIHRoZSBFeGFtcGxlcy9ydWJ5L2VudW0gZXhhbXBsZSkgd2VyZSBub3QKICAgICAgICAgICAgYmVpbmcgZXhwb3J0ZWQgd2l0aCB0aGUgY29ycmVjdCBuYW1lcy4gUmVwb3J0ZWQgYnkgV2lsbGlhbQogICAgICAgICAgICBGdWx0b24uCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB3ZSBydW4gYWNyb3NzIG92ZXJsb2FkZWQKICAgICAgICAgICAgY2xhc3MgY29uc3RydWN0b3JzIGZvciBDKysgY29kZSwgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBub3QKICAgICAgICAgICAgc3VwcG9ydGVkIChldmVuIGlmIHRoZSBvdmVybG9hZHMgaGF2ZSBiZWVuICVyZW5hbWVkKS4gRm9yIGFuCiAgICAgICAgICAgIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmssIHNlZSBFeGFtcGxlcy9ydWJ5L29wZXJhdG9yLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGFuICJpZ25vcmVkIiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgcGFyc2VyIHJ1bnMKICAgICAgICAgICAgYWNyb3NzIGFuIG9wZXJhdG9yIT0oKSBkZWNsYXJhdGlvbiBmb3IgQysrIGNvZGUuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICJpbXBvcnQiLCAiaW1wb3J0X3RlbXBsYXRlIiwgIm9wZXJhdG9yIiBhbmQKICAgICAgICAgICAgInRlbXBsYXRlIiBleGFtcGxlcy4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtdWx0aS1tb2R1bGUgc3VwcG9ydC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgbWlzc2luZyAiI2RlZmluZSBTV0lHX05PSU5DTFVERSIgYXQgdGhlIHRvcCBvZgogICAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdoZW4gdGhlICctYycgb3B0aW9uIGlzIHVzZWQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBDb3JyZWN0ZWQgYSBtaW5vciBvZmYtYnktb25lIGVycm9yIGZvciB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgICAgc3dpZ190eXBlc1tdIGFycmF5IHRoYXQncyBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIgY29kZS4KCjAyLzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgU0YgWyAjNTE1MDU4IF0gV3JvbmcgY29kZSBmb3IgQysrIHRlbXBsYXRlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KClZlcnNpb24gMS4zLjExIChKYW51YXJ5IDMxLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIGZvciBDKysgb2JqZWN0cyB0aGF0IGRlZmluZQogICAgICAgICAgICBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyB0byB0aGUgdHlwZW1hcCBzeXN0ZW0KICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHdyYXAgQysrIG9iamVjdHMgd2l0aCBubyBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLiAgIFRoaXMgaGFzIGJlZW4gZml4ZWQsIGJ1dCB0aGUgc29sdXRpb24gCiAgICAgICAgICAgIGludm9sdmVzIHNvbWUgY2xldmVyIHRlbXBsYXRlIG1hZ2ljIGNvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4gIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBmaWxlCiAgICAgICAgICAgIExpYi9zd2lnLnN3ZyBmb3IgZnVydGhlciBkZXRhaWxzLiAgVGhpcyBzb2x1dGlvbiBpcwogICAgICAgICAgICBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZWZpbmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEdsb2JhbCB2YXJpYWJsZXMgYW5kIG1lbWJlciBkYXRhIG9mIHR5cGUgImNvbnN0IGNoYXIgKiIKICAgICAgICAgICAgY2FuIGJlIHNldCwgYnV0IHRoZSBvbGQgdmFsdWUgaXMgc2lsZW50bHkgZGlzY2FyZGVkIHdpdGhvdXQKICAgICAgICAgICAgYW55IGdhcmJhZ2UgY29sbGVjdGlvbi4gICBUaGlzIG1heSBnZW5lcmF0ZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgdG8gbW9yZSBzYWZlbHkgaGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vID0gIkhlbGxvIFdvcmxkXG4iOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCdzIG5vdCBzYWZlIHRvIGZyZWUgdGhlIG9sZCB2YWx1ZS4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgY2FuIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IHZhbHVlIGFuZCBtYWtlIGZvbyBwb2ludAogICAgICAgICAgICB0byBpdC4gICBUbyBmaXggdGhpcyBtZW1vcnkgbGVhaywgeW91IGNhbiBwcm9iYWJseSBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNsZWFyIGNvbnN0IGNoYXIgKmZvbzsKICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKiB7Y29uc3QgY2hhciAqZm9vfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbWlub3IgdHlwZW1hcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLiAgRmlyc3QsCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBieSBpbmNsdWRpbmcgYSBzcGVjaWFsCiAgICAgICAgICAgIHdhcm5pbmcgYXR0cmlidXRlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChpbix3YXJuaW5nPSJJJ20gZ29pbmcgdG8gZG8gc29tZXRoaW5nIGRhbmdlcm91cyIpIC4uLgoKICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZSB3aWxsIHNob3cgdXAgd2hlbmV2ZXIgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYXBwbGllZC4KCiAgICAgICAgICAgIFNlY29uZCwgYSB0eXBlbWFwIGNhbiBmb3JjZSBhIG5vLW1hdGNoIGJ5IGRlZmluaW5nCgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHNvbWV0eXBlICJwYXNzIgoKICAgICAgICAgICAgSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHlwZW1hcCBzeXN0ZW0gd2lsbCAqbm90KiByZWNvcmQgYQogICAgICAgICAgICB0eXBlbWFwIG1hdGNoIGZvciAic29tZXR5cGUiLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICAgICAgICAgICAgc2VsZWN0ZWQgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBkaXNhYmxlCiAgICAgICAgICAgIGEgdHlwZW1hcCBmZWF0dXJlIGZvciBzb21lIHR5cGUsIHlvdSBjb3VsZCBkbyB0aGlzLgoKICAgICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgb2YgdHlwZSAnY29uc3QgY2hhciAqJyB0byBiZSBzZXQuCiAgICAgICAgICAgICAgICV0eXBlbWFwKHZhcmluKSBjb25zdCBjaGFyICogInBhc3MiCgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiCiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGNvbnN0IGJsYWggKiAicGFzcyIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAgICAgY29uc3QgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGlucHV0IHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgIChUaGlzIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMgb2YgdHlwZW1hcHMgc3VnZ2VzdGVkIGJ5IEdyZWcgU3RlaW4pLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8yOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gZW51bWVyYXRpb25zIHdlcmUgd3JhcHBlZCB3aGVuIHRoZSAtc2hhZG93IAogICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZC4gUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KCjAxLzI4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBHbG9iYWwgYXJyYXlzIGFyZSBzdWNjZXNzZnVsbHkgd3JhcHBlZC4gSW4gZmFjdCB0aGV5IHN0YXJ0ZWQKICAgICAgICAgICBtb3N0bHkgd29ya2luZyBpbiBTV0lHLTEuMy4xMC4KCjAxLzI4LzIwMDI6cmljaGFyZHAKCSAgIEFkZGVkIGZpcnN0IGF0dGVtcHQgYXQgQysrIGFuZCAtc2hhZG93IHN1cHBvcnQgZm9yIFBIUDQgbW9kdWxlLAoJICAgcGxlYXNlIHRlc3QgYW5kIG1haWwgbWUgaWYgYW55IHByb2JsZW1zL2lkZWFzIG9uIGltcHJvdmluZyBpdC4KCgkgICBUaGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCB1bmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMsCgkgICBwbGVhc2Ugc2VlIEV4YW1wbGVzL3BocDQvc3luYy9SRUFETUUgZm9yIGRldGFpbHMuCgoJICAgQWxzbyBtb3JlIFBIUCBkb2N1bWVudGF0aW9uIGFkZGVkIHRvIERvYy9NYW51YWwvUGhwLmh0bWwKCjAxLzI3LzIwMDI6YmVhemxleQogICAgICAgICAgIFRoZSBBTlNJIEMgc2l6ZV90IHR5cGUgaXMgbm93IHJlY29nbml6ZWQgYXMgYW4gaW50ZWdlciBieSBkZWZhdWx0LgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgc3VwcG9ydCBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgVGhpcyBpcyBub3QgYSBwb3J0YWJsZSBmZWF0dXJlIGFuZCB3aWxsIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydAogICAgICAgICAgIGZvciB0aGUgbG9uZyBsb25nIHR5cGUuICBJbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgICBsb25nIGxvbmcgKGUuZy4sIFRjbCBhbmQgUGVybCksIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZwogICAgICAgICAgIG9mIGRpZ2l0cy4gIFRoaXMgcHJldmVudHMgdGhlaXIgdXNlIGluIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBidXQKICAgICAgICAgICBzdGlsbCBhbGxvd3MgdmFsdWVzIHRvIGJlIHNldCBmcm9tIGEgc3RyaW5nLiAgCgogICAgICAgICAgIGxvbmcgbG9uZyBzdXBwb3J0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHN0cnRvbGwoKSBhbmQgc3RydG91bGwoKQogICAgICAgICAgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSAnbGxkJyBhbmQgJ2xsdScgZm9ybWF0IHNwZWNpZmllcnMKICAgICAgICAgICBvZiBzcHJpbnRmKCkuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM1MDE4MjcgXSBEZWxldGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQuICAgVGhlIFRjbAogICAgICAgICAgIG1vZHVsZSB3YXNuJ3QgY29ycmVjdGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMgd2hlbiB0aGV5CiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHVzaW5nICVhZGRtZXRob2RzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBSZWluaGFyZCBGb2JiZS4KCjAxLzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuICBUeXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBoYW5kbGluZyB0aGVzZSB0eXBlcy4KICAgICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHBhcnNlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhY2NlcHQgbG9uZyBsb25nCiAgICAgICAgICAgbGl0ZXJhbHMgc3VjaCBhcyAxMjM0TEwgYW5kIDEyMzRVTEwuCgowMS8yNy8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQSBDIGNoYXJbXSBpcyBtYXBwZWQgdG8gYSBKYXZhIFN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCAKICAgICAgICAgICBTV0lHIGhhbmRsaW5nIG9mIGNoYXJbXSBhbmQgY2hhciouIEl0IHVzZWQgdG8gYmUgbWFwcGVkIHRvIGJ5dGVbXS4gCiAgICAgICAgICAgTm90ZSB0aGF0IGEgQyBzaWduZWQgY2hhcltdIGFycmF5IGlzIG1hcHBlZCB0byBieXRlW10uCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDEvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHJldHVybi1ieS12YWx1ZSwgQysrLCBhbmQKICAgICAgICAgICBvYmplY3RzIHRoYXQgZGVmaW5lIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9lbCBSZWVkLgoKMDEvMjUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE92ZXJoYXVsIG9mIHRoZSBKYXZhIG1vZHVsZS4gVGhlIEMgY29kZSBnZW5lcmF0aW9uIGlzIG5vdyAKICAgICAgICAgICBkb25lIGZyb20gdHlwZW1hcHMuCgowMS8yNC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gU3VwcG9ydCBmb3IgYXJyYXlzIG9mIGVudW0gcG9pbnRlcnMKCjAxLzIwLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBFcnJvciBjaGVja2luZyBmb3IgbnVsbCBKYXZhIG9iamVjdHMgYmVpbmcgcGFzc2VkIHRvIG5hdGl2ZSAKICAgICAgICAgICBmdW5jdGlvbnMuICBFeGNlcHRpb24gdGhyb3duIG5vdyB3aGVyZWFzIGJlZm9yZSB0aGUgSlZNIGNyYXNoZWQuCgowMS8xOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ29ycmVjdGVkIGJlaGF2aW91ciBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhcnJheXMuIEZvciAKICAgICAgICAgICBleGFtcGxlLCB3aGVuIHRoaXMgYyBmdW5jdGlvbjogCgogICAgICAgICAgIHZvaWQgYXJyYXlmbihpbnQgYXJyYXlbXSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaXMgd3JhcHBlZCB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgZnVuY3Rpb24KCiAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWZuKGludFtdIGFycmF5KTsKCiAgICAgICAgICAgaXMgcHJvZHVjZWQuIFByZXZpb3VzbHkgaWYgdGhlIEMgZnVuY3Rpb24gbWFkZSBhbnkgY2hhbmdlcyB0byB0aGUgCiAgICAgICAgICAgYXJyYXkgZWxlbWVudHMsIHRoZXNlIHdlcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gdGhlIEphdmEgYXJyYXkuIAogICAgICAgICAgIFRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBwcm9wb2dhdGVkIGJhY2sKICAgICAgICAgICB0byBKYXZhIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aWxsIHNlZSB0aGVzZSBjaGFuZ2VzLiBUaGlzIGlzIAogICAgICAgICAgIGhvdyBwdXJlIEphdmEgZnVuY3Rpb25zIHdvcmssIGllIGFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KCjAxLzE1LzIwMDI6bWtvZXBwZQogICAgICAgICAgIFtHdWlsZV0gTmV3IGZpbGUgY3BsdXNwbHVzLmkgd2l0aCBDKysgdHlwZW1hcHMgY29udHJpYnV0ZWQKICAgICAgICAgICBieSBNYXJjaW8gTHVpcyBUZWl4ZWlyYSA8bWFyY2lvdEBob2xseS5jb2xvc3RhdGUuZWR1Pi4KCjAxLzExLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDaGFuZ2VkIG1hcHBpbmcgb2YgQyBsb25nIHRvIEphdmEgdHlwZS4gV2FzIG1hcHBlZCB0byBKYXZhCiAgICAgICAgICAgbG9uZywgbm93IG1hcHBlZCB0byBKYXZhIGludC4gSWYgeW91IHdhbnQgdGhlIHByZXZpb3VzIG1hcHBpbmcgdG8gCiAgICAgICAgICAgSmF2YSBsb25nIHVzZSB0aGlzIGFwcHJvYWNoIGluIHlvdXIgaW50ZXJmYWNlIGZpbGU6CiAgICAgICAgICAgCiAgICAgICAgICAgICAlY2xlYXIgbG9uZzsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZyAgICAgICAgICAgICAiamxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZyAgICAgICAgICAgImxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmcgICAgICAgICAgImxvbmciCgogICAgICAgICAgICAgJWNsZWFyIGxvbmdbQU5ZXTsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZ1tBTlldICAgICAgICAiamxvbmdBcnJheSIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nW0FOWV0gICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nW0FOWV0gICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChpbikgbG9uZ1tBTlldICAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBsb25nW0FOWV0gICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgbG9uZ1tBTlldICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBsb25nW0FOWV0gICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgVGhpcyBuZXcgbWFwcGluZyBpcyBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gaW50ZXJmYWNpbmcgdG8gMzIgYml0IAogICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudCAzMi1iaXQgSlZNcy4gRm9yIGZ1dHVyZSAKICAgICAgICAgICA2NC1iaXQgSlZNcyB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZXNlIG1hcHBpbmdzIC0gZWcgb24gVW5peCBMUDY0IAogICAgICAgICAgIHN5c3RlbXMsIGJ1dCBub3Qgb24gTWljcm9zb2Z0IDY0Yml0IFdpbmRvd3Mgd2hpY2ggd2lsbCBiZSB1c2luZyBhIAogICAgICAgICAgIFA2NCBJTDMyIG1vZGVsLiBUaGlzIG1heSBiZSBhdXRvbWF0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTV0lHLgoKMDEvMTAvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyA1MDE2NzcgXSAlaW5pdCBibG9jayBpbiB3cm9uZyBwbGFjZS4gUmVwb3J0ZWQKICAgICAgICAgICBieSBMdWlnaSBCYWxsYWJpby4KCjAxLzA5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHN1cHBvcnQgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gc2lnbmVkIGxvbmcgbG9uZyBpcyAKICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGxvbmcuIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBtYXBwZWQgdG8gQmlnSW50ZWdlci4KCjAxLzA5LzIwMDI6YmVhemxleQogICAgICAgICAgIEV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gcGFyc2VyIHRvIGJldHRlciBzdXBwb3J0IG1peGluZyBvZgogICAgICAgICAgIGludCwgbG9uZywgc2hvcnQsIHVuc2lnbmVkLCBmbG9hdCwgYW5kIGRvdWJsZS4gICBUaGUgcGFyc2VyCiAgICAgICAgICAgc2hvdWxkIG5vdyBzdXBwb3J0IHR5cGVzIGxpa2UgdGhpczoKICAgIAogICAgICAgICAgICAgICAgc2hvcnQgdW5zaWduZWQgaW50CiAgICAgICAgICAgICAgICBpbnQgICB1bnNpZ25lZCBzaG9ydAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hvcnQKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5hYmxlcyBhIHR5cGUgb2YgJ2xvbmcgZG91YmxlJyAocHJldmlvdXNseQogICAgICAgICAgICB1bnN1cHBvcnRlZCkgdG8gYmUgdXNlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENhc3RpbmcgZml4IGZvciB3aGVuIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcG9pbnRlciBhcyAKICAgICAgICAgICByZXBvcnRlZCBieSBHYXJ5IFBlbm5pbmd0b24gMjAwMi0wMS0wNS4gVGhlIHVwcGVyIDMyYml0cyBvZiB0aGUgCiAgICAgICAgICAgNjQgYml0IGpsb25nIHdpbGwgaGF2ZSBjb250YWluZWQganVuayBmb3IgMzJiaXQgcG9pbnRlcnMuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBpcyBwb3NzaWJsZSBhcyB0aGUgCiAgICAgICAgICAgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkZGVkIGludG8gdHlwZW1hcHMuaS4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSAkbnVsbCBjYW4gYmUgdXNlZCBpbiBpbnB1dCB0eXBlbWFwcyB0byByZXR1cm4gZWFybHkgZnJvbSBKTkkgCiAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBlaXRoZXIgdm9pZCBvciBhIG5vbi12b2lkIHJldHVybiB0eXBlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrKSBpbnQgKiAleyAKICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgJX0KCiAgICAgICAgICAgSWYgdGhlIHR5cGVtYXAgZ2V0cyBwdXQgaW50byBhIGZ1bmN0aW9uIHdpdGggdm9pZCBhcyByZXR1cm4sICRudWxsIAogICAgICAgICAgIHdpbGwgZXhwYW5kIHRvIG5vdGhpbmc6CgogICAgICAgICAgICAgdm9pZCBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgogICAgICAgICAgIG90aGVyd2lzZSAkbnVsbCBleHBhbmRzIHRvIHplcm8sIHdoZXJlIGphdmFyZXR1cm50eXBlIGlzIGVpdGhlciBhIAogICAgICAgICAgIHBvaW50ZXIgb3IgYSBwcmltaXRpdmUgdHlwZToKCiAgICAgICAgICAgICBqYXZhcmV0dXJudHlwZSBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKMDEvMDIvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFRoZSBKYXZhIG1vZHVsZSBpbmNvcnJlY3RseSB1c2VkIGFyZ291dCB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgc3RyaW5ncy4gVGhpcyBpcyBub3cgY29ycmVjdGVkIGFuZCB0aGUgY29kZSBub3cgcmVzaWRlcwogICAgICAgICAgIGluIHRoZSBmcmVlYXJnIHR5cGVtYXAuIFRoZSBhcmdvdXQgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIHNwbGl0IGludG8gCiAgICAgICAgICAgYXJnb3V0IGFuZCBmcmVlYXJnIHR5cGVtYXBzLiBUaGlzIGNvcnJlY3Rpb24gbWF5IHJlcXVpcmUgc29tZSB1c2VyIAogICAgICAgICAgIHdyaXR0ZW4gdHlwZW1hcHMgdG8gYmUgbW9kaWZpZWQuIAogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE11bHRpIHR5cGVtYXBzIG5vdyB3b3JraW5nIGZvciBKYXZhIHNlZSBtdWx0aW1hcCBleGFtcGxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIC0gZnJlZWFyZyB0eXBlbWFwIGNvZGUgd2FzIGFwcGVhcmluZwogICAgICAgICAgIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4KCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBKQ0FMTCBtYWNybyBmb3IgSk5JIGNhbGxzIHRoYXQgd29yayBpbiBib3RoIEMgYW5kIEMrKyB0eXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIEpDQUxMMCwgSkNBTEwxLCBKQ0FMTDIsIEpDQUxMMyBhbmQgSkNBTEw0IAogICAgICAgICAgIG1hY3Jvcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJlc29sdmVkIHNvbWUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggJXJlbmFtZSBhbmQgY2xhc3MgcmVuYW1pbmcuCiAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgIEJhcjsKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlbiB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgYXBwbGllcyB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsCiAgICAgICAgICAgYW5kIHRoZSBkZXN0cnVjdG9yIChhbGwgd2lsbCBiZSByZW5hbWVkIHRvIEZvbykuCgogICAgICAgICAgIElmIGEgY2xhc3MgZGVmaW5lcyBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yLCB0aGUgb3ZlcmxvYWRlZCB2YXJpYW50cwogICAgICAgICAgIGNhbiBzdGlsbCBiZSByZW5hbWVkIGJ5IHNwZWNpZnlpbmcgcGFyYW1ldGVycyB0byAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlcmVuYW1lKEJhcl9jb3B5KSBCYXIoQmFyICYpOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgICBCYXIoQmFyICYpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgb2RkIGNvcm5lciBjYXNlcy4gIElmIHlvdSBzcGVjaWZ5CgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgOjpCYXI7CgogICAgICAgICAgIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgY2hhbmdlZCBhbmQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKICAgICAgICAgICBuYW1lcyBhcmUgbGVmdCB1bm1vZGlmaWVkLiAgSWYgeW91IHNwZWNpZnkgCgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgKjo6QmFyOwoKICAgICAgICAgICB0aGVuIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGJ1dAogICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QuCgoxMi8yMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gam5pLCBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzIG5vIGxvbmdlciBoYXJkY29kZWQgYnV0IHJlYWwgCiAgICAgICAgICAgdHlwZW1hcHMuIE5ldyB2YXJpYWJsZSBzdWJzdGl0dXRpb24sICRqYXZhY2xhc3NuYW1lLCBjYW4gYmUgdXNlZCBpbgogICAgICAgICAgIHRoZSBqc3R5cGUgdHlwZW1hcHMuIEl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIEphdmEgc2hhZG93IGNsYXNzIG5hbWUKICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIHRvIGRvIHdpdGggaW5oZXJpdGFuY2Ugd2hlbiAKICAgICAgICAgICB1c2luZyAlaW1wb3J0LgogICAgICAgICAgIFtKYXZhXSBBIGZldyBtb3JlIGJ1ZyBmaXhlcywgdG9kbyB3aXRoICVyZW5hbWUgYW5kIHVzaW5nIHRoZSBraW5kCiAgICAgICAgICAgd2l0aCB0aGUgdHlwZSwgZWcgCiAgICAgICAgICAgdm9pZCBmbih1bmlvbiB1bmkgbXl1bmksIHN0cnVjdCBzdHIgbXlzdHIsIGNsYXNzIGNsIG15Y2wpOwoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDk0NTI0IF0gUHJlcHJvY2Vzc29yIGJ1ZyAtIGFwb3N0cm9waGUgYW5kICNzdWJzdC4KCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIFNXSUdfVkVSU0lPTiBwcmVwcm9jZXNzb3Igc3ltYm9sLiAgIFRoaXMgaXMgYSBoZXhhZGVjaW1hbAogICAgICAgICAgIGludGVnZXIgc3VjaCBhcyAweDAxMDMxMSAoY29ycmVzcG9uZGluZyB0byBTV0lHLTEuMy4xMSkuICBUaGlzIGNhbgogICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGludGVyZmFjZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgI2lmIFNXSUdfVkVSU0lPTiA+PSAweDAxMDMxMQogICAgICAgICAgICAgICAvKiBVc2Ugc29tZSBmYW5jeSBuZXcgZmVhdHVyZSAqLwogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgTm90ZTogVGhlIHZlcnNpb24gc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgU1dJRwogICAgICAgICAgIHdyYXBwZXIgZmlsZS4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTIvMjAvMjAwMTpta29lcHBlCgkgICBbTXpTY2hlbWVdOiBSZW5hbWVkIG16c3dpZ19tYWtlX2Jvb2xlYW4gdG8KCSAgIHN3aWdfbWFrZV9ib29sZWFuLCBhcyB0aGUgbGF0dGVyIGlzIHVzZWQgaW4gdGhlIHR5cGVtYXBzLgoJICAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoxMi8xNy8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IFJld3JvdGUgbGlzdC12ZWN0b3IuaSB1c2luZyBtdWx0aS1kaXNwYXRjaAoJICAgdHlwZW1hcHMuICBVcGRhdGVkIHBvaW50ZXItaW4tb3V0LmkuICBNYWtlIHRoZQoJICAgZGVwcmVjYXRlZCB0eXBlbWFwLXN1YnN0aXR1dGlvbiBvZiAiJHNvdXJjZSIgaW4gImFyZ291dCIKCSAgIHdvcmsgYXMgYmVmb3JlLgoKMTIvMTYvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCBtYWNyb3MgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICVtdWx0aXBsZV92YWx1ZXMgdG8gdXNlIHRoZSBwcm9wZXIgJXByYWdtYSBzeW50YXguICBOZXcKCSAgIEd1aWxlIGV4YW1wbGUvdGVzdCAibXVsdGl2YWx1ZSI7IG5ldyBHdWlsZSBydW4tdGVzdCBmb3IKCSAgIHRlc3Qtc3VpdGUgaXRlbSAibGlzdC12ZWN0b3IiIChjdXJyZW50bHkgYnJva2VuKS4KCjEyLzE0LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgdHlwZW1hcC1zdWJzdGl0aW9uIGJ1ZyBmb3IgInZhcmluIi4gIFJlbGF4ZWQKCSAgIHZhbGlkLWlkZW50aWZpZXIgY2hlY2sgdG8gYWxsb3cgYWxsIFI1UlMgaWRlbnRpZmllcnMuCgoKVmVyc2lvbiAxLjMuMTAgKERlY2VtYmVyIDEwLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCAldHlwZW1hcCBzbyB0aGF0ICV7IC4uLiAlfSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEKICAgICAgICAgICBjb2RlIGJsb2NrIChtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcykuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICV7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhpcyBmb3JtIGRvZXMgbm90IGludHJvZHVjZSBhIG5ldyBibG9jayBzY29wZS4gIEFsc28sIHRoZQogICAgICAgICAgIGNvZGUgZW5jbG9zZWQgaW4gJXsgLi4uICV9IGlzIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ1OTYxNCBdIFNXSUcgd2l0aCBtdWx0aXBsZSBUQ0wgaW50ZXJwcmV0ZXJzLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDE3MTQxIF0gcnVieWRlYy5zd2cgaXMgd3JvbmcKICAgICAgICAgICBSZXBvcnRlZCBieSBQYXVsIEJyYW5uYW4uCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTA1NTcgXSBQcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgb24gTlQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFnbnVzIExqdW5nLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDQ1MjMzIF0gRW5oYW5jZW1lbnQ6IGhhbmRsZSBhY2Nlc3MgY2hhbmdlLgogICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyAoYnV0IGlnbm9yZXMpIEMrKyBhY2Nlc3MgY2hhbmdlcyBmb3IgdGhlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKCkgeyB9CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBBKCkge30KICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgY2xhc3MgQiA6IHByaXZhdGUgQSB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICBBOjpzb21ldGhpbmc7ICAgIDwtLS0tIFBhcnNlZCwgYnV0IGlnbm9yZWQKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjEyLzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIEZpeCBmb3IgUnVieSB0byB3b3JrIHVzaW5nIFZpc3VhbCBDKysuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NjU2ODcgXSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJzIGZhaWwuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDg5NTk0IF0gUHlTdHJpbmdfRnJvbVN0cmluZyBjYW4ndCB0YWtlIE5VTEwgYXJnLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvaG4gTWVycml0dC4gICBTV0lHIG5vdyBjb252ZXJ0cyBzdHJpbmcgdmFsdWVzCiAgICAgICAgICAgdG8gUHl0aG9uIHVzaW5nIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICByZXN1bHRvYmogPSByZXN1bHQgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ2MzU2MSBdIFR5cGUgY29udmVyc2lvbnMgbm90IGdlbmVyYXRlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgkKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcwMjE3IF0gVGNsIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzIwODggXSBkZWZpbmVkKE1BQ1JPKSBleHBhbmRlZCBldmVyeXdoZXJlLgogICAgICAgICAgIEVtYmVkZGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgJSNpZiBkZWZpbmVkKEZPTykKCiAgICAgICAgICAgYXJlIG5vdCBleHBhbmRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc2NDY3IF0gUHJvYmxlbXMgd2l0aCAjZGVmaW5lICYgY29tbWFzLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc3NTQ3IF0gd3JvbmcgZGVjbGFyYXRpb24gb2YgcG9pbnRlciBmdW5jdGlvbnMuCiAgICAgICAgICAgQmFkIHByb3RvdHlwZXMgaW4gTGliL3RjbC9wdHJsYW5nLmkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODMxODIgXSBDb25zdGFudHMgY2FuIHRha2UgYXJncyBieSBtaXN0YWtlLiAKICAgICAgICAgICBXaGVuIHN3aWcgLXBlcmw1IC1jb25zdCBpcyB1c2VkLCBjb25zdGFudHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICAgd2l0aCBhIHZvaWQgcHJvdG90eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3ViIElDT05TVCAoKSB7ICRleGFtcGxlYzo6SUNPTlNUIH0KCiAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IFJpY2ggV2FsZXMuCgoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBOZXcgJWV4Y2VwdGlvbiBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byByZXBsYWNlICVleGNlcHQuCiAgICAgICAgICAgSXQgd29ya3MgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCBhIAogICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgY2F0Y2goU29tZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAlZXhjZXB0aW9uIGlzIGFsc28gbmFtZSBhd2FyZS0tLWFsbG93aW5nIGl0IHRvIGJlIGFwcGxpZWQgdG8KICAgICAgICAgICBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgYW55IGZ1bmN0aW9uL21ldGhvZCBmb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhciBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhcihkb3VibGUpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhcihkb3VibGUpIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBuYW1lIG1hdGNoaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJzdGFudGlhbCBjbGVhbnVwIG9mIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUuICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIHVzZWQgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIHJhdGhlciBjb21wbGljYXRlZCBtYW5uZXIgaW52b2x2aW5nIGFib3V0CiAgICAgICAgICAgYSBoYWxmLWRvemVuIHN0cmluZ3MgY3JlYXRlZCBpbiBiaXRzIGFuZCBwaWVjZXMuICAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZCBpbiBhIG1vcmUgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci0taW4gdGhlIHNhbWUKICAgICAgICAgICBvcmRlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgc2hhZG93IGZpbGUgbWF5IGRpZmZlci4KICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVpbnNlcnQgZGlyZWN0aXZlICgleyAuLi4gJX0sICVydW50aW1lLCAlaGVhZGVyLCAld3JhcHBlciwgZXRjLikKICAgICAgICAgICBjYW4gbm93IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBUaGlzIGhhcyBwb3RlbnRpYWwKICAgICAgICAgICB1c2VzIHdoZW4gZ2VuZXJhdGluZyBzaGFkb3cgY2xhc3MgY29kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlaW5zZXJ0KCJzaGFkb3ciKSAlewogICAgICAgICAgICAgICAgICMgU29tZSBweXRob24gY29kZQogICAgICAgICAgICAgICAgIGRlZiBibGFoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkknbSBibGFoISIKICAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgY2xhc3MgY29kZSBpbnNlcnRpb24gZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2UgbW9kdWxlLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBpbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGV4dGVuZGluZwogICAgICAgICAgIHNoYWRvdyBjbGFzcyBjb2RlLiAgIEluIHRoZSBQeXRob24gbW9kdWxlLCB0aGlzIGluc2VydHMgY29kZSB3aXRoIHRoZQogICAgICAgICAgIHByb3BlciBsZXZlbCBvZiBpbmRlbmRhdGlvbiAocmVnYXJkbGVzcyBvZiB3aGF0IHdhcyB1c2VkIGluIHRoZSBTV0lHCiAgICAgICAgICAgaW50ZXJmYWNlKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBKYXZhIGFuZCBQeXRob24gbW9kdWxlcyB0byB3b3JrIG9uIGN5Z3dpbi4KICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIHRoZSBweXRob24gbW9kdWxlIGhhcyBzdGFydGVkIHRvIHByb2R1Y2VzIGNvZGUgCiAgICAgICAgICAgd2hpY2ggY2Fubm90IGJlIGF1dG8taW1wb3J0ZWQgdXNpbmcgY3lnd2luIGxpYnRvb2xzIHNvIG1vc3Qgb2YgaXQgaXMgCiAgICAgICAgICAgc3RpbGwgYnJva2VuLgoKMTEvMjgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVyZW5hbWUgYW5kICVmZWF0dXJlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlICVyZW5hbWUgZGlyZWN0aXZlIG9ubHkgYXBwbGllcwogICAgICAgICAgIHRvIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGFwcGVhcnMgYXMgd2VsbCBhcyBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMuICBJbiBmYWN0LCB0aGlzIGlzIHJlYWxseSBqdXN0IHRoZSBzYW1lCiAgICAgICAgICAgYXMgc2F5aW5nOgoKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIEZvbzo6Zm9vKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBGb286OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgdGhlIGV4cGVyaW1lbnRhbCAlZmVhdHVyZSBkaXJlY3RpdmUuICAlZmVhdHVyZSBjYW4gYmUKICAgICAgICAgICB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gcGFyc2UgdHJlZSBub2Rlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBibGFoIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXI7ICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNldCIpICo6Onhfc2V0ICJ4IjsKCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImJsYWgiKSBGb286OmJhcihpbnQsZG91YmxlKSBjb25zdCAic3BhbSI7CgogICAgICAgICAgIFRoZSBzeW50YXggaXMgYm9ycm93ZWQgZnJvbSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuICBJbiBmYWN0LCB0aGUKICAgICAgICAgICBleGFjdCBzYW1lIHNlbWFudGljcyBhcHBseSAoaW5oZXJpdGFuY2UsIG1hdGNoaW5nLCBldGMuKS4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgYSB2ZXJ5IHBvd2VyZnVsIGxvdy1sZXZlbCBwcmltaXRpdmUgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgIGN1c3RvbWl6ZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgYW5kIHRvIHByb3ZpZGUgaGludHMgdG8gCiAgICAgICAgICAgYW55IHN0YWdlIG9mIGNvZGUgZ2VuZXJhdGlvbi4gICBGZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8KICAgICAgICAgICBwYXJzZSB0cmVlIG5vZGVzIGFzIGF0dHJpYnV0ZXMgd2l0aCBuYW1lcyBsaWtlICJmZWF0dXJlOioiIHdoZXJlICogCiAgICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGZlYXR1cmUgbmFtZSAoZS5nLiwgImZlYXR1cmU6ZXhjZXB0IiwgImZlYXR1cmU6c2V0IiwgCiAgICAgICAgICAgZXRjLikuICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGhlbiBsb29rIGZvciB0aGUgZmVhdHVyZXMgdXNpbmcgCiAgICAgICAgICAgYSBzaW1wbGUgYXR0cmlidXRlIGxvb2t1cC4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgYSBudW1iZXIgb2YKICAgICAgICAgICBvbGRlciBTV0lHIGRpcmVjdGl2ZXMgaW5jbHVkaW5nICVleGNlcHQgYW5kIHNwZWNpYWxpemVkCiAgICAgICAgICAgcHJhZ21hcy4gSXQgaXMgbW9yZSBwb3dlcmZ1bCAoZHVlIHRvIGl0cyBwYXJhbWV0ZXJpemVkCiAgICAgICAgICAgbmFtZSBtYXRjaGluZykgYW5kIGl0IHByb3ZpZGVzIHZlcnkgcHJlY2lzZSBjb250cm9sIG92ZXIKICAgICAgICAgICBob3cgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8gaW5kaXZpZHVhbAogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICBUaGVyZSBhcmUgZnV0dXJlIGV4cGFuc2lvbiBwbGFucyB0aGF0IHdpbGwKICAgICAgICAgICBidWlsZCB1cG9uIHRoaXMgY2FwYWJpbGl0eSBhcyB3ZWxsLgoKICAgICAgICAgICBJdCdzIG5vdCBjZXJ0YWluIHRoYXQgJWZlYXR1cmUgd2lsbCBldmVyIGJlIHVzZWQgZGlyZWN0bHkKICAgICAgICAgICBieSBTV0lHIHVzZXJzLiAgSW5zdGVhZCwgaXQgbWF5IGJlIGEgbG93LWxldmVsIHByaW1pdGl2ZQogICAgICAgICAgIHRoYXQgaXMgdXNlZCBpbiBoaWdoLWxldmVsIG1hY3JvIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgIHRvIHN1cHBvcnQgcHJvcGVydGllcywgeW91IG1pZ2h0IGRlZmluZSBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgJWRlZmluZSAlcHJvcGVydHkobmFtZSwgc2V0ZiwgZ2V0ZikKICAgICAgICAgICAlZmVhdHVyZSgic2V0Iikgc2V0ZiAjbmFtZTsKICAgICAgICAgICAlZmVhdHVyZSgiZ2V0IikgZ2V0ZiAjbmFtZTsKICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFdoaWNoIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAlcHJvcGVydHkocCwgZ2V0X3AsIHNldF9wKTsKCiAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgIGludCAgZ2V0X3AoKTsKICAgICAgICAgICAgICB2b2lkIHNldF9wKGludCk7CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAKMTEvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFRjbCBtb2R1bGUgaGFzIGJlZW4gZXhwYW5kZWQgd2l0aCBzb21lIG5ldyBmZWF0dXJlcyBmb3IKICAgICAgICAgICBtYW5hZ2luZyBvYmplY3Qgb3duZXJzaGlwLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0IGMgW0NpcmNsZSAtYXJncyAyMF0KICAgICAgICAgICAgICAgICRjIGFyZWEgICAgICAgICAgICAgIyBJbnZva2UgYSBtZXRob2QKICAgICAgICAgICAgICAgICRjIC1kaXNvd24gICAgICAgICAgIyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAogICAgICAgICAgICAgICAgJGMgLWFjcXVpcmUgICAgICAgICAjIEFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CgogICAgICAgICAgIElmIFRjbCBvd25zIHRoZSBvYmplY3QsIGl0cyBkZXN0cnVjdG9yIGlzIGludm9rZWQgd2hlbiB0aGUgCiAgICAgICAgICAgY29ycmVzcG9uZGluZyBvYmplY3QgY29tbWFuZCBpcyBkZWxldGVkIGluIFRjbC4gIAoKICAgICAgICAgICBUbyBzaW1wbGlmeSB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cywgdGhlIGZvbGxvd2luZyBzeW50YXgKICAgICAgICAgICBjYW4gYmUgdXNlZDoKCiAgICAgICAgICAgICAgICAkYyAtZGVsZXRlICAgICAgICAgIyBEZWxldGUgYW4gb2JqZWN0CgogICAgICAgICAgIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBtb3JlIG9ic2N1cmUgdmFyaWFudCBvZiAKCiAgICAgICAgICAgICAgICByZW5hbWUgJGMge30KCiAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYWxzbyBhZGQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgQyBBUEkgbGV2ZWwuCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIG93bmVyc2hpcCBmcm9tIEMgYW5kCiAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICAgICAgU1dJR19BY3F1aXJlKHZvaWQgKnB0cik7CiAgICAgICAgICAgICAgICBTV0lHX0Rpc293bih2b2lkICpwdHIpOwoKICAgICAgICAgICBBIG5ldyBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGluc3RhbmNlcyBpcyBhbHNvIGF2YWlsYWJsZToKCiAgICAgICAgICAgICAgICBUY2xfT2JqICoKICAgICAgICAgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmooVGNsX0ludGVycCAqaW50ZXJwLCB2b2lkICpwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlLCBpbnQgb3duKTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIGEgdHlwZW1hcCwgdGhpcyBjcmVhdGVzIGEgcG9pbnRlciBvYmplY3QgYW5kCiAgICAgICAgICAgYW4gaW50ZXJwcmV0ZXIgY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIG1ldGhvZHMgYW5kCiAgICAgICAgICAgYWNjZXNzIGF0dHJpYnV0ZXMgYXMgc2hvd24gYWJvdmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBbGwgUHl0aG9uLXJlbGF0ZWQgJXByYWdtYSBvcGVyYXRpb25zIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgIE1vc3Qgb2YgdGhlc2Ugd2VyZSB3cml0dGVuIGZvciBvbGRlciBTV0lHIHZlcnNpb25zIGluIG9yZGVyIHRvCiAgICAgICAgICAgY29tcGVuc2F0ZSBmb3IgbGltaXRhdGlvbnMgaW4gZWFybGllciByZWxlYXNlcy4gIEluIGFuIGVmZm9ydAogICAgICAgICAgIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUtY2x1dHRlciBhbmQgcG90ZW50aWFsIGZvciBlcnJvcnMsCiAgICAgICAgICAgaXQgaXMgZWFzaWVyIHRvIHNpbXBseSBlbGltaW5hdGUgdGhlIHByYWdtYXMgYW5kIHRvIHN0YXJ0IG92ZXIKICAgICAgICAgICAoaWYgbmVlZGVkKS4gIFRvIGJlIGhvbmVzdCwgSSdtIG5vdCBldmVuIHN1cmUgdGhlIHByYWdtYXMKICAgICAgICAgICB3b3JrZWQgaW4gMS4zLjkgYW5kIHJlY2VudCByZWxlYXNlcy4KCiAgICAgICAgICAgTm90ZTogSWYgeW91IG5lZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgc2hhZG93IGNsYXNzIGZpbGUKICAgICAgICAgICBjcmVhdGVkIGJ5IFNXSUcsIHNpbXBseSB1c2UgdGhlICVzaGFkb3cgZGlyZWN0aXZlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXNoYWRvdyAlewogICAgICAgICAgICAgIGRlZiBzb21lX3B5dGhvbl9jb2RlKCk6ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIHByaW50ICJibGFoISIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFN3ZWVwaW5nIGNoYW5nZXMgdG8gdGhlIHdheSBpbiB3aGljaCB0aGUgUHl0aG9uIG1vZHVsZSBoYW5kbGVzCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMuICAgSW4gZWFybHkgaW1wbGVtZW50YXRpb25zLCBzaGFkb3cgY2xhc3NlcyB3ZXJlCiAgICAgICAgICAgbWVyZWx5IFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdHlwZWQgcG9pbnRlciBvYmplY3RzLiBIb3dldmVyLCAKICAgICAgICAgICBzb21lIHVzZXJzIGFjdHVhbGx5IHdhbnRlZCB0byByZWNlaXZlIHRoZSBzaGFkb3cgY2xhc3Mgb2JqZWN0IGluIEMuCiAgICAgICAgICAgVG8gYWNjb21tb2RhdGUgdGhpcywgdGhlIGRlcmVmZXJlbmNpbmcgb2YgdGhlICJ0aGlzIiBwb2ludGVyIGluCiAgICAgICAgICAgYSBzaGFkb3cgY2xhc3Mgd2FzIG1vdmVkIHRvIEMgYXMgZGVzY3JpYmVkIGluIENIQU5HRVMgWzgvOC85OV0uCiAgICAgICAgICAgSG93ZXZlciwgdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIFB5dGhvbiB3YXMgc3RpbGwKICAgICAgICAgICBzb21ld2hhdCBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwgc2hhZG93IGNsYXNzZXMgbmV2ZXIgd29ya2VkCiAgICAgICAgICAgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHRoZXNlOgoKICAgICAgICAgICAgIC0gICBVc2Ugb2YgYW55IGtpbmQgb2Ygb3V0cHV0IHR5cGVtYXAgKCdvdXQnIG9yICdhcmdvdXQnKQogICAgICAgICAgICAgLSAgIEdsb2JhbCB2YXJpYWJsZXMgKGJyb2tlbiBhcyBmYXIgYXMgSSBjYW4gdGVsbCkuCgogICAgICAgICAgIEluIHRoZSBwYXN0LCBzb21lIHVzZXJzIGhhdmUgZGVhbHQgd2l0aCB0aGlzIGJ5IG1hbnVhbGx5IHRyeWluZwogICAgICAgICAgIHRvIGNyZWF0ZSBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0aGVtc2VsdmVzIGZyb20gQy9DKysuICBIb3dldmVyLAogICAgICAgICAgIHRoaXMgd2FzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBDIHdyYXBwZXJzIGRvbid0IHJlYWxseSBrbm93IGhvdwogICAgICAgICAgIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNsYXNzLgoKICAgICAgICAgICBUaGUgUHl0aG9uIG1vZHVsZSBoYXMgbm93IGJlZW4gbW9kaWZpZWQgdG8gYXV0b21hdGljYWxseSBhdHRhY2gKICAgICAgICAgICBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0byBwb2ludGVycyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIHRvIAogICAgICAgICAgIFB5dGhvbi4gICBUaGlzIHByb2Nlc3Mgb2NjdXJzIGluIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmooKQogICAgICAgICAgIHNvIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdXNlcnMuICAgIEFzIGEgcmVzdWx0LAogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIGFyZSBub3cgbW9yZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgd2l0aCB0eXBlbWFwcwogICAgICAgICAgIGFuZCBvdGhlciBmZWF0dXJlcyBvZiBTV0lHLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiAgVGhlCiAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKCkgbm93IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciAib3duIiB0byAKICAgICAgICAgICBpbmRpY2F0ZSBvYmplY3Qgb3duZXJzaGlwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgcG9pbnRlcgogICAgICAgICAgIHRvIFB5dGhvbiB0aGF0IFB5dGhvbiBzaG91bGQgZGVzdHJveS4gICBJbiBhZGRpdGlvbiwgb2xkZXIgY29kZQogICAgICAgICAgIHRoYXQgdHJpZXMgdG8gbWFudWFsbHkgY29uc3RydWN0IHNoYWRvdyBjbGFzcyBvYmplY3RzIG9yIHdoaWNoCiAgICAgICAgICAgZXhwZWN0cyBiYXJlIHBvaW50ZXJzIG1heSBicmVhay0tLXN1Y2ggcG9pbnRlcnMgbWF5IGFscmVhZHkgYmUKICAgICAgICAgICBlbmNhcHN1bGF0ZWQgYnkgYSBzaGFkb3cgY2xhc3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWluc2VydCBkaXJlY3RpdmUgdG8gYWNjZXB0IHNpbmdsZSBicmFjZXMgeyAuLi4gfS4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5zZXJ0KCJoZWFkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAleyAuLi4gJX0gZXhjZXB0IHRoYXQgdGhlIGNvZGUgaW4gdGhlCiAgICAgICAgICAgYnJhY2VzIGlzIHByb2Nlc3NlZCB1c2luZyB0aGUgcHJlcHJvY2Vzc29yLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bAogICAgICAgICAgIGluIGNlcnRhaW4gY29udGV4dHMgc3VjaCBhcyBsb3ctbGV2ZWwgY29kZSBnZW5lcmF0aW9uIGluIAogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93IHRyYW5zbGF0ZWQgaW50byBwcmVwcm9jZXNzb3IKICAgICAgICAgICBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CgkKICAgICAgICAgICAgICAuL3N3aWcgLXB5dGhvbiAtc2hhZG93IC1tb2R1bGUgYmxhaCBpbnRlcmZhY2UuaQoKICAgICAgICAgICBDcmVhdGVzIHRoZSBzeW1ib2xzOgoKICAgICAgICAgICAgICBTV0lHT1BUX1BZVEhPTiAxCiAgICAgICAgICAgICAgU1dJR09QVF9TSEFET1cgMQogICAgICAgICAgICAgIFNXSUdPUFRfTU9EVUxFIGJsYWgKICAgICAgICAgICAgICAKICAgICAgICAgICBNb2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGlmIG5lZWRlZC4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgUGVybDUgbW9kdWxlLiAgQSBsb3Qgb2YgY29kZSBnZW5lcmF0aW9uIGlzCiAgICAgICAgICAgbm93IGRyaXZlbiBieSB0YWJsZXMgYW5kIHR5cGVtYXBzLiAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIAogICAgICAgICAgIGFsc28gbWFrZXMgdXNlIG9mIHRhYmxlcyB0byBpbnN0YWxsIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQKICAgICAgICAgICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBpbmxpbmluZyBhIGJ1bmNoIG9mIHByb2NlZHVyZSBjYWxscy4gIFRoZQogICAgICAgICAgIHNlcGFyYXRlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGdvbmUuICAgTW9zdAogICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBpcyBjb250cm9sbGVkIHZpYSB0aGUgcGVybDUuc3dnIGZpbGUgaW4gdGhlCiAgICAgICAgICAgbGlicmFyeS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAKMTEvMTMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgQysrIHR5cGVuYW1lIGtleXdvcmQuICBQcmltYXJpbHkgdGhpcwogICAgICAgICAgIGlzIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgIGJsYWgoQyYgdikgewogICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCk7CiAgICAgICAgICAgICB9CgogICAgICAgICAgIE5vdGU6IHR5cGVuYW1lIGlzIHN1cHBvcnRlZCBpbiB0aGUgcGFyc2VyIGluIHRoZSBzYW1lIHdheSBhcyAnc3RydWN0JwogICAgICAgICAgIG9yICdjbGFzcycuICBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHVzZSBpdCBhbnl3aGVyZSBleGNlcHQgaW4gdGVtcGxhdGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZSBBUEkuICAgTW9zdCBmdW5jdGlvbnMgbm93CiAgICAgICAgICAgdXNlIGEgY29tbW9uLCB2ZXJ5IHNpbXBsZSwgIEFQSS4gICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZgogICAgICAgICAgIGludGVyZXN0aW5nIHNlbWFudGljIHNpZGUtZWZmZWN0cyBvZiBob3cgY29kZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQuCiAgICAgICAgICAgRGV0YWlscyB3aWxsIGJlIGZvcnRoY29taW5nIGluIERvYy9NYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiBMYW5ndWFnZSBtb2R1bGVzIHdyaXR0ZW4gZm9yCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyB3aWxsIG5vIGxvbmdlciB3b3JrLAoKMTEvMTAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSB2ZXJ5IHN1YnRsZSBidWcgZHVlIHRvIHVubmFtZWQgY2xhc3Mgd3JhcHBpbmcuIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgIHlvdSBkaWQgdGhpcwoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB4LHk7CiAgICAgICAgICAgICAgfSBnZFBvaW50LCAqZ2RQb2ludFB0cjsKCiAgICAgICAgICAgICAgdm9pZCBmb28oZ2RQb2ludFB0ciB4KTsKCiAgICAgICAgICAgVGhlbiB0aGUgZm9vIGZ1bmN0aW9uIHdvdWxkIGdldCBhIHR5cGUtZXJyb3IuICAgVGhlIHByb2JsZW0gaGFzCiAgICAgICAgICAgdG8gZG8gd2l0aCBpbnRlcm5hbCB0eXBlZGVmIGhhbmRsaW5nIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlZGVmCiAgICAgICAgICAgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3QgYXBwZWFyIGxhdGVyIGluIHRoZSBwYXJzZSB0cmVlLgogICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmluIEpvdmFub3ZpYy4KCjExLzA5LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gIm91dCIgdHlwZW1hcHMgKGFuZCByZWxhdGVkIHZhcmlhdGlvbnMpLiAgVGhlIG5hbWUKICAgICAgICAgICB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwIGlzIG5vdyB0aGUgcmF3IEMgaWRlbnRpZmllciB0aGF0CiAgICAgICAgICAgYXBwZWFycyBvbiBhIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBmb28oKTsgICAgLy8gdHlwZW1hcCBnZXRzIGFwcGxpZWQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBuZXZlciByZWFsbHkgc3BlY2lmaWVkIGhvdyB0aGlzIHdhcyBzdXBwb3NlZCB0bwogICAgICAgICAgIHdvcmsuICBJbiBTV0lHMS4xLCB5b3UgY291bGQgcHJvYmFibHkgd3JpdGUgYSB0eXBlbWFwIGZvciB0aGUKICAgICAgICAgICB3cmFwcGVyIG5hbWUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IEJsYWhfZm9vIHsgLi4uIH0KCiAgICAgICAgICAgSG93ZXZlciwgdGhpcyBvbGQgYmVoYXZpb3IgaXMgbm93IHdpdGhkcmF3biBhbmQgbm90IHN1cHBvcnRlZC4gCiAgICAgICAgICAgSnVzdCB1c2UgdGhlIG1lbWJlciBuYW1lIHdpdGhvdXQgYW55IHNvcnQgb2Ygc3BlY2lhbCBwcmVmaXguCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFRjbCBtb2R1bGUgaW5pdGlhbGl6YXRpb246CgogICAgICAgICAgICgxKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb2RlIG5lZWRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgIFRjbCBzdHVicy4gIFNpbXBseSBjb21waWxlIHdpdGggLURVU0VfVENMX1NUVUJTLgoKICAgICAgICAgICAoMikgU1dJRyBub3cgYXV0b21hdGljYWxseSBjYWxscyBUY2xfUGtnUHJvdmlkZSB0byByZWdpc3RlcgogICAgICAgICAgICAgICBhIHBhY2thZ2UgbmFtZS4gIFRoZSBwYWNrYWdlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlICVtb2R1bGUgZGlyZWN0aXZlLiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzCiAgICAgICAgICAgICAgIHNldCB0byAiMC4wIiBieSBkZWZhdWx0LiAgVG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciwgdXNlCiAgICAgICAgICAgICAgIHN3aWcgLXBrZ3ZlcnNpb24gMS4yIGludGVyZmFjZS5pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBNb2R1bGVzIHRoYXQgcHJvdmlkZWQgc3R1YnMgYW5kIFRjbF9Qa2dQcm92aWRlIG9uIHRoZWlyIG93biBtaWdodAogICAgICAgICAgIGJyZWFrLiAgU2ltcGx5IHJlbW92ZSB0aGF0IGNvZGUuCgoxMS8wNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIGNvZGUgZ2VuZXJhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFRjbCBtb2R1bGUuICBDb25zdGFudHMKICAgICAgICAgICBhcmUgbm93IHN0b3JlZCBpbiBhIGxhcmdlIHRhYmxlIHRoYXQgZ2V0IGluc3RhbGxlZCBhdCBtb2R1bGUgc3RhcnR1cC4KICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBubyBsb25nZXIgYW55IHN0YXRpYyB2YXJpYWJsZXMgc28gaXQgc2hvdWxkIGdlbmVyYXRlCiAgICAgICAgICAgc29tZXdoYXQgbGVzcyBjb2RlLgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICJjb25zdCIgdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvICJjb25zdGFudCIgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMuICAiY29uc3QiIGlzIGEgQyBrZXl3b3JkIHdoaWNoIG1hZGUgdGhlIGhhbmRsaW5nIG9mIHRoZSB0eXBlbWFwCiAgICAgICAgICAgZGlyZWN0aXZlIHNvbWV3aGF0IGF3a3dhcmQgaW4gdGhlIHBhcnNlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgICV0eXBlbWFwIGRpcmVjdGl2ZSBjYW4gbm93IGFjY2VwdCBuZWFybHkgYXJiaXRyYXJ5IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4scGFyc2U9ImkiLGRvYz0iaW50ZWdlciIpIGludCAiLi4uIgoKICAgICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBseSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBoaW50cyB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIG1vZHVsZS4gICBUaGUgaW50ZXByZXRhdGlvbiBvZiB0aGUKICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgdG8gaW50ZXJuYWwgY2FsbC9yZXR1cm4gYnkgdmFsdWUgaGFuZGxpbmcuCiAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgY2FsbC1ieS12YWx1ZSB3YXMgdHJhbnNsYXRlZAogICAgICAgICAgIGludG8gcG9pbnRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwoKICAgICAgICAgICB0dXJuZWQgaW50byB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHRyYW5zbGF0aW9uIHdhcyBub3JtYWxseSBwZXJmb3JtZWQgYnkgdGhlIFNXSUcgY29yZSwgb3V0c2lkZQogICAgICAgICAgIG9mIHRoZSBjb250cm9sIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBhIHNpZGUgZWZmZWN0CiAgICAgICAgICAgb2YgdGhpcyB3YXMgYSBsb3Qgb2YgYml6YXJyZSB0eXBlbWFwIGJlaGF2aW9yLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgIGlmIHlvdSBkaWQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBZb3Ugd291bGQgZmluZCB0aGF0IGludDMyIHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGEgcG9pbnRlciBldmVyeXdoZXJlIQogICAgICAgICAgIChuZWVkbGVzcyB0byBzYXksIHN1Y2ggYmVoYXZpb3IgaXMgdW5leHBlY3RlZCBhbmQgcXVpdGUgYXdrd2FyZCB0bwogICAgICAgICAgIGRlYWwgd2l0aCkuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIGlmIGEgdHlwZWRlZiB3YXMgYWxzbyB1c2VkLAogICAgICAgICAgIHRoZSBwb2ludGVyIGJlaGF2aW9yIHN1ZGRlbmx5IGRpc2FwcGVhcmVkLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIHBvaW50ZXIgdHJhbnNmb3JtYXRpb24gaXMgbm93IHB1c2hlZCB0byB0aGUKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiAgIFRoaXMgcHJvZHVjZXMgd3JhcHBlcnMgdGhhdCBsb29rIHJvdWdobHkKICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMSA9ICphOwogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMiA9ICpiOwogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lIHR5cGVtYXBzIGZvcgogICAgICAgICAgIGFyYml0cmFyeSB1bmRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGlzIChhbmQgaXQKICAgICAgICAgICB3aWxsIHdvcmsgcmVnYXJkbGVzcyB3aGF0IGludDMyIGlzKToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICQxID0gKGludDMyKSBQeUludF9Bc0xvbmcoJGlucHV0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElNQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2FsbC9yZXR1cm4gYnkgdmFsdWUgY29kZSBnZW5lcmF0aW9uIGluCiAgICAgICAgICAgc29tZSBsYW5ndWFnZSBtb2R1bGVzLgoKMTEvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0eXBlbWFwcyB0byB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAgeyAKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBvYmplY3QgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAqIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAmIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIGVudW0gU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAuLi4gYW4gZW51bSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIChDTEFTUzo6KikgewogICAgICAgICAgICAgICAgICAgLi4uIHBvaW50ZXIgdG8gbWVtYmVyIC4uLgogICAgICAgICAgICAgICB9CgoKICAgICAgICAgICBUaGVzZSB0eXBlcyBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIHR5cGVzIHRoYXQgZG9uJ3QgbWF0Y2gKICAgICAgICAgICBhbnl0aGluZyBlbHNlLiAgU2VlIENIQU5HRVMgbG9nIGVudHJ5IGZvciA4LzI3LzIwMDAgZm9yIHRoZQogICAgICAgICAgIG9sZCBiZWhhdmlvci4gIFRoZSByb2xlIG9mIHRoZXNlIHR5cGVzIGlzIGFsc28gZGVzY3JpYmVkIGluIAogICAgICAgICAgIERvYy9NYW51YWwvVHlwZW1hcHMuaHRtbAoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIAoxMC8yNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCBHdWlsZSBhbmQgTXpzY2hlbWUgbW9kdWxlcyB0byBzdXBwb3J0CiAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRml4IHRvIGhhbmRsZSBwb2ludGVycyB0byBhcnJheXMuCgoxMC8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBEZWZpbmluZyBhIHR5cGVtYXAgcnVsZSBmb3IgZW51bSBTV0lHRU5VTSBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgICB0byBkZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZW51bSB2YXJpYWJsZXMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSdWJ5IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFJ1YnkgbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGFuIGFyYml0cmFyeQogICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICBQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIGxpbWl0ZWQgdG8gCiAgICAgICAgICAgdG8gZnVuY3Rpb25zIHdpdGggb25seSA5IG9yIDE2IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdXNlIG9mIGRlZmF1bHQgYXJndW1lbnRzLiAgIE5vdGU6IGZyb20gc29tZSBpbnNwZWN0aW9uCiAgICAgICAgICAgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgc291cmNlLCB0aGUgbmV3IGFwcHJvYWNoIG1pZ2h0IGJlCiAgICAgICAgICAgYSBsaXR0bGUgZmFzdGVyIGFzIHdlbGwuCgoxMC8xOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgIHRlbXBsYXRlcy4KCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDxTLFQ+OwoKICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSXJpbmEgS290bG92YS4KCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzIGFkZGVkLiAgVGhlIHR5cGVtYXBzCiAgICAgICAgICAgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgc3ludGF4IGJlbG93LiAgIFdpdGhpbiBlYWNoCiAgICAgICAgICAgdHlwZW1hcCwgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICRhcmc7ICAvLyBUaGUgaW5wdXQgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgJDE7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQyOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBzZWNvbmQgYXJndW1lbnQKCiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyByZWZlciB0byBlaXRoZXIgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDFfdHlwZSwgJDFfbHR5cGUsICQxX2Jhc2V0eXBlLCBldGMuLi4gIChhcmdjKQogICAgICAgICAgICAgICAgICAkMl90eXBlLCAkMl9sdHlwZSwgJDJfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ3ZbXSkKCiAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGRpbWVuc2lvbiBvZiBhcmd2CiAgICAgICAgICAgICAgICAgICQyX2RpbTAKICAgICAgICAgICAgICB9CgogICAgICAgICAgIEJhc2ljYWxseSBhbnkgdmFyaWFibGUgdGhhdCB3YXMgYXZhaWxhYmxlIGluIG5vcm1hbCB0eXBlbWFwcwogICAgICAgICAgIGlzIGF2YWlsYWJsZSBmb3IgZWl0aGVyIGFyZ3VtZW50IGJ5IHByZWZhY2luZyB0aGUgdmFyaWFibGUKICAgICAgICAgICBuYW1lIGJ5ICckbl8nIHdoZXJlIG4gaXMgdGhlIGFyZ3VtZW50IHBvc2l0aW9uLgoKICAgICAgICAgICBOb3RlczogIAogICAgICAgICAgICgxKSBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHNpbmdsZQogICAgICAgICAgICAgICBvYmplY3QgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgIHlvdSBjYW4gc3BsaXQgYSBzdHJpbmcgaW50byBhIChjaGFyICosIGludCkgcGFpciBvcgogICAgICAgICAgICAgICBzcGxpdCBhIGxpc3QgaW50byBhIChpbnQsIGNoYXIgW10pIHBhaXIuICBJdCBpcyBub3QKICAgICAgICAgICAgICAgcG9zc2libGUgdG8gbWFwIG11bHRpcGxlIG9iamVjdHMgdG8gbXVsdGlwbGUgYXJndW1lbnRzLgoKICAgICAgICAgICAoMikgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIFNXSUcgdmVyc2lvbnMsIHRoZQogICAgICAgICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyAkdGFyZ2V0IGFuZCAkdHlwZSBhcmUgcHJlc2VydmVkIGFuZAogICAgICAgICAgICAgICBhcmUgbWFwcGVkIG9udG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9ubHkuCgogICAgICAgICAgICgzKSBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLgogICAgICAgICAgICAgICBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgYXJlIGFuIGV4dGVuc2lvbiB0byB0eXBlbWFwIGhhbmRsaW5nLgogICAgICAgICAgICAgICBTaW5nbGUgdmFsdWVkIHR5cGVtYXBzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsCiAgICAgICAgICAgICAgIHdheS4KCiAgICAgICAgICAgVGhlIG9sZCAkc291cmNlIGFuZCAkdGFyZ2V0IHZhcmlhYmxlcyBhcmUgb2ZmaWNpYWxseQogICAgICAgICAgIGRlcHJlY2F0ZWQuICBJbnB1dCB2YXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaAogICAgICAgICAgICRhcmckIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSByZWZlcmVuY2UgdGhyb3VnaCAkcmVzdWx0JC4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcy4gIFRoZSBzeW50YXgKICAgICAgICAgICBpcyBhIGxpdHRsZSBmdW5reSwgYnV0IGhlcmUgZ29lczoKCiAgICAgICAgICAgICAgLy8gRGVmaW5lIGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBNdWx0aXZhbHVlZCB0eXBlbWFwIHdpdGggbG9jYWxzCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKShpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIENvcHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSA9IChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKCiAgICAgICAgICAgICAgLy8gQXBwbHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJWFwcGx5IChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSB9OwoKICAgICAgICAgICBOb3RlOiB0aGlzIGV4dHJhIHBhcnNpbmcgc3VwcG9ydCBpcyBhZGRlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbi4KICAgICAgICAgICBObyBsYW5ndWFnZSBtb2R1bGVzIGN1cnJlbnRseSBzdXBwb3J0IG11bHRpLXZhbHVlZCB0eXBlbWFwcy4KCjEwLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1hdGNoaW5nIGNvZGUgdG8gZGlzY2FyZCBxdWFsaWZpZXJzIHdoZW4KICAgICAgICAgICBjaGVja2luZyBmb3IgYSBtYXRjaC4gICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkZWNsYXJhdGlvbgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGNoYXIgKngpOwoKICAgICAgICAgICBUaGUgdHlwZW1hcCBjaGVja2VyIGNoZWNrcyBmb3IgYSBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBJZiB0eXBlZGVmJ3MgYXJlIGludm9sdmVkLCBxdWFsaWZpZXIgc3RyaXBwaW5nIG9jY3VycyBiZWZvcmUKICAgICAgICAgICB0eXBlZGVmIHJlc29sdXRpb24uICBTbyBpZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyICpzdHJpbmc7CiAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3Qgc3RyaW5nIHgpOwoKICAgICAgICAgICB0eXBlbWFwIGNoZWNraW5nIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHgKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZwogICAgICAgICAgICAgICAgc3RyaW5nIHgKICAgICAgICAgICAgICAgIHN0cmluZwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV2l0aG91dCBxdWFsaWZpZXIgc3RyaXBwaW5nLCBvbmUgaGFzIHRvIHdyaXRlCiAgICAgICAgICAgc2VwZXJhdGUgdHlwZW1hcHMgZm9yIGFsbCB2YXJpYXRpb25zIG9mIGNvbnN0IGFuZCB2b2xhdGlsZSAod2hpY2gKICAgICAgICAgICBpcyBhIHBhaW4pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFR5cGVtYXBzIG1pZ2h0IGJlIGFwcGxpZWQgaW4KICAgICAgICAgICBwbGFjZXMgd2hlcmUgdGhleSB3ZXJlbid0IGJlZm9yZS4KCgoxMC85LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBkaXNhbWJpZ3VhdGUKICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBvbmx5IHZhcnkgaW4gY29uc3RuZXNzLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIG5vcm1hbGx5LgogICAgICAgICAgIAogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWhfY29uc3QpIGJsYWgoKSBjb25zdDsKCiAgICAgICAgICAgSW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUsIG1ldGhvZCBjYWxscyBsaWtlIHRoaXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgIChvYmopLT5ibGFoKCkgICAgICAgICAgICAgICAvLyBOb24tY29uc3QgdmVyc2lvbgogICAgICAgICAgICAgICAoKEZvbyBjb25zdCAqKW9iaiktPmJsYWgoKSAgLy8gY29uc3QgdmVyc2lvbgoKICAgICAgICAgICBUaGlzIHNob3VsZCBmb3JjZSB0aGUgcmlnaHQgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICAgICAgQWRtaXR0ZWRseSwgdGhpcyBpcyBwcm9iYWJseSBvYnNjdXJlLCBidXQgd2UgbWlnaHQKICAgICAgICAgICBhcyB3ZWxsIGdldCBpdCByaWdodC4KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3Igbm93IGlnbm9yZXMgJ1xyJyBpbiB0aGUgaW5wdXQuCiAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHRoZSBmb2xsb3dpbmcgYnVnOgogICAgICAgICAgIFsgIzQ2ODQxNiBdIFNXSUcgdGhpbmtzIG1hY3JvIGRlZnMgYXJlIGRlY2xhcmF0aW9ucz8KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHx8LCAmJiwgYW5kICEgaW4gY29uc3RhbnRzLiAgVGhpcwogICAgICAgICAgIGZpeGVzIFNGIFsgIzQ2ODk4OCBdIExvZ2ljYWwgb3BzIGJyZWFrIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBIb3dldmVyLCBhdCB0aGlzIHRpbWUsIGNvbnN0YW50cyB1c2luZyB0aGVzZSBvcGVyYXRvcnMKICAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCAodGhlIHBhcnNlciB3aWxsIGlzc3VlIGEgd2FybmluZykuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAtc2hvd190ZW1wbGF0ZXMgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFRoaXMgbWFrZXMKICAgICAgICAgICBTV0lHIGRpc3BsYXkgdGhlIGNvZGUgaXQgYWN0dWFsbHkgcGFyc2VzIHRvIGdlbmVyYXRlCiAgICAgICAgICAgdGVtcGxhdGUgd3JhcHBlcnMuICBNb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHNlbWFudGljcyBvZiAldGVtcGxhdGUgZGlyZWN0aXZlLiAgV2hlbgogICAgICAgICAgIHVzaW5nICV0ZW1wbGF0ZSwgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZAogICAgICAgICAgIGFzIHR5cGVzIGJ5IGRlZmF1bHQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICBUbyBzcGVjaWZ5IGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBpcyAqbm90KiBhIHR5cGUsIHlvdQogICAgICAgICAgIG5lZWQgdG8gdXNlIGRlZmF1bHQtdmFsdWUgc3ludGF4LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50LGludD01MD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8aW50LHNpemU9MTAwPjsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci0tb25seQogICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuLCA1MCwgMTAwKSBpcyB1c2VkIGR1cmluZwogICAgICAgICAgIGV4cGFuc2lvbi4gIFRoaXMgZGlmZmVycyBmcm9tIG5vcm1hbCBDKyssIGJ1dCBJIGNvdWxkbid0CiAgICAgICAgICAgZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gaXQgaW4gdGhlIHBhcnNlci4gIE1pZ2h0CiAgICAgICAgICAgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGxhdGVyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1ham9yIGNoYW5nZXMgdG8gdGVtcGxhdGUgaGFuZGxpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZQogICAgICAgICAgIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDKysgdHlwZS1zeXN0ZW0uIFRoZSBtYWluCiAgICAgICAgICAgcHJvYmxlbSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVtcGxhdGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGJsYWgoY29uc3QgVCB4KSB7IHN0dWZmIH07CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBOb3cgc3VwcG9zZSwgdGhhdCB5b3UgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG9uIGEKICAgICAgICAgICB0eXBlIGxpa2UgdGhpcyBpbiBTV0lHOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxpbnQgKj47CgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyAqc3VwcG9zZWQqIHRvIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIEhvd2V2ZXIsIGluIFNXSUctMS4zLjksIHRoZSB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gZ2V0cyBpdCB3cm9uZwogICAgICAgICAgIGFuZCBwcm9kdWNlcwoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgaW50ICp4KSB7IHN0dWZmIH07CgogICAgICAgICAgIChub3RpY2UgdGhlIGJhZCBwbGFjZW1lbnQgb2YgdGhlICdjb25zdCcgcXVhbGlmaWVyKS4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBTV0lHIHBhcnNlciBub3cgZ2VuZXJhdGVzIGltcGxpY2l0IHR5cGVkZWZzCiAgICAgICAgICAgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgY29kZSByb3VnaGx5CiAgICAgICAgICAgZXF1aXZhbGVudCB0byBkb2luZyB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAqX19zd2lndG1wbDE7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8X19zd2lndG1wbDE+OwoKICAgICAgICAgICB3aGljaCBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIFNpbmNlIHRoaXMgaXMgY29ycmVjdCBpbiBib3RoIEMrKyBhbmQgU1dJRywgaXQgcHJvdmlkZXMgdGhlIHJpZ2h0CiAgICAgICAgICAgc2VtYW50aWNzIGFuZCBhbGxvd3MgZXZlcnl0aGluZyB0byBjb21waWxlIHByb3Blcmx5LiAgSG93ZXZlciwKICAgICAgICAgICB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgYSBsaXR0bGUgYml0LCB0aGUgcGFyc2VyIGtlZXBzCiAgICAgICAgICAgdHJhY2sgb2YgdGhlIHRlbXBsYXRlIHR5cGVzIGFuZCBwZXJmb3JtcyBiYWNrLXN1YnN0aXR1dGlvbiB0bwogICAgICAgICAgIHRoZSBvcmlnaW5hbCB0eXBlIHdoZW4gYnVpbGRpbmcgdGhlIHBhcnNlIHRyZWUuICBUaHVzLCBldmVuCiAgICAgICAgICAgdGhvdWdoIHRoZSBpbXBsaWNpdCB0eXBlZGVmIGlzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBtYXkgYXBwZWFyCiAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGUgKGZvciBwcm9wZXIgY29tcGlsYXRpb24pLCB0aGUgcGFyc2UKICAgICAgICAgICB0cmVlIHdpbGwgaGlkZSBhIGxvdCBvZiB0aGVzZSBkZXRhaWxzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICB3aWxsIGxvb2sgbGlrZSBpdCB3YXMgZGVjbGFyZWQgYXMgZm9sbG93cyAod2hpY2ggaXMgd2hhdAogICAgICAgICAgIHlvdSB3YW50KToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9CgogICAgICAgICAgIFRoZSBvbmx5IHBsYWNlIHlvdSBhcmUgbGlrZWx5IHRvIG5vdGljZSB0aGUgdHlwZWRlZiBoYWNrCiAgICAgICAgICAgaXMgaW4gYm9kaWVzIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICBkaWQgdGhpcywKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmxhaCB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHsKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdGVtcHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgIHlvdSB3aWxsIGZpbmQgdGhhdCAnVCB0ZW1wdmFsdWUnIGdvdCBleHBhbmRlZCBpbnRvIHNvbWUKICAgICAgICAgICBzdHJhbmdlIHR5cGVkZWYgdHlwZS4gIFRoaXMgKnN0aWxsKiBjb21waWxlcyBjb3JyZWN0bHkgCiAgICAgICAgICAgc28gaXQncyBub3QgYSBiaWcgZGVhbCAob3RoZXIgdGhhbiBsb29raW5nIGtpbmQgb2YgdWdseQogICAgICAgICAgIGluIHRoZSB3cmFwcGVyIGZpbGUpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgc29tZSBpbmhlcml0YW5jZSBwcm9ibGVtcyBpbiBUY2wgT2JqZWN0IGludGVyZmFjZS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRjbCBtb2R1bGUgaGFzIGNoYW5nZWQgdG8gdXNlIGJ5dGUtYmFja2VkIHBvaW50ZXIgc3RyaW5ncy4gIFRoaXMKICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgSG93ZXZlciwKICAgICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggZGlnaXRzIGFwcGVhciBpbiBwb2ludGVyIHZhbHVlcyBubyBsb25nZXIKICAgICAgICAgICBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG51bWVyaWNhbCB2YWx1ZSBvZiBhCiAgICAgICAgICAgcG9pbnRlciAob24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgcGFpcnMgb2YgZGlnaXRzIGFwcGVhcgogICAgICAgICAgIGluIHJldmVyc2Ugb3JkZXIpLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUGVybDUgbW9kdWxlIGlzIG5vdyBkcml2ZW4gYnkgYSBjb25maWd1cmF0aW9uIGZpbGUgJ3Blcmw1LnN3ZycKICAgICAgICAgICBpbiB0aGUgU1dJRyBsaWJyYXJ5LgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHBlcmw1IG1vZHVsZSBubyBsb25nZXIgdHJpZXMgdG8gYXBwbHkgdGhlICJvdXQiIHR5cGVtYXAKICAgICAgICAgICBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgbWFnaWMgdmFyaWFibGVzLiAgSSdtIHN1cnByaXNlZCB0aGF0CiAgICAgICAgICAgdGhpcyBldmVyIHdvcmtlZCBhdCBhbGwgKHNpbmNlIGFsbCBvZiB0aGUgY29kZSB0aGF0IHdhcyB0aGVyZQogICAgICAgICAgIHdhcyB3cm9uZyBhbnl3YXlzKS4gICBVc2UgdGhlICJ2YXJvdXQiIHR5cGVtYXAgdG8gaGFuZGxlCiAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcy4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIGFycmF5IG1lbWJlcnMgb2Ygc3RydWN0dXJlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIGlzIG5vcm1hbGx5IHN1cHBvc2VkIHRvIHJldHVybiBhIHN0cmluZywgYnV0IHRoaXMgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy45LiAgIFRoZSByZWFzb24gaXQgd2FzIGJyb2tlbiB3YXMgYWN0dWFsbHkKICAgICAgICAgICBkdWUgdG8gYSBzdWJ0bGUgbmV3IGZlYXR1cmUgb2YgdHlwZW1hcHMuICBXaGVuIGEgZGF0YSBtZW1iZXIKICAgICAgICAgICBpcyBzZXQgdG8gYW4gYXJyYXkgbGlrZSB0aGlzLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlbGF0ZWQKICAgICAgICAgICBhY2Nlc3NvciBmdW5jdGlvbiBpcyBhY3R1YWxseSBzZXQgdG8gYW4gYXJyYXkuICBUaGlzIG1lYW5zCiAgICAgICAgICAgdGhhdCB5b3UgY2FuIG5vdyB3cml0ZSB0eXBlbWFwcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixvdXQpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICR0YXJnZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgkc291cmNlLCRkaW0wKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZSBkZWZ1bmN0CiAgICAgICAgICAgbWVtYmVyb3V0IHR5cGVtYXAgaW4gYSBtb3JlIGVsZWdhbnQgbWFubmVyLgoKOS8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU29tZSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgcXVhbGlmaWVkIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAoaSkgVGhlIFNXSUcgcGFyc2VyIHdhcyBleHRlbmRlZCBzbGlnaHRseSB0byBhbGxvdyAndm9sYXRpbGUnCiAgICAgICAgICAgYW5kIGNvbWJpbmF0aW9ucyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIHRvIGJlIHVzZWQuICBUaGlzCiAgICAgICAgICAgaXMgcHJvYmFibHkgcmFyZSwgYnV0IHRlY2huaWNhbGx5IGxlZ2FsLiAgT25seSBhZGRlZCBmb3IKICAgICAgICAgICBjb21wbGV0ZW5lc3MuCgogICAgICAgICAgIChpaSkgRm9yIHRoZSBwdXJwb3NlcyBvZiBvdmVybG9hZGluZywgcXVhbGlmaWVkIGFuZCBub24tcXVhbGlmaWVkCiAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQuICBUaHVzLCB3aGVuIGEgY2xhc3MgaGFzIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CgogICAgICAgICAgIFR3byBkaXN0aW5jdCBtZXRob2RzIGFyZSBkZWNsYXJlZC4gIFRvIGRlYWwgd2l0aCB0aGlzLCAlcmVuYW1lCiAgICAgICAgICAgYW5kIHNpbWlsYXIgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gcmVjb2duaXplIGNvbnN0LgogICAgICAgICAgIFRodXMsIG9uZSBjYW4gZGlzYW1iaWd1YXRlIHRoZSB0d28gZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb2NvbnN0KSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBvciBzaW1wbHkgaWdub3JlIHRoZSBjb25zdCB2YXJpYW50IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIE5vdGU6IFNXSUcgY3VycmVudGx5IGhhcyBubyB3YXkgdG8gYWN0dWFsbHkgaW52b2tlIHRoZSBjb25zdAogICAgICAgICAgIG1lbWJlciBzaW5jZSB0aGUgJ2NvbnN0JyBpcyBkaXNjYXJkZWQgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzCiAgICAgICAgICAgZm9yIG9iamVjdHMuICAKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIE5ldyBkaXJlY3RpdmUuICVuYW1ld2FybiBjYW4gYmUgdXNlZCB0byBpc3N1ZSB3YXJuaW5nCiAgICAgICAgICAgbWVzc2FnZXMgZm9yIGNlcnRhaW4gZGVjbGFyYXRpb24gbmFtZXMuICAgVGhlIG5hbWUKICAgICAgICAgICBtYXRjaGluZyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlICVyZW5hbWUgZGlyZWN0aXZlLgogICAgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhpcyBkaXJlY3RpdmUgaXMgdG8gaXNzdWUgd2FybmluZ3MgZm9yCiAgICAgICAgICAgcG9zc2libGUgbmFtZXNwYWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbmFtZXdhcm4oInByaW50IGlzIGEgcHl0aG9uIGtleXdvcmQiKSBwcmludDsKCiAgICAgICAgICAgVGhlIG5hbWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHBlcmZvcm1lZCBhZnRlciBhIG5hbWUKICAgICAgICAgICBoYXMgYmVlbiByZXNvbHZlZCB1c2luZyAlcmVuYW1lLiAgVGhlcmVmb3JlLCBhCiAgICAgICAgICAgZGVjbGFyYXRpb24gbGlrZSB0aGlzIHdpbGwgbm90IGdlbmVyYXRlIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiUHJpbnQiKSBwcmludDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB2b2lkIHByaW50KCk7ICAgIC8qIE5vIHdhcm5pbmcgZ2VuZXJhdGVkICovCgogICAgICAgICAgIFNpbmNlIHRoZSB3YXJuaW5nIG1lY2hhbmlzbSBmb2xsb3dzICVyZW5hbWUgc2VtYW50aWNzLCBpdCBpcwogICAgICAgICAgIGFsc28gdG8gaXNzdWUgd2FybmluZ3MgZm9yIHNwZWNpZmljIGNsYXNzZXMgb3IganVzdCBmb3IKICAgICAgICAgICBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbiBuYW1lcy4KCiAgICAgICAgICAgKERhdmUgLSBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgYWRkaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKICAgICAgICAgICBmb3IgcXVpdGUgc29tZSB0aW1lLiAgSnVzdCBuZXZlciBnb3QgYXJvdW5kIHRvIGl0KQogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbmhhbmNlZCB0aGUgJWlnbm9yZSBkaXJlY3RpdmUgc28gdGhhdCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgY2FuIGJlIGlzc3VlZCB0byB1c2Vycy4gICBUaGlzIGlzIGRvbmUgdXNpbmcgJWlnbm9yZXdhcm4KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWlnbm9yZXdhcm4oIm9wZXJhdG9yIG5ldyBpZ25vcmVkIikgb3BlcmF0b3IgbmV3OwoKICAgICAgICAgICBUaGUgbmFtZXMgYW5kIHNlbWFudGljcyBvZiAlaWdub3Jld2FybiBpcyBleGFjdGx5IHRoZSAKICAgICAgICAgICBzYW1lIGFzICVpZ25vcmUuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICBpcyBmb3IgbW9kdWxlIHdyaXRlcnMgd2hvIHdhbnQgdG8gaWdub3JlIGNlcnRhaW4gdHlwZXMKICAgICAgICAgICBvZiBkZWNsYXJhdGlvbnMsIGJ1dCB3aG8gYWxzbyB3YW50IHRvIGFsZXJ0IHVzZXJzIGFib3V0IGl0LgogICAgICAgICAgIEEgdXNlciBtaWdodCBhbHNvIHVzZSB0aGlzIGZvciBkZWJ1Z2dpbmcgKHNpbmNlIG1lc3NhZ2VzCiAgICAgICAgICAgd2lsbCBhcHBlYXIgd2hlbmV2ZXIgYW4gaWdub3JlZCBkZWNsYXJhdGlvbiBhcHBlYXJzKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzI2LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTdXBlci1leHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBvcGVyYXRvcnMuIAogICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50IHBhcnRzLgoKICAgICAgICAgICAoaSkgT3BlcmF0b3IgbmFtZXMgc3VjaCBhcyAnb3BlcmF0b3IrJyBhcmUgbm93IGFsbG93ZWQKICAgICAgICAgICBhcyB2YWxpZCBkZWNsYXJhdG9yIG5hbWVzLiAgVGh1cyB0aGUgJ29wZXJhdG9yJyBzeW50YXgKICAgICAgICAgICBjYW4gYXBwZWFyICphbnlwbGFjZSogYSBub3JtYWwgZGVjbGFyYXRvciBuYW1lIHdhcyB1c2VkCiAgICAgICAgICAgYmVmb3JlLiAgT24gdGhlIHN1cmZhY2UsIHRoaXMgbWVhbnMgdGhhdCBvcGVyYXRvcnMgY2FuCiAgICAgICAgICAgYmUgcGFyc2VkIGp1c3QgbGlrZSBub3JtYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLiAKICAgICAgICAgICBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgb3BlcmF0b3IgbmFtZXMgY2FuIGJlIHVzZWQKICAgICAgICAgICBpbiBtYW55IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVyZW5hbWUoX19hZGRfXykgQ29tcGxleDo6b3BlcmF0b3IrKGNvbnN0IENvbXBsZXggJik7CgogICAgICAgICAgIChpaSkgT3BlcmF0b3JzIGFyZSB3cmFwcGVkICpleGFjdGx5KiBsaWtlIG5vcm1hbCBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgbWV0aG9kcy4gIEludGVybmFsbHksIHRoZSBvcGVyYXRvciBuYW1lIGlzIHVzZWQgCiAgICAgICAgICAgZGlyZWN0bHkgbWVhbmluZyB0aGF0IHRoZSB3cmFwcGVyIGNvZGUgbWlnaHQgY29udGFpbgogICAgICAgICAgIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGFyZzAtPm9wZXJhdG9yKigoQ29tcGxleCBjb25zdCAmKSphcmcxKTsKCiAgICAgICAgICAgVGhpcyBhbGwgc2VlbXMgdG8gcGFyc2UgYW5kIGNvbXBpbGUgY29ycmVjdGx5IChhdCBsZWFzdAogICAgICAgICAgIG9uIG15IG1hY2hpbmUpLgoKICAgICAgICAgICAoaWlpKSBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdyYXAgYSBkZWNsYXJhdGlvbiBpZiBpdHMgc3ltYm9sCiAgICAgICAgICAgdGFibGUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycy4gIElmCiAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBkZXRlY3RlZCwgeW91IHdpbGwgc2VlIGFuIGVycm9yCiAgICAgICAgICAgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICBXYXJuaW5nLiBDYW4ndCB3cmFwIG9wZXJhdG9yKiB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuCgogICAgICAgICAgIFRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgJXJlbmFtZSBvciAlbmFtZSB0byBiaW5kCiAgICAgICAgICAgdGhlIG9wZXJhdG9yIHRvIGEgbmljZSBuYW1lIGxpa2UgImFkZCIgb3Igc29tZXRoaW5nLiBOb3RlOgogICAgICAgICAgIHRoZSBsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldAogICAgICAgICAgIGxhbmd1YWdlLgoKICAgICAgICAgICBUaGVyZSBhcmUgY2VydGFpbiBpc3N1ZXMgd2l0aCBmcmllbmQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCiAgICAgICAgICAgU29tZXRpbWVzLCBmcmllbmRzIGFyZSB1c2VkIHRvIGRlZmluZSBtaXhlZCBvcGVyYXRvcnMgc3VjaAogICAgICAgICAgIGFzIGFkZGluZyBhIENvbXBsZXggYW5kIGEgZG91YmxlIHRvZ2V0aGVyLiAgQ3VycmVudGx5LCBTV0lHCiAgICAgICAgICAgaWdub3JlcyBhbGwgZnJpZW5kIGRlY2xhcmF0aW9ucyBpbiBhIGNsYXNzLiAgQSBnbG9iYWwgb3BlcmF0b3IKICAgICAgICAgICBkZWNsYXJhdGlvbiBjYW4gcHJvYmFibHkgYmUgbWFkZSB0byB3b3JrLCBidXQgeW91J2xsIGhhdmUgdG8KICAgICAgICAgICByZW5hbWUgaXQgYW5kIGl0IHByb2JhYmx5IHdvbid0IHdvcmsgdmVyeSBjbGVhbmx5IGluIHRoZQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBzaW5jZSBpdCdzIG5vdCBhIGNsYXNzIG1lbWJlci4KCiAgICAgICAgICAgU1dJRyBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBvcGVyYXRvciBzcGVjaWZpY2F0aW9ucyAKICAgICAgICAgICBzb21ldGltZXMgdXNlZCBmb3IgYXV0b21hdGljIHR5cGUgY29udmVyc2lvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIFN0cmluZyB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9OwoKICAgICAgICAgICAodGhpcyBkb2Vzbid0IHBhcnNlIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGF4IGVycm9yKS4KCiAgICAgICAgICAgQWxzbzogb3BlcmF0b3JzIG5vIGxvbmdlciBzaG93IHVwIGFzIHNlcGFyYXRlIHBhcnNlLXRyZWUKICAgICAgICAgICBub2RlcyAoaW5zdGVhZCB0aGV5IGFyZSBub3JtYWwgJ2NkZWNsJyBub2RlcykuICBJIG1heQogICAgICAgICAgIHNlcGFyYXRlIHRoZW0gYXMgYSBzcGVjaWFsIGNhc2UgbGF0ZXIuCgogICAgICAgICAgIFNlZSBFeGFtcGxlcy9weXRob24vb3BlcmF0b3IgZm9yIGFuIGV4YW1wbGUuCgogICAgICAgICAgICoqKiBTVVBFUi1FWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgpWZXJzaW9uIDEuMy45IChTZXB0ZW1iZXIgMjUsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGUgZGVjbGFyYXRpb25zIGxpa2UgCiAgICAgICAgICAgJ2NoYXIgKiogY29uc3QnLiAgU1dJRyBwYXJzZWQgdGhpcyBjb3JyZWN0bHksIGJ1dCB0aGUKICAgICAgICAgICBpbnRlcm5hbCB0eXBlIHdhcyByZXByZXNlbnRlZCBpbmNvcnJlY3RseSAodGhlIHBvaW50ZXJzCiAgICAgICAgICAgYW5kIHF1YWxpZmllcnMgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIpLgoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgV2l0aGRyZXcgZXhwZXJpbWVudGFsIGZlYXR1cmUgKG5vdGVkIGJlbG93KSB0aGF0IHdhcwogICAgICAgICAgIGNhdXNpbmcgc2VyaW91cyBwYXJzaW5nIHByb2JsZW1zLgoKVmVyc2lvbiAxLjMuOCAoU2VwdGVtYmVyIDIzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCBpbXByb3ZlZCBkaXN0dXRpbHMgc2V0dXAucHkgZmlsZSBpbiB0aGUgVG9vbHMgCiAgICAgICAgICAgZGlyZWN0b3J5IChsb29rIGZvciB0aGUgc2V0dXAucHkudG1wbCBmaWxlKS4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICAgVG9ueSBTZXdhcmQuCgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCB0d28gbmV3IFJQTSBzcGVjIGZpbGVzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgVG9ueSBTZXdhcmQgYW5kIFV3ZSBTdGVpbm1hbm4uCiAgCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjM2MzUgXSBQZXJsNS5zd2cgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgQysrCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUd28gbmV3IGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgZGVmYXVsdAogICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdAogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0CgogICAgICAgICAgIFRoZXNlIHJlcGxhY2UgJXByYWdtYSBub2RlZmF1bHQgYW5kICVwcmFnbWEgbWFrZWRlZmF1bHQuCiAgICAgICAgICAgKG9sZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IGRvY3VtZW50YXRpb24gd2lsbCBvbmx5CiAgICAgICAgICAgZGVzY3JpYmUgdGhlIG5ldyBkaXJlY3RpdmVzKS4KCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjIzNTQgXSAlaW1wb3J0IGJyb2tlbiBpbiAxLjMuNy4KCjkvMjAvMjAwMTogYmVhemxleQoKICAgICAgICAgICBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIG91dC1vZi1jbGFzcyBjb25zdHJ1Y3RvcgogICAgICAgICAgIGFuZCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6Rm9vKCkgOgogICAgICAgICAgICAgICAgICAgIEJhcigiZm9vIikKICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlubGluZSBGb286On5Gb28oKSB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEphc29uIFN0ZXdhcnQuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciB0byBpZ25vcmUgZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgViwgbG9uZyBTPiBjbGFzcyBNYXBJdGVyOwoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgYW4gZW1haWwgZXhhbXBsZSBmcm9tIElyaW5hIEtvdGxvdmEuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCB0Y2xfcmVzdWx0IHZhcmlhYmxlIGluIAogICAgICAgICAgIHRoZSAib3V0IiB0eXBlbWFwIGZvciBUY2wuICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggQWN0aXZlUGVybC4gIAogICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNpbmcgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBGb28oKSA6IEJhciguLi4pIHsuLi59CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBub3cgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSAoLi4uKSByZWdhcmRsZXNzIG9mIAogICAgICAgICAgIHdoYXQgbWlnaHQgZW5jbG9zZWQgKGV2ZW4gaWYgc3ludGFjdGljYWxseSB3cm9uZykuICBTV0lHCiAgICAgICAgICAgZG9lc24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwogICAgICAgICAgIG5lZWRsZXNzIGFkZCBzeW50YXggcnVsZXMgdG8gaGFuZGxlIGFsbCBvZiB0aGUgcG9zc2liaWxpdGllcwogICAgICAgICAgIGhlcmUuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdHlwZW1hcHMgZm9yIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgeW91IGhhdmUgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgaW50ICpiYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIG1lbWJlciBuYW1lICdiYXInIGlzIG5vdyB1c2VkIGluIGFueSBhY2Nlc3NvciBmdW5jdGlvbnMuCiAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlICJpbiIgdHlwZW1hcCB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgdHlwZW1hcAoKICAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLGluKSBpbnQgKmJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBub3cgbWF0Y2hlcyBWZWN0b3I6OmJhci4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgd2lsbCBhbHNvCiAgICAgICAgICAgbWF0Y2ggYW55IGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgImludCAqYmFyIiAoc28geW91IHNob3VsZAogICAgICAgICAgIGJlIGNhcmVmdWwpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRS4gUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyNjQyIHNldHRpbmcgc3RyaW5nIHZhbHVlcyBpbiBzdHJ1Y3R1cmVzCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjM5OCBwcm9ibGVtIHdpdGggbmVzdGVkIHRlbXBsYXRlcy4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYxNjI2IHByb2JsZW0gd2l0aCBmb3JtYXR0aW5nIGFuZCBDKysgY29tbWVudHMuCiAgICAgICAgICAgIAo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2Mjg0NSBXcm9uZyBvd25lcnNoaXAgb2YgcmV0dXJuZWQgb2JqZWN0cy4KICAgICAgICAgICAKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NTkzNjcuICBEZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY2xhc3NlcwogICAgICAgICAgIHdpdGggcHVyZSB2aXJ0dWFsIG1ldGhvZHMuCgo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIGNsYXNzIHNjb3BlLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgZW51bSBiYXIgeyBGT08sIEJBUiB9OwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyIGIgPSBGT08pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTV0lHIG5vdyBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgZGVmYXVsdCB2YWx1ZSBvZiAiRm9vOjpGT08iIGZvcgogICAgICAgICAgIHRoZSBibGFoKCkgbWV0aG9kIGFib3ZlLiAgVGhpcyB1c2VkIHRvIHdvcmsgaW4gMS4xLCBidXQgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy43LiAgIEJ1ZyByZXBvcnRlZCBieSBNaWtlIFJvbWJlcmcuCgpWZXJzaW9uIDEuMy43ICAoU2VwdGVtYmVyIDMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHNwZWNpYWwgJWlnbm9yZSBkaXJlY3RpdmUgdG8gaWdub3JlIGRlY2xhcmF0aW9ucy4gIFRoaXMKICAgICAgICAgICBmZWF0dXJlIHdvcmtzIGV4YWN0bHkgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSAgZm9vOyAgICAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMgZm9vCiAgICAgICAgICAgICAlaWdub3JlICA6OmZvbzsgICAgICAvLyBPbmx5IGlnbm9yZSBmb28gaW4gZ2xvYmFsIHNjb3BlCiAgICAgICAgICAgICAlaWdub3JlICBTcGFtOjpmb287ICAvLyBPbmx5IGlnbm9yZSBpbiBjbGFzcyBTcGFtCiAgICAgICAgICAgICAlaWdub3JlICAqOjpmb287ICAgICAvLyBJZ25vcmUgaW4gYWxsIGNsYXNzZXMKCiAgICAgICAgICAgJWlnbm9yZSBjYW4gYWxzbyBiZSBwYXJhbWV0ZXJpemVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgU3BhbTo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlICo6OmZvbyhpbnQpOwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAoKOS8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gc2hhZG93Y29kZSBwcmFnbWEgbW9kaWZpZWQgc28gdGhhdCB0aGUgY29kZSB0aGF0IGlzIG91dHB1dCAKICAgICAgICAgICBpbiB0aGUgc2hhZG93IGZpbGUgaXMgcGxhY2VkIHJlbGF0aXZlIHRvIHdoZXJlIGl0IGlzIHBsYWNlZCBpbiB0aGUgCiAgICAgICAgICAgYy9jKysgY29kZS4gVGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgSmF2YURvYyBmdW5jdGlvbiBjb21tZW50cy4gCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBQYXRjaCBbICM0NDc3OTEgXSBGaXggZm9yIHB5dGhvbiAtaW50ZXJmYWNlIG9wdGlvbi4KICAgICAgICAgICBTdWJtaXR0ZWQgYnkgVGFybiBXZWlzbmVyIEJ1cnRvbi4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwogICAgICAgICAgIGZvciBhIGNsYXNzIGlmIGl0IG9ubHkgZGVmaW5lcyBhIHByaXZhdGUvcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgb3IgZGVzdHJ1Y3RvciBvciBpZiBhbnkgb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgb25seSBoYXMKICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4gIFRoaXMgd2FzIHJlcG9ydGVkIGluCiAgICAgICAgICAgU0YgUGF0Y2ggWyAjNDQ0MjgxIF0gbm9ucHVibGljL2RlZmF1bHQvaW5oZXJldGVkIGN0b3IvZHRvcgogICAgICAgICAgIGJ5IE1hcmNlbG8gTWF0dXMuCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXRjaCB0byBQZXJsNSBtb2R1bGUgdGhhdCBhbGxvd3MgY29uc3RhbnRzIHRvIGJlCiAgICAgICAgICAgd3JhcHBlZCBhcyBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBsZWFkaW5nICQuCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgdXNpbmcgdGhlIC1jb25zdCBvcHRpb24uCiAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUmljaCBXYWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSAndm9sYXRpbGUnIHR5cGUgcXVhbGlmaWVyLgogICAgICAgICAgIHZvbGF0aWxlIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyB0byBTV0lHLCBidXQgaXQgaXMKICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgZGVjbGFyYXRpb25zCiAgICAgICAgICAgdGhhdCB1c2UgaXQuICBJdCdzIGFsc28gYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBTV0lHIHR5cGUKICAgICAgICAgICBzeXN0ZW0gbW9yZSBjb21wbGV0ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkICVyZW5hbWUgZGlyZWN0aXZlLiAgKioqIFRoaXMKICAgICAgICAgICBuZXcgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mCiAgICAgICAgICAgcmVzb2x2aW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAqKioKICAgICAgICAgICAKICAgICAgICAgICBJbiBwcmlvciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgd2FzCiAgICAgICAgICAgdXNlZCB0byBjb25zaXN0ZW50bHkgYXBwbHkgYW4gaWRlbnRpZmllciByZW5hbWluZy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBzYWlkIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZSBmb28gYmFyOwoKICAgICAgICAgICBFdmVyeSBvY2N1cnJlbmNlIG9mICdmb28nIHdvdWxkIGJlIHJlbmFtZWQgdG8gJ2JhcicuIAogICAgICAgICAgIEFsdGhvdWdoIHRoaXMgd29ya3MgZmluZSBmb3IgcmVzb2x2aW5nIGEgY29uZmxpY3Qgd2l0aCBhCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHJlc2VydmVkIHdvcmQsIGl0IGlzIHVzZWxlc3MgZm9yCiAgICAgICAgICAgZm9yIGRlYWxpbmcgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMuICAgIFRoaXMgaXMgYmVjYXVzZQogICAgICAgICAgIGFsbCBtZXRob2RzIGFyZSBzaW1wbHkgcmVuYW1lZCB0byB0aGUgc2FtZSB0aGluZyAKICAgICAgICAgICAoZ2VuZXJhdGluZyB0aGUgc2FtZSBjb25mbGljdCBhcyBiZWZvcmUpLgoKICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB0byBkZWFsIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgd2FzIHRvIGdvIHRocm91Z2ggYW5kIGluZGl2aWR1YWxseSByZW5hbWUgdGhlbSBhbGwgdXNpbmcKICAgICAgICAgICAlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCB5b3UgaGFkIHRvIGRvIHRoaXMgZm9yIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyB0b28uCgogICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBtYWtlcyBpdCBleHRyZW1lbHkgaGFyZCB0byByZXNvbHZlCiAgICAgICAgICAgb3ZlcmxvYWRpbmcgd2l0aG91dCBhIGxvdCBvZiB3b3JrIGFuZCBtYWtlcyBpdCBhbG1vc3QKICAgICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBTV0lHIG9uIHJhdyBDKysgLmggZmlsZXMuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCAlcmVuYW1lIG5vdyBhY2NlcHRzIHBhcmFtZXRlciBkZWNsYXJhdG9ycy4KICAgICAgICAgICBUaGUgc3ludGF4IGhhcyBhbHNvIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIEZvciBleGFtcGxlLAogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gcmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcihpbnQpJwogICAgICAgICAgIHRvICdiYXJfaScsIGxlYXZpbmcgYW55IG90aGVyIG9jY3VycmVuY2Ugb2YgJ2JhcicgYWxvbmUuCgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CgogICAgICAgICAgIFVzaW5nIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBub3cgc2VsZWN0aXZlbHkgcmVuYW1lIAogICAgICAgICAgIGNlcnRhaW4gZGVjbGFyYXRpb25zIGluIGFkdmFuY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2QpIGJhcihkb3VibGUpOwoKICAgICAgICAgICAgIC8vIEluY2x1ZGUgcmF3IEMrKyBoZWFkZXIgICAgCiAgICAgICAgICAgICAlaW5jbHVkZSAiaGVhZGVyLmgiCgogICAgICAgICAgIFdoZW4gJXJlbmFtZSBpcyB1c2VkIGluIHRoaXMgbWFubmVyLCBhbGwgb2NjdXJyZW5jZSBvZiBiYXIoaW50KQogICAgICAgICAgIGFyZSByZW5hbWVkIHdoZXJldmVyIHRoZXkgbWlnaHQgb2NjdXIuICBNb3JlIGNvbnRyb2wgaXMgb2J0YWluZWQKICAgICAgICAgICB0aHJvdWdoIGV4cGxpY2l0IHF1YWxpZmljYXRpb24uIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSA6OmJhcihpbnQpOwoKICAgICAgICAgICBvbmx5IGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24sCiAgICAgCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgRm9vOjpiYXIoaW50KTsKCiAgICAgICAgICAgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiBhIGNsYXNzIEZvby4KICAgICAgICAgICBUaGlzIGxhdHRlciBmb3JtIGFsc28gc3VwcG9ydHMgaW5oZXJpdGFuY2UuICBUaGVyZWZvcmUsIGlmIHlvdQogICAgICAgICAgIGhhZCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgU3BhbTo6YmFyKGludCkgbWV0aG9kIHdvdWxkIGFsc28gYmUgcmVuYW1lZCAoc2luY2UgU3BhbSAKICAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIEZvbykuICAgVGhpcyBsYXR0ZXIgZmVhdHVyZSBtYWtlcyBpdCBlYXN5CiAgICAgICAgICAgZm9yIFNXSUcgdG8gYXBwbHkgYSBjb25zaXN0ZW50IHJlbmFtaW5nIGFjcm9zcyBhbiBlbnRpcmUKICAgICAgICAgICBjbGFzcyBoaWVyYXJjaHkgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgcmVuYW1pbmcgcnVsZXMgZm9yCiAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgIEEgY2xhc3Mgd2lsZGNhcmQgb2YgKiBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byByZW5hbWluZwogICAgICAgICAgIGFsbCBtYXRjaGluZyBtZW1iZXJzIG9mIGFsbCBjbGFzc2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpICo6OmJhcihpbnQpOwoKICAgICAgICAgICB3aWxsIHJlbmFtZSBhbGwgbWVtYmVycyBiYXIoaW50KSB0aGF0IGFyZSBkZWZpbmVkIGluIGNsYXNzZXMuCiAgICAgICAgICAgSXQgd2lsbCBub3QgcmVuYW1lZCBkZWZpbml0aW9ucyBvZiBiYXIoaW50KSBpbiB0aGUgZ2xvYmFsCiAgICAgICAgICAgc2NvcGUuCgogICAgICAgICAgIFRoZSBvbGQgdXNlIG9mICVyZW5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXMgc29tZXdoYXQKICAgICAgICAgICBlbmhhbmNlZC4gIAoKICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgYmFyOyAgICAgIC8vIFJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXInLgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSA6OmJhcjsgICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBnbG9iYWwgc2NvcGUgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgKjo6YmFyOyAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gY2xhc3NlcyBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBGb286OmJhcjsgLy8gUmVuYW1lIGFsbCAnYmFyJyBkZWZpbmVkIGluIGNsYXNzIEZvby4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGF0YS1tZW1iZXIgdG8gbWVtYmVyLWZ1bmN0aW9uIAogICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTm93IHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB4IGFuZCB5IAogICAgICAgICAgIHRocm91Z2ggYSBtZW1iZXIgZnVuY3Rpb24gaW50ZXJmYWNlIGluc3RlYWQgCiAgICAgICAgICAgb2YgdGhlIHVzdWFsIFNXSUcgYmVoYXZpb3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBmLnNldF94KDMuNCkgICAgICAjIGluc3RlYWQgb2YgZi54ID0gMy40CiAgICAgICAgICAgICAgeCA9IGYuZ2V0X3goKSAgICAgIyBpbnN0ZWFkIG9mIHggPSBmLngKCiAgICAgICAgICAgVG8gZG8gdGhpcywgc2ltcGx5IHVzZSB0aGUgbmV3ICVhdHRyaWJ1dGVmdW5jCiAgICAgICAgICAgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldF8lcyxzZXRfJXMpCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVub2F0dHJpYnV0ZWZ1bmMKCiAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byAlYXR0cmlidXRlZnVuYyBhcmUgQy1zdHlsZSBwcmludGYKICAgICAgICAgICBmb3JtYXQgc3RyaW5ncyB0aGF0IGRldGVybWluZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24KICAgICAgICAgICB0byB1c2UuICAlcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhIG1lbWJlci4gU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBwcmludGYKICAgICAgICAgICBleHRlbnNpb25zIHRoYXQgbWlnaHQgaGVscC4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICB3YW50ZWQgdG8gdGl0bGUgY2FzZSBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMsIHlvdQogICAgICAgICAgIGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldCUodGl0bGUpcyxzZXQlKHRpdGxlKXMpOwoKICAgICAgICAgICBUaGlzIHdpbGwgdHVybiBhbiBhdHRyaWJ1dGUgJ2JhcicgdG8gJ2dldEJhcigpJyBhbmQgJ3NldEJhcigpJy4KCiAgICAgICAgICAgKHNvbWVvbmUgcmVxdWVzdGVkIHRoaXMgbG9uZyBhZ28sIGJ1dCBJIGZpbmFsbHkgZmlndXJlZAogICAgICAgICAgIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgbWFubmVyKS4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBpZiBub25lIGFyZSBkZWZpbmVkLiAgVGhpcyB1c2VkIHRvIGJlCiAgICAgICAgICAgZW5hYmxlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHN3aXRjaCAtbWFrZV9kZWZhdWx0LCBidXQKICAgICAgICAgICBtb3N0IHBlb3BsZSB3YW50IHRoZXNlIGZ1bmN0aW9ucyBhbnl3YXlzLiAgVG8gdHVybgogICAgICAgICAgIG9mZiB0aGlzIGJlaGF2aW9yIHVzZSB0aGUgLW5vX2RlZmF1bHQgb3B0aW9uIG9yIGluY2x1ZGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CiAKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQ7CiAgCiAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgY2VydGFpbiBpbnRlcmZhY2VzIHRoYXQgZGVmaW5lZCB0aGVpcgogICAgICAgICAgIG93biBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgdXNpbmcgdGhlIHNhbWUgbmFtaW5nCiAgICAgICAgICAgY29udmVudGlvbiBhcyBTV0lHLiAgSWYgc28sIHlvdSB3aWxsIGdldCBkdXBsaWNhdGUKICAgICAgICAgICBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIEl0ZXJhdG9ycwogICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChGSVJTVEtFWSwgTkVYVEtFWSkuICBBbHNvLCBhdHRyaWJ1dGUKICAgICAgICAgICBhY2Nlc3MgaGFzIGJlZW4gY2hhbmdlZCB0byByZWx5IG9uIGluaGVyaXRhbmNlIGluIG9yZGVyCiAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgYmVoYXZpb3IgYWNyb3NzIG1vZHVsZXMuICAKCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIFZhcmlvdXMgb2JzY3VyZSBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCBjbGFzc2VzLgogICAgICAgICAgIFN0cmFuZ2UgZGVjbGFyYXRpb25zIGxpa2UgdGhpcyBhcmUgbm93IHdyYXBwZWQgY29ycmVjdGx5CiAgICAgICAgICAgKGkuZS4sIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGRvZXNuJ3QgY2F1c2UgdGhlIEMrKwogICAgICAgICAgICBjb21waWxlciB0byBkaWUgd2l0aCBhIHR5cGUgZXJyb3IpLgoKICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIFJlYWw7CiAgICAgICAgICAgICAgICAgUmVhbCBmb28oUmVhbCAoKm9wKShSZWFsLFJlYWwpLCBSZWFsIHgsIFJlYWwgeSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgIEluaGVyaXRhbmNlIG9mIHR5cGVzIGlzIGFsc28gaGFuZGxlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gY2xhc3Mgd3JhcHBlcnMuICAgV2hlbiBTV0lHIHNlZXMgdHdvIGNsYXNzZXMgbGlrZSB0aGlzLAogCiAgICAgICAgICAgY2xhc3MgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGNsYXNzIFkgOiBwdWJsaWMgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBiYXIoKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGl0IG5vdyBvbmx5IGdlbmVyYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnM6CiAKICAgICAgICAgICAgIFhfZm9vKFggKngpIHsgeC0+Zm9vKCk7IH0KICAgICAgICAgICAgIFlfYmFyKFkgKnkpIHsgeS0+YmFyKCk7IH0KIAogICAgICAgICAgIFVubGlrZSBTV0lHMS4xNSwgdGhlIGZvbygpIG1ldGhvZCBkb2VzICpub3QqIHByb3BhZ2F0ZSB0byBhIHdyYXBwZXIKICAgICAgICAgICBmdW5jdGlvbiBZX2ZvbygpLiBJbnN0ZWFkLCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgWF9mb28oKSBtdXN0IGJlCiAgICAgICAgICAgdXNlZC4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgbW9kdWxlcyB0aGF0IHVzZSBzaGFkb3cgY2xhc3NlcywgYnV0CiAgICAgICAgICAgaXQgbWlnaHQgYnJlYWsgbW9kdWxlcyB0aGF0IGRpcmVjdGx5IHVzZSB0aGUgbG93LWxldmVsIEMgd3JhcHBlcnMuCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSBmb3IgYSBudW1iZXIgb2YgcmVhc29uczoKCiAgICAgICAgICAgICAgIC0gIEl0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU1dJRy0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICB3aXRoIGFudGljaXBhdGVkIGZ1dHVyZSBjaGFuZ2VzIHN1Y2ggYXMgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgICAgLSAgSXQgcmVzdWx0cyBpbiBzdWJzdGFudGlhbGx5IGxlc3Mgd3JhcHBlciBjb2RlLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIGZvciBiaWcgQysrIGNsYXNzIGhpZXJhcmNoaWVzIChpbmhlcml0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAgIGFyZSBubyBsb25nZXIgY29waWVkIGludG8gZXZlcnkgc2luZ2xlIGRlcml2ZWQgY2xhc3MpLgoKICAgICAgICAgICAgICAgLSAgSXQgYWxsb3dzIGZvciBiZXR0ZXIgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIChjb2RlIGlzbid0IHJlcGxpY2F0ZWQgaW4KICAgICAgICAgICAgICAgICAgZXZlcnkgc2luZ2xlIG1vZHVsZSkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBQcm92aWRlZCBzb21lIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luIGRpcmVjdG9yeSBhbmQgc29tZQogICAgICAgICAgIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBmb3IgcnVubmluZyBleGFtcGxlcyBvbiBXaW5kb3dzLgoKOC8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSByZW5hbWVkIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHByb3Blcmx5OwoJICAgdGhhbmtzIHRvIE1hcmMgWm9uem9uIDxNYXJjLlpvbnpvbkB1bml2LXJlbm5lczEuZnI+IGZvciB0aGUKCSAgIHBhdGNoLiAgU2VlIHRoZSBuZXcgdGVzdCBjYXNlIG5hbWVfY3h4LgoKOC8yNy8yMDAxOiBta29lcHBlCgkgICBbVGNsXSBSZW1vdmVkIGxvdHMgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycywgd2hpY2ggd2VyZSBjYXVzZWQgYnkgbWl4aW5nIGZ1bmN0aW9uIHBvaW50ZXJzCgkgICBvZiBkaWZmZXJlbnQgbGlua2FnZXMgKEMrKy9DKS4gCgo4LzIzLzIwMDE6IG1rb2VwcGUKCSAgIEltcHJvdmVkIHRoZSBNelNjaGVtZSBtb2R1bGUgYnkgcG9ydGluZyBHdWlsZSdzIHBvaW50ZXIKCSAgIHR5cGUgY2hlY2tpbmcgc3lzdGVtIGFuZCBtYWtpbmcgdHlwZSBkaXNwYXRjaAoJICAgdHlwZW1hcC1kcml2ZW4uIAoKOC8yMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW50aXJlbHkgbmV3IHN5bWJvbCB0YWJsZSBwcm9jZXNzaW5nLiAgIFNXSUcgc2hvdWxkIGJlIGFibGUgdG8KICAgICAgICAgICByZXBvcnQgbXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG11bHRpcGxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgQWxzbywgdGhlIG5ldyBzeW1ib2wgdGFibGUgYWxsb3dzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucwogICAgICAgICAgIChhbHRob3VnaCBvdmVybG9hZGluZyBpc24ndCBxdWl0ZSBzdXBwb3J0ZWQgaW4gdGhlIGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcyB5ZXQpLgoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSAlbmV3IHN1cHBvcnQgYWRkZWQuCiAgICAgICAgICAgKiBbSmF2YV0gUGFja2FnZSBKTkkgbmFtZSByZWZpeGVkIQoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUHl0aG9uIG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IHBvaW50ZXJzIHRvIEMrKyBtZW1iZXJzLiAgVGhpcwogICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbGltaXRlZCBwYXJzaW5nIGFuZCBmdWxsIHR5cGUtc3lzdGVtIHN1cHBvcnQgZm9yIHBvaW50ZXJzIHRvCiAgICAgICAgICAgbWVtYmVycy4gTm9uZSBvZiBTV0lHJ3MgbGFuZ3VhZ2UgbW9kdWxlcyByZWFsbHkga25vdyBob3cgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgdGhpcyBzbyB0aGlzIGlzIHJlYWxseSBvbmx5IHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MgYW5kIGZ1dHVyZQogICAgICAgICAgIGV4cGFuc2lvbi4gIE5vdGU6IFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBwb2ludGVycyB0byBtZW1iZXJzIHdoaWNoIAogICAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHBvaW50ZXJzIHRvIG1lbWJlcnMsIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMgdG8gbWVtYmVycywKICAgICAgICAgICBvciBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgaXMgbXVjaCBiZXR0ZXIgYXQgcGFyc2luZyBjZXJ0YWluIEMrKyBkZWNsYXJhdGlvbnMuIE9wZXJhdG9ycyBhbmQKICAgICAgICAgICBmcmllbmRzIGdlbmVyYWxseSBkb24ndCBjYXVzZSBhbnltb3JlIHN5bnRheCBlcnJvcnMuICBIb3dldmVyLCBuZWl0aGVyCiAgICAgICAgICAgYXJlIHJlYWxseSBzdXBwb3J0ZWQuCgo4LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAqaGlnaGx5KiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgb2YgQysrCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zLiAgU2luY2UgQysrIHRlbXBsYXRlcyBhcmUgZXNzZW50aWFsbHkKICAgICAgICAgICBnbG9yaWZpZWQgbWFjcm9zIGFuZCBTV0lHIGhhcyBhIGZ1bGx5IG9wZXJhdGlvbmFsIEMgCiAgICAgICAgICAgcHJlcHJvY2Vzc29yIHdpdGggbWFjcm8gc3VwcG9ydCwgdGhlIHBhcnNlciBub3cgY29udmVydHMKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgdG8gbWFjcm9zLiAgRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KICAgICAgICAgICB0ZW1wbGF0ZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IFQgbWF4KFQgYSwgVCBiKTsKCiAgICAgICAgICAgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV9tYXgoX19uYW1lLFQpCiAgICAgICAgICAgICAgICVuYW1lKF9fbmFtZSkgVCBtYXgoVCBhLCBUIGIpOwogICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFRvIGluc3RhbnRpYXRlIGEgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUsIGEgc3BlY2lhbCAldGVtcGxhdGUgZGVjbGFyYXRpb24KICAgICAgICAgICBpcyB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47CgogICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSBwcm9wZXIgQyBpZGVudGlmaWVyIHRoYXQncwogICAgICAgICAgIHVzZWQgdG8gdW5pcXVlbHkgbmFtZSB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24uICAgV2hlbiB1c2VkLCB0aGUKICAgICAgICAgICB0aGUgZXhwYW5kZWQgbWFjcm8gbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlbmFtZShtYXhpbnQpIGludCBtYXgoaW50IGEsIGludCBiKTsKICAgICAgICAgICAgICAlbmFtZShtYXhkb3VibGUpIGRvdWJsZSBtYXgoZG91YmxlIGEsIGRvdWJsZSBiKTsKCiAgICAgICAgICAgQSBzaW1pbGFyIHRlY2huaXF1ZSBpcyB1c2VkIGZvciB0ZW1wbGF0ZSBjbGFzc2VzLiAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmVjdG9yKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgR2V0cyBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX3ZlY3RvcihfX25hbWUsIFQpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxUPiBfX25hbWU7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBfX25hbWUgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBfX25hbWUoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgX19uYW1lIHZlY3RvcjxUPjsKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBpcyBjcmVhdGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5OgoKICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWMpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBUaGUgcmVzdWx0aW5nIGNvZGUgcGFyc2VkIGJ5IFNXSUcgaXMgdGhlbjoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlYzsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIGludHZlYyB7CiAgICAgICAgICAgICAgICAgIGludCAqZGF0YTsKICAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50dmVjKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgICBpbnQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBpbnR2ZWMgdmVjdG9yPGludD47CgogICAgICAgICAgIE5vdGU6IHRoZSBsYXN0IHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkIEMgYW5kIGlzIHVzZWQgYnkgU1dJRyB0byBwcm92aWRlCiAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgbmFtZSAiaW50dmVjIiBhbmQgdGhlIHRlbXBsYXRlIHR5cGUgCiAgICAgICAgICAgInZlY3RvcjxpbnQ+Ii4KCiAgICAgICAgICAgQ0FVVElPTjogIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHRoZSBmaXJzdCB0aW1lIFNXSUcgaGFzCiAgICAgICAgICAgc3VwcG9ydGVkIEMrKyB0ZW1wbGF0ZXMuICAgRXJyb3IgcmVwb3J0aW5nIGlzIGVzc2VudGlhbCBub24tZXhpc3RlbnQuCiAgICAgICAgICAgSXQgd2lsbCBwcm9iYWJseSBicmVhayBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqKgoKOC8xNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHdyYXBwaW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEFycmF5cwogICAgICAgICAgIGFyZSBub3cgcHJvcGVybHkgbWFwcGVkIHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgogICAgICAgICAgIG9uZSBsZXNzIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBbMTBdOyAgICAgICAgICAgICAgLS0+ICBpbnQgKgogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdOyAgICAgICAgICAtLT4gIGludCAoKilbMjBdOwogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdWzMwXTsgICAgICAtLT4gIGludCAoKilbMjBdWzMwXTsKCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNlcnRhaW4gU1dJRyBleHRlbnNpb25zIGJlY2F1c2UKICAgICAgICAgICBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgbWFwcGVkIGFsbCBhcnJheXMgaW50byBhIHNpbmdsZQogICAgICAgICAgIHBvaW50ZXIgc3VjaCBhcyAiaW50ICoiLiAgIEFsdGhvdWdoIHBvc3NpYmx5IHVudXN1YWwsIAogICAgICAgICAgIHRoZSBuZXcgdmVyc2lvbiBpcyBjb3JyZWN0IGluIHRlcm1zIG9mIHRoZSBDIHR5cGUgc3lzdGVtLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gQXJyYXkgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIHN0cnVjdC9jbGFzcyBhcnJheSBtZW1iZXJzLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFueSBpbXByb3ZlbWVudHMgdG8gVGNsL1BlcmwvUHl0aG9uIG1vZHVsZXMgdG8gYmV0dGVyCiAgICAgICAgICAgd29yayB3aXRoIG11bHRpcGxlIGludGVyZmFjZSBmaWxlcyBhbmQgdGhlICVpbXBvcnQgZGlyZWN0aXZlLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIGJlaGF2aW9yIG9mICVpbXBvcnQgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgcG9sbHV0ZXMgdGhlIG1vZHVsZSBuYW1lc3BhY2UgYnkgdXNpbmcKICAgICAgICAgICAnZnJvbSBtb2R1bGUgaW1wb3J0IConIHRvIHJlZmVyIHRvIHRoZSBvdGhlciBtb2R1bGUuIAogICAgICAgICAgIEluc3RlYWQsIGl0IGRvZXMgYSBwcm9wZXIgJ2ltcG9ydCBtb2R1bGUnLiAgIEFsc28sIFNXSUcKICAgICAgICAgICBtYXkgd29yayBhIGxvdCBiZXR0ZXIgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyB0aGF0IGluY2x1ZGUKICAgICAgICAgICByZWZlcmVuY2VzIHRvIG90aGVyIGltcG9ydGVkIG1vZHVsZXMuCgo4LzEzLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIG5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxpemluZyB0aG9zZSBvZiB0aGUKCSAgIEd1aWxlLXNwZWNpZmljIDUvMjcvMjAwMSBjaGFuZ2VzOiAKCSAgICogJGRlc2NyaXB0b3IgaXMgdGhlIHNhbWUgYXMgU1dJR1RZUEUkbWFuZ2xlLCBidXQgYWxzbwoJICAgICBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGlzIG5hbWUgZ2V0cwoJICAgICBkZWZpbmVkLgoJICAgKiAkKnR5cGUsICQqbHR5cGUsICQqbWFuZ2xlLCAkKmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IHN0YXIsIGJ1dCB0aGV5IFJFTU9WRSBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgZnJvbSB0aGUgdHlwZS4gKFRoaXMgaXMgb25seSB2YWxpZCBmb3IgcG9pbnRlciAKCSAgICAgdHlwZXMuKQoJICAgKiAkJnR5cGUsICQmbHR5cGUsICQmbWFuZ2xlLCAkJmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IGFtcGVyc2FuZCwgYnV0IHRoZXkgQUREIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyB0byB0aGUgdHlwZS4KCSAgIFRoZSBHdWlsZS1zcGVjaWZpYyBzdWJzdGl0dXRpb24gJGJhc2VkZXNjcmlwdG9yIHdhcyByZW1vdmVkCgkgICBiZWNhdXNlIGl0IHdhcyB1c2VsZXNzLgoKOC8xMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVleHRlcm4gZGlyZWN0aXZlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCB3aXRoZHJhd24uICBUaGUKICAgICAgICAgICBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyB0byBpbXBvcnQgc2VsZWN0ZWQgZGVmaW5pdGlvbnMKICAgICAgICAgICBmcm9tIG90aGVyIGludGVyZmFjZSBmaWxlcyBhbmQgaGVhZGVycy4gIEhvd2V2ZXIsIHRoZSBzYW1lCiAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoICVpbXBvcnQuICAgVGhpcwogICAgICAgICAgIGxlYXZlcyBTV0lHIHdpdGggdHdvIGZpbGUgaW5jbHVzaW9uIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVpbmNsdWRlIGZpbGVuYW1lICAgICAtIEluc2VydHMgaW50byBjdXJyZW50IGludGVyZmFjZQogICAgICAgICAgICAgICVpbXBvcnQgZmlsZW5hbWUgICAgICAtIEltcG9ydCB0eXBlcyBhbmQgY2xhc3NlcyBmcm9tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kdWxlCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbmV3IHN1cHBvcnQgZm9yIHdyYXBwaW5nIEMvQysrIGNhbGxiYWNrIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgQSBjb21tb24gcHJvYmxlbSB3aXRoIHNvbWUgQyBsaWJyYXJpZXMgaXMgdGhhdCBtYW55CiAgICAgICAgICAgZnVuY3Rpb25zIHRha2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgaW50ICgqb3ApKGludCxpbnQpLCAuLi4pOwoKICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSB3YXkgdG8gY2FsbCBzdWNoIGEgZnVuY3Rpb24gaXMgdG8KICAgICAgICAgICBwYXNzIGl0IGEgZnVuY3Rpb24gcG9pbnRlciBvZiBzb21lIGNvbXBhdGlibGUgdHlwZS4gIEluCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgeW91IGhhZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0KICAgICAgICAgICB3aXRoIHNvbWUgcmVhbGx5IGdyb3NzIGhhY2tzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrLAoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsIGludCk7CgogICAgICAgICAgIHlvdSBoYWQgdG8gaW5zdGFsbCBhIHBvaW50ZXIgdG8gaXQgYXMgYSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIAoKICAgICAgICAgICAgICAgY29uc3QgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgaWYgeW91IGhhZCBhIHJlYWxseSBvbGQgU1dJRyB2ZXJzaW9uOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpPUF9GVU5DKShpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgT1BfRlVOQywgLi4uKTsKICAgICAgICAgICAgICAgY29uc3QgT1BfRlVOQyBGT08gPSBmb287CgogICAgICAgICAgIAogICAgICAgICAgIE5vdywgeW91IGNhbiBkbyBvbmUgb2YgdHdvIHRoaW5nczoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgZm9vKGludCxpbnQpOwoKICAgICAgICAgICBUaGlzIGNyZWF0ZXMgYSBjb25zdGFudCAnZm9vJyBvZiB0eXBlIGludCAoKikoaW50LGludCkuCiAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgYXMgY29uc3RhbnRzIHdoZXJlCiAgICAgICAgICAgdGhlIG5hbWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbiB0byAlY2FsbGJhY2soKS4KICAgICAgICAgICBJZiB0aGUgbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGRpZmZlciBmcm9tIHRoZQogICAgICAgICAgIGFjdHVhbCBmdW5jdGlvbiBuYW1lLCBib3RoIGEgZnVuY3Rpb24gd3JhcHBlciBhbmQgYSBjYWxsYmFjayAKICAgICAgICAgICBjb25zdGFudCBhcmUgY3JlYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlKHVwcGVyKXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge30KCSAgICAgflRlc3RDbGFzcygpIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fQoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VycmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8zLzAwICA6IHR0bgogICAgICAgICAgQWRkZWQgaW5zdHJ1Y3Rpb25zIGZvciBtYWludGFpbmVycyBpbiBFeGFtcGxlcy9SRUFETUUgb24gaG93CiAgICAgICAgICB0byBtYWtlIGV4YW1wbGVzIGFsc28gYmUgdXNlZnVsIGluIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgIEFsc28sICJtYWtlIGNoZWNrIiBub3cgdXNlcyAuL0xpYiBieSB2aWEgZW52IHZhciBgU1dJR19MSUInLgogICAgICAgICAgVGhpcyBpcyBvdmVycmlkYWJsZSBsaWtlIHNvOgogICAgICAgICAgICAgbWFrZSBjaGstc3dpZ2xpYj0vbXkvZXhwZXJpbWVudGFsL3N3aWcvTGliIGNoZWNrCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQWRkZWQgJHR5cGVtYXAgdmFyaWFibGUgdG8gdHlwZW1hcHMuICBUaGlzIGdldHMgcmVwbGFjZWQgd2l0aAogICAgICAgICAgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZW1hcCB0aGF0IGlzIGFwcGxpZWQuICBGZWF0dXJlCiAgICAgICAgICByZXF1ZXN0IGZyb20gcnNhbHouCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGltaXphdGlvbiB0byBjb2RlIGdlbmVyYXRpb24gZm9yIHZpcnR1YWwKICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSB0d28gY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEEoKSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBjbGFzcyBCKCkgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFN3aWcgbm93IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpcwoKICAgICAgICAgICAgICAgIEFfZm9vKEEgKmEpIHsKICAgICAgICAgICAgICAgICAgICBhLT5mb28oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBhbmQgdXNlIGl0IGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEFfZm9vKCkgYW5kIEJfZm9vKCkuCiAgICAgICAgICBUaGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGlmIGJvdGggbWV0aG9kcyBhcmUgZGVjbGFyZWQKICAgICAgICAgIGFzIHZpcnR1YWwgYW5kIGJvdGggdGFrZSBpZGVudGljYWwgcGFyYW1ldGVycy4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZXN0b3JlZCB0aGUgIm1lbWJlcmluIiB0eXBlbWFwIGZvciBzZXR0aW5nIHN0cnVjdHVyZSBtZW1iZXJzLgogICAgICAgICAgVW5saWtlIHRoZSBvbGQgdmVyc2lvbiwgdGhlIG5ldyB2ZXJzaW9uIGlzIGV4cGFuZGVkIGlubGluZSBpbiB0aGUKICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb24gYWxsb3dpbmcgYWNjZXNzIHRvIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgaW50ZXJuYWxzIChhIHNvbWV0aW1lcyByZXF1ZXN0ZWQgZmVhdHVyZSkuIFRoZSAibWVtYmVyb3V0IiB0eXBlbWFwCiAgICAgICAgICBpcyBnb25lLiBVc2UgdGhlICJvdXQiIHR5cGVtYXBzIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgc2V0IG1ldGhvZHMgbm8gbG9uZ2VyIHJldHVybiB0aGUgdmFsdWUgb2YgYSBtZW1iZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgbm93IGdldHMgc2V0IGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHZvaWQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgICBmLT54ID0geDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gU1dJRzEuMSBpdCB1c2VkIHRvIGJlIHRoaXM6CgogICAgICAgICAgICAgIGludCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLT54ID0geCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgY3JlYXRlZCBieSB0cnlpbmcKICAgICAgICAgIHRvIGRvIHRoaXMgd2l0aCBtb3JlIGV4b3RpYyBkYXRhdHlwZXMgc3VjaCBhcyBhcnJheXMuICBJdCBhbHNvCiAgICAgICAgICBjb21wbGljYXRlcyBpbmxpbmluZyBhbmQgaGFuZGxpbmcgb2YgdGhlICJtZW1iZXJpbiIgdHlwZW1hcC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIHB0cmNhc3QoKSBhbmQgcHRybWFwKCkgZnVuY3Rpb25zIGZyb20gdGhlCiAgICAgICAgICBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgT2xkIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGF0aWJsZQogICAgICAgICAgd2l0aCBuZXcgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVRdWVyeShjb25zdCBjaGFyICpuYW1lKSBhZGRlZC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgdHlwZSBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgdGhhdCBpcyB1c2VkIGZvciB0eXBlLWNoZWNraW5nLiAgSXQgd29ya3Mgd2l0aCBlaXRoZXIgdGhlCiAgICAgICAgICBuaWNlIEMgbmFtZSBvciBtYW5nbGVkIHZlcnNpb24gb2YgYSBkYXRhdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiaW50ICoiKTsKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiX3BfaW50Iik7CgogICAgICAgICAgVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzb21lCiAgICAgICAgICBleG90aWMgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUKICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZSBvYmplY3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBkaXJlY3RpdmUgJXR5cGVzKCkgYWRkZWQuICBUaGlzIGlzIHVzZWQgdG8KICAgICAgICAgIGV4cGxpY2l0bHkgbGlzdCBkYXRhdHlwZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4KICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUtY2hlY2tpbmcgY29kZS4gTm9ybWFsbHkgaXQgaXMgbmV2ZXIKICAgICAgICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBidXQgc29tZXRpbWVzIGFkdmFuY2VkIGV4dGVuc2lvbnMKICAgICAgICAgIChzdWNoIGFzIHRoZSBwb2ludGVyLmkgbGlicmFyeSkgbWF5IG5lZWQgdG8gbWFudWFsbHkKICAgICAgICAgIGFkZCB0eXBlcyB0byB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIHN0cmluZyBhcnJheSB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAogICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhlIGZvcm0gImNoYXIgbmFtZVs2NF0iIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIG1hbmFnZWQgYXMgYSA2NCBjaGFyYWN0ZXIgc3RyaW5nLiAgUHJldmlvdXNseSB0aGlzIGRpZG4ndAogICAgICAgICAgd29yayBhdCBhbGwgb3IgcmVxdWlyZWQgdGhlIHVzZSBvZiBhIHNwZWNpYWwgdHlwZW1hcC4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAoVGNsLCBQZXJsLCBQeXRob24pICoqKgoKOC8zMS8wMCA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgYGNoZWNrLWMrKy1leGFtcGxlcycsIHdoaWNoIHVzZXMgbmV3CgkgIGZpbGVzIHVuZGVyIEV4YW1wbGVzL0MrKyBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLiAgTm93ICJtYWtlCgkgIGNoZWNrIiBhbHNvIGRvZXMgIm1ha2UgY2hlY2stYysrLWV4YW1wbGVzIi4gIEFsc28sIGV4cGFuZGVkCgkgIGFjdGlvbnMgaW4gYGNoZWNrLWdpZnBsb3QtZXhhbXBsZScgYW5kIGBjaGVjay1hbGl2ZW5lc3MnLgoKOC8zMC8wMCA6IG1rb2VwcGUKCSAgTWFqb3IgY2xlYW4tdXAgaW4gdGhlIEd1aWxlIG1vZHVsZS4gQWRkZWQgdHlwZW1hcC1kcml2ZW4KCSAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIENoYW5nZWQgdG8gaGFuZGxlIG1vcmUgdGhhbiAxMAoJICBhcmdzLiBVcGRhdGVkIGFuZCBleHRlbmRlZCBleGFtcGxlcy4KCSAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlaW5zZXJ0IGRpcmVjdGl2ZSB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAgICAgICAgaW50byBhIHBvcnRpb24gb2YgdGhlIG91dHB1dCB3cmFwcGVyIGZpbGUuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKICAgICAgICAgIGZvciB1c2UgYnkgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV29ya3MgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVycykgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQocnVudGltZSkgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQod3JhcHBlcnMpICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQoaW5pdCkgICAgICJmaWxlLnN3ZyI7CgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlcnVudGltZSBkaXJlY3RpdmUgd2hpY2ggaW5jbHVkZXMgY29kZSBpbnRvIHRoZSBydW50aW1lCiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcnVudGltZSAlewogICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGludGVybmFsIHJ1bnRpbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgIFRoZXJlIGlzIG5vIHByYWN0aWNhbCByZWFzb24gZm9yIG9yZGluYXJ5IHVzZXJzIHRvIHVzZSB0aGlzCiAgICAgICAgICBmZWF0dXJlIChhbG1vc3QgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB1c2luZyAleyAuLi4gJX0KICAgICAgICAgIGluc3RlYWQpLiAgIEhvd2V2ZXIsIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkgd2FudCB0bwogICAgICAgICAgdXNlIHRoaXMgaW4gbGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBmaWxlcy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBjYW4gbm93IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmcgbGl0ZXJhbHMgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAiJHRhcmdldCA9IFN2SVYoJHNvdXJjZSk7IgoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWxseSBjb21waWxlIGV4cGVyaW1lbnRhbCBjb2RlIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudAoJICBjb25maWd1cmUgZmxhZy4KCSAgRml4IC5jdnNpZ25vcmUgdG8gaWdub3JlIGNvbmZpZ3VyZSAmIHlhY2MgZ2VuZXJhdGVkIGZpbGVzCgoxLzI4LzAwIDogbG9pYwoJICBBcHBseSBhdXRvbWFrZSBldmVyeXdoZXJlCgkgIEtlZXAgY29uZmlndXJlIHNjcmlwdHMgc28gdGhhdCBwZW9wbGUgYXJlIG5vdCAqZm9yY2VkKiB0byBhdXRvY29uZgogICAgICAgICAgS2VlcCBzb3VyY2VzIGdlbmVyYXRlZCBieSB5YWNjIHNvIHRoYXQgY29tcGlsYXRpb24gd2l0aG91dCB5YWNjCgkgIGlzIHBvc3NpYmxlLgoJICBTb3VyY2UvTFBhcnNlL2NzY2FubmVyLmM6IGNoYW5nZSBseWFjYy5oIGludG8gcGFyc2VyLmggdG8gcGxlYXNlCgkgIGRlZmF1bHQgeWFjYyBnZW5lcmF0aW9uIHJ1bGVzLgoJICBVc2UgQUNfQ09ORklHX1NVQkRJUlMgaW4gY29uZmlndXJlLmluIGluc3RlYWQgb2YgaGFuZCBtYWRlIHNjcmlwdC4KCSAgVXBkYXRlIGFsbCByZWxldmFudCAuY3ZzaWdub3JlIHRvIGluY2x1ZGUgLmRlcHMKCSAgRml4ZWQgbWlzc2luZyA7IGxpbmUgMTM2IFNvdXJjZS9Td2lnL3N3aWcuaAoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1pbm9yIGVuZC1vZi1maWxlIHBhcnNpbmcgcHJvYmxlbXMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWZyZWV6ZSBvcHRpb24gdGhhdCBmb3JjZXMgU1dJRyB0byBmcmVlemUgdXBvbiBleGl0LgogICAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBkZWJ1Z2dpbmcgdG9vbCBzbyB0aGF0IEkgY2FuIG1vcmUKICAgICAgICAgIGVhc2lseSBleGFtaW5lIFNXSUcncyBtZW1vcnkgZm9vdHByaW50LgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIGd1aWxlIG1vZHVsZSBmb3Igc3VwcG9ydGluZyBvcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERpZXRlciBCYXJvbi4KCjEvMTMvMDAgOiBsb2ljCgkgIEFkZGVkIC5jdnNpZ25vcmUsIEV4YW1wbGVzLy5jdnNpZ25vcmUsIFNvdXJjZS9ET0gvRG9oLy5jdnNpZ25vcmUKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IEZpeGVkIC1JIGhhbmRsaW5nIGJ1ZwoJICBTb3VyY2UvTW9kdWxlczEuMS9qYXZhLmN4eDogZml4ZWQgY2hhciogLT4gY29uc3QgY2hhciogd2FybmluZ3MgdGhhdCBhcmUKCSAgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHdpdGggZ2NjLTIuOTUuMgoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogY2FzdCBjb25zdCBjaGFyKiB0byBjaGFyKiBmb3IgU3RyaW5nX3JlcGxhY2UKCSAgdG9rZW4gYW5kIHJlcCBzaG91bGQgcmVhbGx5IGJlIGNvbnN0LgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIEhhcmNvJ3MgSmF2YSBtb2R1bGVzLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJldm9rZWQgdGhlICVpZmRlZiwgJWlmbmRlZiwgJWVuZGlmLCAlaWYsICVlbGlmLCBhbmQgJWVsc2UKICAgICAgICAgIGRpcmVjdGl2ZXMuICBUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBhcyBTV0lHIG5vdyBoYXMgYSByZWFsCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGZyb20gdGhlIFNXSUcgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgTW9kdWxlcyBkaXJlY3RvcnkgKHdoZXJlIHRoZXkgcmVhbGx5IHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgIHRvIGJlZ2luIHdpdGgpLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1zdGF0IG9wdGlvbiBmb3IgcHJpbnRpbmcgc3RhdGlzdGljcy4gVGhlCiAgICAgICAgICBzdGF0aXN0aWNzIHJlcG9ydGluZyB3YXMgaW5hZGVxdWF0ZSBhbmQgbW9zdGx5IGJyb2tlbgogICAgICAgICAgYW55d2F5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXQgb3B0aW9uIGZvciByZWFkaW5nIGEgdHlwZW1hcCBmaWxlLiAgTW9yZQogICAgICAgICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguICBKdXN0IGluY2x1ZGUgdHlwZW1hcHMgYXQgdGhlIHRvcAogICAgICAgICAgb2YgdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgJWNoZWNrb3V0IGRpcmVjdGl2ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1jaSBvcHRpb24gZm9yIGZpbGUgY2hlY2tpbi4gICBUb28gcHJvYmxlbWF0aWMKICAgICAgICAgIHRvIGltcGxlbWVudC4gIFByb2JhYmx5IGJldHRlciB0byBqdXN0IHB1dCB5b3VyIFNXSUcgbGlicmFyeQogICAgICAgICAgdW5kZXIgQ1ZTIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgRGVsZXRlZCB0aGUgTEFURVggbW9kdWxlLiAgU29ycnkuLi4gRGlkbid0IGtub3cgYW55b25lCiAgICAgICAgICB3aG8gd2FzIHVzaW5nIGl0LiAgQmVzaWRlcywgSSdtIGxvb2tpbmcgdG8gc2ltcGxpZnkKICAgICAgICAgIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uIG1vZHVsZSB0byB1c2UgYSAudHh0CiAgICAgICAgICBzdWZmaXggZm9yIGl0cyBvdXRwdXQgZmlsZSBpbnN0ZWFkIG9mIC5kb2MuCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGxvbmctbG9zdCBTV0lHIHByZXByb2Nlc3NvciBiYWNrIHRvIHRoZSBzeXN0ZW0uCiAgICAgICAgICBJdCBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgUmF3IHByZXByb2Nlc3NlZCBvdXRwdXQKICAgICAgICAgIGNhbiBiZSB2aWV3ZWQgdXNpbmcgc3dpZyAtRSBmaWxlLmkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxLzExLzAwIDogYmVhemxleSBhbmQgZGptaXRjaGUKICAgICAgICAgIENvbXBsZXRlbHkgcmVvcmdhbml6ZWQgdGhlIFNXSUcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gIFRoZQogICAgICAgICAgYmFzaWMgb3JnYW5pemF0aW9uIGlzIG5vdzoKCiAgICAgICAgICAgICAgICBTb3VyY2UvICAgICAgICAgU1dJRyBzb3VyY2UgY29kZQogICAgICAgICAgICAgICAgTGliLyAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyAoc3dpZ19saWIpCiAgICAgICAgICAgICAgICBEb2MvICAgICAgICAgICAgRG9jdW1lbnRhdGlvbgogICAgICAgICAgICAgICAgRXhhbXBsZXMvICAgICAgIEV4YW1wbGVzCgogICAgICAgICAgTW9yZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KCjEyLzA4Lzk5OiBMb2ljIERhY2hhcnkgKGxvaWNAc2VuZ2Eub3JnKQoJICBFbmhhbmNlZCBwYWNrYWdlIGhhbmRsaW5nIGZvciBwZXJsNSBhbmQgYysrLgoKCSAgV2l0aCBuZXcgb3B0aW9uIC1oaWRlIEZvbzo6QmFyLCBldmVyeSBwZXJsNSBvYmplY3QgKEZyb2IpIGlzCgkgIHF1YWxpZmllZCBieSBGb286OkJhcjo6RnJvYi4gVGhlIHBhY2thZ2UgbmFtZSBpcyBzb2xlbHkgdXNlZAoJICB0byBlbmNhcHN1bGF0ZSBDL0MrKyB3cmFwcGVycyBvdXRwdXQgaW4gPG1vZHVsZT5fd3JhcC5jIGFuZCB0aGUKCSAgY29ycmVzcG9uZGluZyBwZXJsIHBhY2thZ2UgaW4gPG1vZHVsZT4ucG0uIE5vdGUgdGhhdCBhIHBhY2thZ2UKCSAgbmFtZSBtYXkgY29udGFpbiA6OiAoRnJvYjo6Tml0eikgYW5kIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlCgkgIHBhY2thZ2UgbmFtZSBwcm92aWRlZCBieSAtaGlkZSAoRm9vOjpCYXI6OkZyb2I6Ok5pdHopLgoKCSAgSW4gKl93cmFwLmMsIFNXSUdfaW5pdCBtYWNybyBpcyB1c2VkLiBXYXMgcHJldmlvdXNseSBkZWZpbmVkCgkgIGJ1dCBub3QgdXNlZCBhbmQgc2ltcGxpZmllcyBjb2RlLgoKCSAgQWRkZWQgdHlwZW1hcChwZXJsNSxwZXJsNWluKSBhbmQgdHlwZW1hcChwZXJsNSxwZXJsNW91dCkgdGhhdAoJICBkbyB0aGUgZXF1aXZhbGVudCBvZiB0eXBlbWFwKHBlcmw1LGluKSBhbmQgdHlwZW1hcChwZXJsNSxvdXQpCgkgIGJ1dCBjb250YWluIHBlcmwgY29kZSBhbmQgYXBwbGllcyB0byB3cmFwcGVycyBnZW5lcmF0ZWQgYnkKCSAgLXNoYWRvdy4KCgkgIExhY2tpbmcgcHJvcGVyIHJlZ3Jlc3Npb24gdGVzdHMgSSB1c2VkCgkgIEV4YW1wbGVzL3Blcmw1L3tjKyssY29uc3RyYWludCxkZWZhcmcsZXhjZXB0LAoJICBncmFwaC9ncmFwaFsxMjM0XSxtdWx0aW5oZXJpdCxuZXN0ZWQsc2hhZG93LHNpbXBsZSx0cmVlLAoJICB0eXBlbWFwcy97YXJndixhcmd2MixhcnJheW1lbWJlcixkYXRhYmFzZSxmaWxlLGlnbm9yZSxpbnRlZ2VyLAoJICBvdXRwdXQscGFzc3JlZixyZWZlcmVuY2UscmV0dXJufX0vLiBJIHJhbiBzd2lnIHdpdGggYW5kIHdpdGhvdXQKCSAgdGhlIHBhdGNoZXMsIGRpZmYgdGhlIGdlbmVyYXRlZHNvdXJjZXMsIHJ1biB0aGUgLnBsIGZpbGVzCgkgIGFuZCBjaGVja2VkIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGlkZW50aWNhbC4gSW4gYWxsIHRob3NlIGV4YW1wbGVzCgkgIEkgaGFkIG5vIGVycm9yLgoKMTEvMjEvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHByb3ZpZGUgZnVsbCB2YXJpYWJsZSBsaW5raW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgdG8gYWxsIGRhdGF0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgd2VyZSBjcmVhdGVkIGZvciBkYXRhdHlwZXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIFRjbF9MaW5rVmFyKCkgZnVuY3Rpb24uCiAgICAgICAgICBOb3csIHdlIHNpbXBseSB1c2UgdmFyaWFibGUgdHJhY2VzIHRvIHN1cHBvcnQgZXZlcnl0aGluZy4gVGhpcyBtYXkKICAgICAgICAgIGJyZWFrIHNjcmlwdHMgdGhhdCByZWx5IHVwb24gdGhlIG9sZGVyIGJlaGF2aW9yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS85OTogQWRkZWQgc2xpZ2h0IHR3ZWFrIHRvIHdyYXBwZXIgZ2VuZXJhdG9yIHRvIGNvbGxlY3QgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICBvZiBzaW1pbGFyIHR5cGUuICBQcm9kdWNlcyBzb21ld2hhdCBtb3JlIGNvbXBhY3Qgd3JhcHBlciBjb2RlLgoKMTEvMjAvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHVzZSBTV0lHX0dldEFyZ3MoKSB0byBwYXJzZQogICAgICAgICAgYXJndW1lbnRzLiAgICBUaGlzIGlzIGEgdGVjaG5pcXVlIGJvcnJvd2VkIGZyb20gUHl0aG9uIGluIHdoaWNoCiAgICAgICAgICBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB1c2luZyBhIGZvcm1hdCBzdHJpbmcgY29udmVudGlvbiBzaW1pbGlhcgogICAgICAgICAgdG8gZnByaW50ZigpLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpzdWJzdGFudGlhbCogcmVkdWN0aW9uIGluIHRoZQogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSB3aXRoIG9ubHkgYSBtb2Rlc3QgcnVudGltZSBvdmVyaGVhZAogICAgICAgICAgaW4gZ29pbmcgdGhyb3VnaCB0aGUgZXh0cmEgY29udmVyc2lvbiBmdW5jdGlvbi4KCjExLzEzLzk5OiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIGNsYXNzL3N0cnVjdHVyZSBnZW5lcmF0aW9uIGNvZGUgZm9yIHRoZQogICAgICAgICAgVGNsIG1vZHVsZS4gIE5vdywgYSBzbWFsbCBzZXQgb2YgcnVudGltZSBmdW5jdGlvbnMgYXJlIHVzZWQKICAgICAgICAgIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIGNsYXNzZXMgKGluc3RlYWQgb2YgYQogICAgICAgICAgbWFzc2l2ZSBhbW91bnQgb2YgcnVudGltZSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBmb3IgZWFjaCBjbGFzcykuCiAgICAgICAgICBDbGFzcyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBzaW1wbHkgZW5jb2RlZCBpbiBhIHNlcmllcyBvZgogICAgICAgICAgc3RhdGljIHRhYmxlcy4gICBUaGlzIHJlc3VsdHMgaW4gYSAqSFVHRSogcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS0tZXNwZWNpYWxseSBmb3IgQysrLgoKMTEvMTMvOTk6IFJlbW92ZWQgdGhlIC10Y2wgKFRjbCA3LngpIG1vZHVsZS4gIFRjbCA4LjAgaXMgbm93IHNldmVyYWwKICAgICAgICAgIHllYXJzIG9sZCBhbmQgdGhlIGRlZmFjdG8gc3RhbmRhcmQtLW5vIHJlYWwgcmVhc29uIHRvIGtlZXAKICAgICAgICAgIHN1cHBvcnRpbmcgdGhlIG9sZCB2ZXJzaW9uIGF0IHRoaXMgcG9pbnQuCgoxMS8xMy85OTogQ2xlYW5lZCB1cCAtYyBvcHRpb24gZm9yIFB5dGhvbiBtb2R1bGUuICBUaGUgcHlleHAuc3dnIGZpbGUKICAgICAgICAgIGlzIG5vdyBnb25lLgoKMTEvMTMvOTk6IEZpeGVkIGV4dGVybmFsIGRlY2xhcmF0aW9ucyB0byB3b3JrIGJldHRlciB3aXRoIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvbiBXaW5kb3dzLiAgU3RhdGljIGxpbmtpbmcgc2hvdWxkIG5vdyBiZSBwb3NzaWJsZSBieSBkZWZpbmluZwogICAgICAgICAgdGhlIC1EU1RBVElDX0xJTksgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgQWxiZXJ0byBGb25zZWNhLgoKMTEvNS85OSA6IEZpeGVkIGFuIG9ic2N1cmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyByZWxhdGVkIHRvIHRoZSBnZW5lcmF0aW9uCiAgICAgICAgICBvZiBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gICBCdWcgcmVwb3J0ZWQgYnkgQnJhZCBDbGVtZW50cy4KCjExLzUvOTkgOiBGaXhlZCBhIGZldyBtZW1vcnkgcHJvYmxlbXMgZm91bmQgYnkgcHVyaWZ5LgoKMTEvNS85OSA6IE9mZmljaWFsbHkgZGVwcmVjYXRlZCB0aGUgLWh0Y2wsIC1odGssIGFuZCAtcGx1Z2luIG9wdGlvbnMKICAgICAgICAgIGZyb20gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMTAvMjYvOTk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGZyb20gcHl0aG9uL3R5cGVtYXBzLmkuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgS2VpdGggRGF2aWRzb24uCgo4LzE2Lzk5IDogQWRkZWQgX1dJTjMyIHN5bWJvbCB0byBsaWJyYXJpZXMgdG8gYmV0dGVyIHN1cHBvcnQgV2luZG93cy4KCjgvMTYvOTkgOiBEZXByZWNhdGVkIHRoZSBQZXJsNCBtb2R1bGUuICAgSXQgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHRoZQogICAgICAgICAgZGlzdHJpYnV0aW9uIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLiAgSW4gdGhlIGVudGlyZSAzIHllYXJzIFNXSUcKICAgICAgICAgIGhhcyBiZWVuIGFyb3VuZCBJIG5ldmVyIHJlY2VpdmVkIGEgc2luZ2xlIGNvbW1lbnQgYWJvdXQgaXQgc28gSSdtCiAgICAgICAgICBhc3N1bWluZyBubyBvbmUgd2lsbCBtaXNzIGl0Li4uCgo4LzE2Lzk5IDogTW9kaWZpZWQgdGhlIHR5cGUtY2hlY2tpbmcgY29kZSB0byByZWdpc3RlciB0eXBlIG1hcHBpbmdzIHVzaW5nIGEKICAgICAgICAgIHRhYmxlIGluc3RlYWQgb2YgcmVwZWF0ZWQgY2FsbHMgdG8gU1dJR19SZWdpc3Rlck1hcHBpbmcoKS4gIFRoaXMKICAgICAgICAgIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzb21ld2hhdC4KCjgvMTUvOTkgOiBDbGVhbmVkIHVwIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tpbmcgY29kZSBpbiB0aGUgVGNsIG1vZHVsZS4KCjgvMTUvOTkgOiBNYW55IGNoYW5nZXMgdG8gdGhlIGxpYnJhcmllcyB0byBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzLgoKOC8xMy85OSA6IEVsaW1pbmF0ZWQgQysrIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgZXh0ZXJuICJDIiBsaW5rYWdlLgoKOC8xMy85OSA6IFNvbWUgY2xlYW51cCBvZiBQeXRob24gLnN3ZyBmaWxlcyB0byBiZXR0ZXIgc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgb24gV2luZG93cy4KCjgvMTMvOTkgOiBNb2RpZmllZCB0aGUgJXByYWdtYSBkaXJlY3RpdmUgdG8gYXR0YWNoIHByYWdtYXMgZGVjbGFyZWQgaW5zaWRlCiAgICAgICAgICBhIGNsYXNzIGRlZmluaXRpb24gdG8gdGhlIGNsYXNzIGl0c2VsZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICVwcmFnbWEocHl0aG9uKSBhZGR0b21ldGhvZCA9ICJpbnNlcnQ6cHJpbnQgYGhlbGxvIHdvcmxkJyIKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaG93IHRoaXMgd29ya3MuICBGb3IgcGVvcGxlCiAgICAgICAgICB3cml0aW5nIGJhY2tlbmQgbW9kdWxlcywgY2xhc3MtYmFzZWQgcHJhZ21hcyB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX29wZW5fY2xhc3MoKSAgICAgICAgICAgICAvLyBPcGVuIGEgY2xhc3MKICAgICAgICAgICAgICBsYW5nLT5jcHBfcHJhZ21hKCkgICAgICAgICAgICAgICAgIC8vIFN1cHBseSBwcmFnbWFzCiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IG1lbWJlcnMKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX2Nsb3NlX2NsYXNzKCkgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY2xhc3MKCiAgICAgICAgICBBbGwgb2YgdGhlIHByYWdtYXMgYXJlIHBhc3NlZCBmaXJzdCBzaW5jZSB0aGV5IG1pZ2h0IGJlIHVzZWQgdG8KICAgICAgICAgIGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIG90aGVyIG1lbWJlcnMuICAgUGxlYXNlIHNlZQogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUgZm9yIGFuIGV4YW1wbGUuICAgUGF0Y2hlcyBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTMvOTkgOiBQYXRjaCB0byBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gZWxpbWluYXRlIGlnbm9yZWQKICAgICAgICAgIGV4Y2VwdGlvbiBlcnJvcnMgaW4gZGVzdHJ1Y3RvcnMuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTEvOTkgOiBNaW5vciBwYXRjaCB0byBzd2lnX2xpYi9weXRob24vc3dpZ3B0ci5zd2cgIChhZGRlZCBTV0lHU1RBVElDCiAgICAgICAgICBkZWNsYXJhdGlvbikuICBQYXRjaCBjb250cmlidXRlZCBieSBMeWxlIEpvaG5zb24uCgo4LzExLzk5IDogQWRkZWQgRklSU1RLRVkvTkVYVEtFWSBtZXRob2RzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgo4LzExLzk5IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIHJldHVybmVkCiAgICAgICAgICBhbmQgcGFzc2VkIGFzICdOb25lLicgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuCgo4LzEwLzk5IDogRml4ZWQgbWlzc2luZyAnaW50JyBzcGVjaWZpZXJzIGluIHZhcmlvdXMgcGxhY2VzLgoKOC8xMC85OSA6IEFkZGVkIFdpbmRvd3MgbWFrZWZpbGUgZm9yIFJ1bnRpbWUgbGlicmFyaWVzLiAgQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEJvYiBUZWNoZW50aW4uCgo4LzEwLzk5IDogRml4ZWQgbWlub3IgcHJvYmxlbSBpbiBQeXRob24gcnVudGltZSBtYWtlZmlsZSBpbnRyb2R1Y2VkCiAgICAgICAgICBieSBrZXl3b3JkIGFyZ3VtZW50cy4KCjgvOC85OSAgOiBDaGFuZ2VkICR0YXJnZXQgb2YgcGVybDUob3V0KSB0eXBlbWFwIGZyb20gU1QoMCkgdG8KICAgICAgICAgIFNUKGFyZ3ZpKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogRml4ZWQgYnVnIGluIHR5cGVtYXAgY2hlY2tpbmcgcmVsYXRlZCB0byB0aGUgQU5ZIGtleXdvcmQKICAgICAgICAgIGluIGFycmF5cyBhbmQgaWdub3JlZCBhcmd1bWVudHMuICBFcnJvciByZXBvcnRlZCBieQogICAgICAgICAgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiAlZW5hYmxlZG9jIGFuZCAlZGlzYWJsZWRvYyBkaXJlY3RpdmVzIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgaW5zaWRlIGNsYXNzL3N0cnVjdHVyZSBkZWZpbml0aW9ucy4gICBIb3dldmVyLCBubyBjaGVjawogICAgICAgICAgaXMgbWFkZSB0byBzZWUgaWYgdGhleSBhcmUgYmFsYW5jZWQgKGkuZS4sIGEgJWRpc2FibGVkb2MKICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBkb2VzIG5vdCBoYXZlIHRvIGhhdmUgYSBtYXRjaGluZwogICAgICAgICAgJWVuYWJsZWRvYyBpbiB0aGUgc2FtZSBjbGFzcykuCgo4LzgvOTkgIDogS2V5d29yZCBhcmd1bWVudCBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkIGluIHRoZSBQeXRob24KICAgICAgICAgIG1vZHVsZS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oY2hhciAqYmFyLCBpbnQgc3BhbSwgZG91YmxlIHgpOwoKICAgICAgICAgIENhbiBiZSBjYWxsZWQgZnJvbSBQeXRob24gYXMKCiAgICAgICAgICAgICAgIGZvbyh4ID0gMy40LCBiYXI9ImhlbGxvIiwgc3BhbT00MikKCiAgICAgICAgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBydW4gU1dJRyB3aXRoIHRoZSAnLWtleXdvcmQnIGNvbW1hbmQKICAgICAgICAgIGxpbmUgb3B0aW9uLiAgICBNaXhpbmcga2V5d29yZCBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgIHNob3VsZCB3b3JrIGFzIHdlbGwuICAgVW5uYW1lZCBhcmd1bWVudHMgYXJlIGFzc2lnbmVkIG5hbWVzCiAgICAgICAgICBzdWNoIGFzICJhcmcxIiwgImFyZzIiLCBldGMuLi4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIEZ1bmN0aW9ucyB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lcyBzdWNoIGFzCiAgICAgICAgICBiYXIoaW50ICpPVVRQVVQsIGludCAqT1VUUFVUKSB3aWxsIGxpa2VseSBjYXVzZSBwcm9ibGVtYXRpYwogICAgICAgICAgd3JhcHBlciBjb2RlIHRvIGJlIGdlbmVyYXRlZC4gICBUbyBmaXggdGhpcywgIHVzZSBkaWZmZXJlbnQKICAgICAgICAgIG5hbWVzIG9yIHVzZSAlYXBwbHkgdG8gbWFwIHR5cGVtYXBzIHRvIGFsdGVybmF0ZSBuYW1lcy4KCjgvOC85OSAgOiBIYW5kbGluZyBvZiB0aGUgJ3RoaXMnIHBvaW50ZXIgaGFzIGJlZW4gY2hhbmdlZCBpbiBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgUHJldmlvdXNseSwgZGVyZWZlcmVuY2luZyBvZiAnLnRoaXMnIG9jY3VycmVkIGluIHRoZQogICAgICAgICAgUHl0aG9uIHNoYWRvdyBjbGFzcyBpdHNlbGYuICAgTm93LCB0aGlzIHN0ZXAgb2NjdXJzIGluIHRoZSBDCiAgICAgICAgICB3cmFwcGVycyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICAgIFNXSUdfR2V0UHRyT2JqKFB5T2JqZWN0ICosIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpCgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcG9pbnRlcgogICAgICAgICAgb3IgYSBzaGFkb3cgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhICcudGhpcycgYXR0cmlidXRlIG9mCiAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgMS4gIFRoZSByZWFsIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSBmb3IgYW4gb2JqZWN0IGlzCiAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBDIHdyYXBwZXJzIHdoZXJlIGl0IGNhbiBiZSBleGFtaW5lZC9tb2RpZmllZAogICAgICAgICAgICAgIGJ5IHR5cGVtYXBzLgoKICAgICAgICAgIDIuICBIYW5kbGluZyBvZiBkZWZhdWx0L2tleXdvcmQgYXJndW1lbnRzIGlzIG5vdyBncmVhdGx5CiAgICAgICAgICAgICAgc2ltcGxpZmllZC4KCiAgICAgICAgICAzLiAgVGhlIFB5dGhvbiB3cmFwcGVyIGNvZGUgaXMgbXVjaCBtb3JlIHNpbXBsZS4KCiAgICAgICAgICBQbHVzLCBpdCBlbGltaW5hdGVkIG1vcmUgdGhhbiAzMDAgbGluZXMgb2YgQysrIGNvZGUgaW4gdGhlCiAgICAgICAgICBQeXRob24gbW9kdWxlLgoKICAgICAgICAgICoqKiBDQVZFQVQgOiBUaGlzIHJlcXVpcmVzIHRoZSBhYnN0cmFjdCBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgSXQgc2hvdWxkIHdvcmsgd2l0aCBQeXRob24gMS40LCBidXQgcHJvYmFibHkgbm90aGluZyBvbGRlcgogICAgICAgICAgdGhhbiB0aGF0LgoKCjgvOC85OSAgOiBGaXhlZCBoYW5kbGluZyBvZiAiY29uc3QiIGFuZCBwb2ludGVycyBpbiBjbGFzc2VzLiAgSW4gcGFydGljdWxhciwKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzCgogICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGNvbnN0IGludCAgKmlwdHI7CiAgICAgICAgICB9CgogICAgICAgICAgYXJlIGhhbmRsZWQgYXMgYXNzaWduYWJsZSB2YXJpYWJsZXMgYXMgb3Bwb3NlZCB0byBjb25zdGFudAogICAgICAgICAgdmFsdWVzICh0aGlzIGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGluIEMvQysrKS4gICBOb3RlOgogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMgImNoYXIgKmNvbnN0IG1zZyIgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgogICAgICAgICAgQ29uc3RhbnRzIGRlY2xhcmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgdXNpbmcgY29uc3QgYXJlIGFsc28KICAgICAgICAgIGJyb2tlbiAoYmVjYXVzZSBJIGhhdmUgYSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0IHJlbHkgdXBvbgogICAgICAgICAgdGhpcyBiZWhhdmlvcikuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQKICAgICAgICAgIG1pc3Rha2VubHkgdHJlYXQgJ2NvbnN0IGNoYXIgKicgdHlwZXMgYXMgY29uc3RhbnQgdmFsdWVzLgoKOC84Lzk5ICA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBiaXQtZmllbGRzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2tleXdvcmQgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19leHRlcm4gIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfc3RhdGljICA6IDE7CiAgICAgICAgICB9IGZsYWdzOwoKICAgICAgICAgIEJpdC1maWVsZHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnRlZ2VyIHR5cGVzIGFuZCB0aGVpcgogICAgICAgICAgYXJlIG90aGVyIHJlc3RyaWN0aW9ucy4gIFNXSUcgcGVyZm9ybXMgbm8gc3VjaCB0eXBlLWNoZWNraW5nCiAgICAgICAgICAoYWx0aG91Z2ggdGhlIEMgY29tcGlsZXIgd2lsbCBjYXRjaCBwcm9ibGVtcyB3aGVuIGl0IHRyaWVzIHRvCiAgICAgICAgICBjb21waWxlIHRoZSB3cmFwcGVyIGNvZGUpLgoKOC84Lzk5ICA6IFJlbW92ZWQgdHJhaWxpbmcgc3BhY2Ugb2YgJGJhc2V0eXBlIHN1YnN0aXR1dGlvbiBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAldHlwZW1hcChweXRob24sIGFyZ291dCkgc3BhbSoqIE9VVFBVVHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBjaGFyKiBhID0gIiRiYXNldHlwZV9wIjsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH0KCiAgICAgICAgICAoUGF0Y2ggc3VnZ2VzdGVkIGJ5IE5hdGhhbiBEdW5maWVsZCkuCgo2LzIyLzk5IDogTWFkZSBhIHZlcnkgc2xpZ2h0IHR3ZWFrIHRvIHRoZSBQZXJsNSBzaGFkb3cgY2xhc3MKICAgICAgICAgIGNvZGUgdGhhdCBhbGxvd3MgdHlwZW1hcHMgdG8gYWx0ZXIgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICBvZiBvYmplY3RzICh0byBzdXBwb3J0IHBvbHltb3JwaGljIHR5cGVzKS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBEcmFrZSBEaWVkcmljaC4KCjQvOC85OSAgOiBGaXhlZCBudWxsIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmwgbW9kdWxlLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMy8xNy85OSA6IEZpeGVkIGJ1ZyBpbiBwZXJsNXB0ci5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBHcmVnIEFuZGVyc29uLgoKMi8yNy85OSA6IEVsaW1pbmF0ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gU3dpZyBydW5zIG9uCiAgICAgICAgICBlbXB0eSBmaWxlcy4KCjIvMjcvOTkgOiBBZGRlZCBwYXRjaCB0byBHdWlsZSBtb2R1bGUgdG8gZWxpbWluYXRlIHVudXNlZAogICAgICAgICAgdmFyaWFibGVzLiAgIENvbnRyaWJ1dGVkIGJ5IE1pa2UgU2ltb25zLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyByZXR1cm5pbmcgcmVmZXJlbmNlcy4KCjIvMjcvOTkgOiBGaXhlZCBSdW50aW1lL01ha2VmaWxlLiBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgTWlrZSBSb21iZXJnLgoKMi8yNy85OSA6IEluY29ycG9yYXRlZCBwYXRjaGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoIC1leHBvcnRhbGwgc3dpdGNoIGFuZCBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgaW4gUGVybDUgbW9kdWxlLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKMi8yNy85OSA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSB0byByZWNvZ25pemUgJ3VuZGVmJyBhcyBhIE5VTEwgY2hhciAqLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBQZXJsNSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YKICAgICAgICAgIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbjMyLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBpbmNsdWRlIG9yZGVyIG9mIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgLUkgb3B0aW9uLgoKMi81Lzk4LSA6IERhdmUgZmluaXNoZXMgaGlzIGRpc3NlcnRhdGlvbiwgZ29lcyBqb2IgaHVudGluZywgbW92ZXMgdG8KMi81Lzk5ICAgIENoaWNhZ28gYW5kIGdlbmVyYWxseSB0aHJhc2hlcyBhYm91dC4KClZlcnNpb24gMS4xIFBhdGNoIDUgKEZlYnJ1YXJ5IDUsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2FsbHkgbGluayB2ZXJzaW9ucyBvZiBQeXRob24gMS41LiAgICBUbyBtYWtlIGl0IHRoZSBkZWZhdWx0LAogICAgICAgICAgc2ltcGx5IGNvcHkgJ3N3aWdfbGliL3B5dGhvbi9lbWJlZDE1LmknIHRvICdzd2lnX2xpYi9weXRob24vZW1iZWQuaScKClZlcnNpb24gMS4xIFBhdGNoIDMgKE5vdmVtYmVyIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aXRoIHNoYWRvdyBjbGFzc2VzIGFuZAogICAgICAgICAgc3RhdGljIGNsYXNzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjbGFzcyBpbnN0YW5jZXMuCiAgICAgICAgICBOb3RlIDogVGhlIGZpeCBmb3IgdGhpcyBidWcgcmVxdWlyZXMgYSBzbGlnaHQgcmVzdHJ1Y3R1cmluZyBvZgogICAgICAgICAgb2YgdGhlIC5wbSBmaWxlcyBjcmVhdGVkIGJ5IFNXSUcuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFRjbC9UY2w4IG1vZHVsZXMgcmVsYXRlZCB0byB2YXJpYWJsZSBsaW5raW5nCiAgICAgICAgICBvZiBjaGFyYWN0ZXIgYXJyYXlzLiAgSWYgeW91IGRlY2xhcmVkIGEgZ2xvYmFsIHZhcmlhYmxlICdjaGFyIGZvb1sxMF0nLAogICAgICAgICAgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgd291bGQgZWl0aGVyIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgICAgICAgICBpbW1lZGlhdGVseSB1cG9uIGxvYWRpbmcgb3Igd2VpcmQgbWVtb3J5IGNvcnJ1cHRpb24gZWxzZXdoZXJlLgogICAgICAgICAgVGhpcyBzaG91bGQgbm93IGJlIGZpeGVkIGFsdGhvdWdoIGNoYXJhY3RlciBhcnJheXMgY2FuIG9ubHkgYmUKICAgICAgICAgIHJlYWQtb25seS4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCBpdCB0bwogICAgICAgICAgZmFpbCBpZiBmaWxlcyB3ZXJlIGltcG9ydGVkIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbgogICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCgoxMS8yMy85NzogRml4ZWQgaW5jb3JyZWN0IGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbgogICAgICAgICAgbW9kdWxlLgoKMTEvMjMvOTc6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIHRoZSAtbyBvcHRpb24gd2hlbiB1c2VkIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiBJZiAtbyB3YXMgdXNlZCB0byBzcGVjaWZ5IGJvdGggdGhlIHBhdGhuYW1lIGFuZCBmaWxlbmFtZQogICAgICAgICAgb2YgU1dJRydzIG91dHB1dCBzdWNoIGFzCgogICAgICAgICAgICAgICAgIHN3aWcgLW8gL2hvbWUvc3dpZy93cmFwcGVyLmMgLXNoYWRvdyAtcGVybDUgZm9vLmkKCiAgICAgICAgICBUaGUgd3JhcHBlciBjb2RlIHdvdWxkIGJlIHBsYWNlZCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtbywKICAgICAgICAgIGJ1dCB0aGUgLnBtIGZpbGUgYW5kIGRvY3VtZW50YXRpb24gd291bGQgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIFNXSUcgd2FzIHJ1bi4gICBOb3csIHRoZXNlIGZpbGVzIGFyZSBwbGFjZWQKICAgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgLW8gb3B0aW9uLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBuZWVkZWQgZm9yIHByb3BlciBvcGVyYXRpb24gb24gdGhlCiAgICAgICAgICBNYWNpbnRvc2guCgoxMS8yMy85NzogQWRkZWQgYSAndGhpcygpJyBtZXRob2QgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuICAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZSBmcm9tIGEgc2hhZG93CiAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgdGllZCBoYXNoLiAgIFRvIHVzZSBqdXN0CiAgICAgICAgICBpbnZva2UgYXMgYSBtZXRob2QgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgJGwgPSBuZXcgTGlzdDsgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgJHB0ciA9ICRsLT50aGlzKCk7ICAgIyBHZXQgdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2wgOCBwb2ludGVyLmkgbGlicmFyeSBmaWxlICh3aGljaCB3YXMgY29tcGxldGVseQogICAgICAgICAgYnJva2VuIGluIDEuMXAyKS4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgUGVybDUgdHlwZS1jaGVja2VyIHRvIGZpeCBhIGZldyBwcm9ibGVtcwogICAgICAgICAgd2l0aCBnbG9iYWwgdmFyaWFibGVzIG9mIHBvaW50ZXIgdHlwZXMgYW5kIHRvIGFsbG93CiAgICAgICAgICB0aWVkIGhhc2hlcyB0byBiZSB1c2VkIGludGVyY2hhbmdhYmx5IHdpdGggbm9ybWFsCiAgICAgICAgICBwb2ludGVyIHZhbHVlcy4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgdHlwZW1hcCBtZWNoYW5pc20gdG8gYWxsb3cgb3V0cHV0CiAgICAgICAgICB0eXBlbWFwcyBvZiB0eXBlICd2b2lkJy4gICBUaGVzZSB3ZXJlIGlnbm9yZWQgcHJldmlvdXNseSwKICAgICAgICAgIGJ1dCBub3cgaWYgeW91IHNwZWNpZnksCgogICAgICAgICAgICAgICAgJXR5cGVtYXAobGFuZyxvdXQpIHZvaWQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZvaWQgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgWW91IGNhbiBjaGFuZ2Ugb3IgYXNzaWduIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBmdW5jdGlvbi4KCjExLzIzLzk3OiBGaXhlZCBwcm9jZXNzaW5nIG9mICdib29sJyBkYXRhdHlwZXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgoxMS8yMy85NzogRml4ZWQgbWlub3IgcGFyc2luZyBlcnJvciB3aXRoIEMrKyBpbml0aWFsaXplcnMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbDggbW9kdWxlIHNvIHRoYXQgQyBmdW5jdGlvbnMgdGhhdCBjYWxsIGJhY2sgaW50bwogICAgICAgICAgVGNsIGRvbid0IGNvcnJ1cHQgdGhlIHJldHVybiByZXN1bHQgb2JqZWN0IChTV0lHIHdhcyBnYXRoZXJpbmcKICAgICAgICAgIHRoZSByZXN1bHQgb2JqZWN0IHRvbyBlYXJseSB3aGljaCBsZWFkcyB0byBwcm9ibGVtcyBpZiBzdWJzZXF1ZW50CiAgICAgICAgICBUY2wgY2FsbHMgYXJlIG1hZGUpLgoKMTEvMjMvOTc6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiB0aGUgUHl0aG9uIG1vZHVsZSB3aGVuIHR3byBvcgogICAgICAgICAgbW9yZSBvdXRwdXQgcGFyYW1ldGVycyB3ZXJlIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyBvZiBhCiAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgdHlwZW1hcHMuaQogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqT1VUUFVULCBkb3VibGUgKk9VVFBVVCwgZG91YmxlIGEpOwoKICAgICAgICAgIFByZXZpb3VzbHksIGRvaW5nIHRoaXMgcmVzdWx0ZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFuCiAgICAgICAgICBleHRyYW5lb3VzIGNvbW1hIGluIHRoZSBvdXRwdXQsIHJlc3VsdGluZyBpbiBhIEMgc3ludGF4IGVycm9yLgoKMTEvMjIvOTc6IEZpeGVkIGEgYnVnIHdoZW4gdGVtcGxhdGUgaGFuZGxpbmcgdGhhdCB3YXMgc3RyaXBwaW5nIHdoaXRlc3BhY2UKICAgICAgICAgIGFyb3VuZCBuZXN0ZWQgdGVtcGxhdGVzLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgRm9vPEJhcjxkb3VibGU+ID4KCiAgICAgICAgICB3YXMgZ2V0dGluZyBtdW5nZWQgaW50byBGb288QmFyPj4gd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgaW4KICAgICAgICAgIGluIHRoZSBDKysgY29tcGlsZXIuCgoxMS8yMi85NzogRml4ZWQgYnVncyBpbiB0aGUgQm9ybGFuZCBDKysgbWFrZWZpbGVzLgoKMTEvMjIvOTc6IEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyB3aGVuIHByb2Nlc3NpbmcgaW50ZWdlcgogICAgICAgICAgYXJndW1lbnRzIGluIFRjbDggbW9kdWxlLgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBSdW50aW1lL01ha2VmaWxlIHJlbGF0ZWQgdG8gVGNsIDguCgoxMS8yMS85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgTm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHBlcmwgc3ludGF4IGVycm9yLgoKMTEvOS85NyA6IENoYW5nZWQgYSBzdHJuY3B5KCkgdG8gc3RyY3B5KCkgaW4gdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyLgogICAgICAgICAgVGhpcyByZXN1bHRzIGluIGEgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4KICAgICAgICAgIHR5cGUtY2hlY2tpbmcuCgoxMC8yOS85NzogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cyBhbmQKICAgICAgICAgIHVzZXItZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oVmVjdG9yIGEsIFZlY3RvciBiID0gZCk7CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrIHByb3Blcmx5LgoKVmVyc2lvbiAxLjEgUGF0Y2ggMiAoU2VwdGVtYmVyIDQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cnJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBleHBvcnQgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICB5b3Vyc2VsZi4KCiAgICAgICAgICAgIC0gIEJpemFycmUgY29tcGlsYXRpb24gcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlcgogICAgICAgICAgICAgICBjb2RlIGFzIEFOU0kgQyB1bmRlciBWaXN1YWwgQysrIDQueCBmaXhlZC4KCiAgICAgICAgICAgIC0gIFRlc3RlZCB3aXRoIGJvdGggdGhlIHN0b2NrIFB5dGhvbi0xLjQgZGlzdHJpYnV0aW9uIGFuZCBQeXRob253aW4KICAgICAgICAgICAgICAgcnVubmluZyB1bmRlciBXaW45NS4KCjIvMTkvOTcgOiBGaXhlZCB0eXBlZGVmIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjIvMTkvOTcgOiBBZGRlZCBleGNlcHRpb24gc3VwcG9ydC4gIFRvIHVzZSBpdCwgZG8gdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgICVleGNlcHQobGFuZykgewogICAgICAgICAgICAgICAgICAuLi4gdHJ5IHBhcnQgb2YgdGhlIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIC4uLiBjYXRjaCBwYXJ0IG9mIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgJGZ1bmN0aW9uIGlzIGEgU1dJRyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgICBhY3R1YWwgQy9DKysgZnVuY3Rpb24gY2FsbCBpbiBhIHdyYXBwZXIgZnVuY3Rpb24uICBUaHVzLAogICAgICAgICAgYSByZWFsIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAlZXhjZXB0KHBlcmw1KSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoIChjaGFyIComIHN6KSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHByb2Nlc3MgYW4gZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICB9IGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIGNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbi4gQmFpbGluZyBvdXQuLi4iKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQoKMi8xOS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGdlbmVyaWMgY29kZSBmcmFnbWVudHMgKG5lZWRlZAogICAgICAgICAgZm9yIGV4Y2VwdGlvbnMpLgoKMi8xOS85NyA6IEZpeGVkIHNvbWUgcmVhbGx5IG9ic2N1cmUgdHlwZW1hcCBzY29waW5nIGJ1Z3MgaW4gdGhlIEMrKwogICAgICAgICAgaGFuZGxlci4KCjIvMTgvOTcgOiBDbGVhbmVkIHVwIHBlcmxtYWluLmkgZmlsZSBieSByZW1vdmluZyBzb21lIHByb2JsZW1hdGljLAogICAgICAgICAgYnV0IHNlZW1pbmdseSB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMuCgoyLzE4Lzk3IDogT3B0aW1pemVkIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbnMgdW5kZXIgaW5oZXJpdGFuY2UuCiAgICAgICAgICBTV0lHIGNhbiBub3cgdXNlIHdyYXBwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgYQogICAgICAgICAgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIHJlZ2VuZXJhdGluZyB3cmFwcGVycyBmb3IKICAgICAgICAgIHRoZSBzYW1lIGZ1bmN0aW9ucyBpbiBhIGRlcml2ZWQgY2xhc3MuICAgIFRoaXMgY291bGQKICAgICAgICAgIG1ha2UgYSBkcmFzdGljIHJlZHVjdGlvbiBpbiB3cmFwcGVyIGNvZGUgc2l6ZSBmb3IgQysrCiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBkZWVwIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGFuZAogICAgICAgICAgbG90cyBvZiBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogQWRkaXRpb25hbCBtZXRob2RzIHNwZWNpZmllZCB3aXRoICVhZGRtZXRob2RzIGNhbiBub3cKICAgICAgICAgIGJlIGluaGVyaXRlZCBhbG9uZyB3aXRoIG5vcm1hbCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBNaW5vciBpbnRlcm5hbCBmaXhlcyB0byBtYWtlIFNXSUcncyBzdHJpbmcgaGFuZGxpbmcgYSBsaXR0bGUKICAgICAgICAgIHNhZmVyLgoKMi8xNi85NyA6IE1vdmVkIHNvbWUgY29kZSBnZW5lcmF0aW9uIG9mIFRjbCBzaGFkb3cgY2xhc3NlcyB0bwogICAgICAgICAgbGlicmFyeSBmaWxlcy4KCjIvMTYvOTcgOiBGaXhlZCBkb2N1bWVudGF0aW9uIGVycm9yIG9mICctY29uZmlndXJlJyBtZXRob2QgaW4KICAgICAgICAgIFRjbCBtb2R1bGVzLgoKMi8xNi85NyA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSBzbGlnaHRseSB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcy4KCjIvMTIvOTcgOiBGaXhlZCBhcmd1bWVudCBjaGVja2luZyBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBieQogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgKGZ1bmN0aW9uIGNhbGxzIHdpdGggdG9vIG1hbnkKICAgICAgICAgIGFyZ3VtZW50cyB3b3VsZCBzdGlsbCBiZSBleGVjdXRlZCkuICBGdW5jdGlvbnMgbm93CiAgICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyBDIHZlcnNpb24KICAgICAgICAgICh3aXRoIHBvc3NpYmlsaXR5IG9mIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBzdGlsbCBzdXBwb3J0ZWQpLgoKMi8xMi85NyA6IEZpeGVkIGRlZmF1bHQgYXJndW1lbnQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zIGludm9sdmluZyBkZWZhdWx0CiAgICAgICAgICBhcmd1bWVudHMgb2YgY29tcGxleCBkYXRhdHlwZXMuCgoyLzEyLzk3IDogRml4ZWQgdHlwZW1hcCBzY29waW5nIHByb2JsZW1zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gZ2V0IGEgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiYXIoZG91YmxlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBuZXcgZ2V0IGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBhcHBseSB0aGUgc2Vjb25kIHR5cGVtYXAgdG8gYWxsIGZ1bmN0aW9ucyBpbiBGb28KICAgICAgICAgIGR1ZSB0byBkZWxheWVkIGdlbmVyYXRpb24gb2YgQysrIHdyYXBwZXIgY29kZSAoY2xlYXJseSB0aGlzCiAgICAgICAgICBpcyBub3QgdGhlIGRlc2lyZWQgZWZmZWN0KS4gICBQcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5CiAgICAgICAgICBhc3NpZ25pbmcgdW5pcXVlIG51bWVyaWNhbCBpZGVudGlmaWVycyB0byBldmVyeSBkYXRhdHlwZSBpbgogICAgICAgICAgYW4gaW50ZXJmYWNlIGZpbGUgYW5kIHJlY29yZGluZyB0aGUgInJhbmdlIG9mIGVmZmVjdCIgb2YgZWFjaAogICAgICAgICAgdHlwZW1hcC4KCjIvMTEvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciAiaWdub3JlIiBhbmQgImRlZmF1bHQiIHR5cGVtYXBzLiAgT25seSB1c2UKICAgICAgICAgIGlmIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCgoyLzkvOTcgIDogQWRkZWQgYXV0b21hdGljIGNyZWF0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yCiAgICAgICAgICBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW55IHNvcnQgb2YKICAgICAgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGJ5CiAgICAgICAgICBydW5uaW5nIFNXSUcgd2l0aCB0aGUgJy1tYWtlX2RlZmF1bHQnIG9wdGlvbiBvciBieSBpbnNlcnRpbmcKICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGludG8gYW4gaW50ZXJmYWNlIGZpbGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG1ha2VfZGVmYXVsdAoKICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJhZ21hIGRpc2FibGVzIGF1dG9tYXRpYyBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uCgogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdAoKMi85Lzk3ICA6IEFkZGVkIC1tYWtlX2RlZmF1bHQgb3B0aW9uIGZvciBwcm9kdWNpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBmb3IgY2xhc3NlcyB3aXRob3V0IHRoZW0uCgoyLzkvOTcgIDogQ2hhbmdlZCB0aGUgc3ludGF4IG9mIHRoZSBTV0lHICVwcmFnbWEgZGlyZWN0aXZlIHRvCiAgICAgICAgICAlcHJhZ21hIG9wdGlvbj12YWx1ZSBvciAlcHJhZ21hKGxhbmcpIG9wdGlvbj12YWx1ZS4KICAgICAgICAgIFRoaXMgY2hhbmdlIG1ha2VzIHRoZSBzeW50YXggYSBsaXR0bGUgbW9yZSBjb25zaXN0ZW50CiAgICAgICAgICBiZXR3ZWVuIGdlbmVyYWwgcHJhZ21hcyBhbmQgbGFuZ3VhZ2Utc3BlY2lmaWMgcHJhZ21hcy4KICAgICAgICAgIFRoZSBvbGQgc3ludGF4IHN0aWxsIHdvcmtzLCBidXQgd2lsbCBwcm9iYWJseSBiZSBwaGFzZWQKICAgICAgICAgIG91dCAoYSB3YXJuaW5nIG1lc3NhZ2UgaXMgY3VycmVudGx5IHByaW50ZWQpLgoKMi85Lzk3ICA6IEltcHJvdmVkIFRjbCBzdXBwb3J0IG9mIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhcmUgb2YKICAgICAgICAgIHN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCB1bmlvbnMuCgoyLzkvOTcgIDogRml4ZWQgQysrIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gUHl0aG9uICdlbWJlZC5pJyBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgbWlzc2luZyByZXR1cm4gdmFsdWUgaW4gcGVybG1haW4uaSBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIHJldHVybiBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuCiAgICAgICAgICB1bmRlZmluZWQgYXR0cmlidXRlcyBhcmUgYWNjZXNzZWQgKG9sZGVyIHZlcnNpb25zIHJldHVybmVkCiAgICAgICAgICBhIE5hbWVFcnJvcikuCgoyLzkvOTcgIDogRml4ZWQgYnVnIHdoZW4gJWFkZG1ldGhvZHMgaXMgdXNlZCBhZnRlciBhIGNsYXNzIGRlZmluaXRpb24gd2hvc2UKICAgICAgICAgIGxhc3Qgc2VjdGlvbiBpcyBwcm90ZWN0ZWQgb3IgcHJpdmF0ZS4KCjIvOC85NyAgOiBNYWRlIHNsaWdodCBjaGFuZ2VzIGluIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHRvIHN1cHBvcnQKICAgICAgICAgIHRoZSBNYWNpbnRvc2guCgoyLzgvOTcgIDogRXh0ZW5kZWQgc3dpZ21haW4uY3h4IHRvIHByb3ZpZGUgYSBydWRpbWVudGFyeSBNYWNpbnRvc2ggaW50ZXJmYWNlLgogICAgICAgICAgSXQncyBhIHJlYWxseSBiYWQgaW50ZXJmYWNlLCBidXQgd29ya3MgdW50aWwgc29tZXRoaW5nIGJldHRlcgogICAgICAgICAgaXMgd3JpdHRlbi4KCjEvMjkvOTcgOiBGaXhlZCB0eXBlLWNhc3RpbmcgYnVnIGludHJvZHVjZWQgYnkgMS4xYjQgd2hlbiBzZXR0aW5nL2dldHRpbmcgdGhlCiAgICAgICAgICB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGVzIGludm9sdmluZyBjb21wbGV4IGRhdGEgdHlwZXMuCgoxLzI5Lzk3IDogUmVtb3ZlZCBlcnJvbmVvdXMgd2hpdGUgc3BhY2UgYmVmb3JlIGFuICNlbmRpZiBpbiB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgIGJ5IHRoZSBQeXRob24gbW9kdWxlICh3YXMgY2F1c2luZyBlcnJvcnMgb24gREVDIEFscGhhIGNvbXBpbGVycykuCgoxLzI2Lzk3IDogRml4ZWQgZXJyb3JzIHdoZW4gdXNpbmcgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMgaW4gUHl0aG9uIHNoYWRvdwoJICBzaGFkb3cgY2xhc3Nlcy4KCjEvMjMvOTcgOiBGaXhlZCBidWcgd2l0aCBuZXN0ZWQgJWV4dGVybiBkZWNsYXJhdGlvbnMuCgoxLzIxLzk3IDogRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgaW52b2x2aW5nIGNvbnN0IGRhdGF0eXBlcy4KCjEvMjEvOTcgOiBTb21ld2hhdCBvYnNjdXJlLCBidXQgc2VyaW91cyBidWcgd2l0aCBoYXZpbmcgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICBvZiB0eXBlZGVmcyBmaXhlZC4gIEZvciBleGFtcGxlIDoKCgkJdHlwZWRlZiBjaGFyICpTdHJpbmc7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFN0cmluZyAgTmFtZTsKClZlcnNpb24gMS4xIEJldGE0IChKYW51YXJ5IDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBTV0lHIDEuMWIzIGNyYXNoZWQgYW5kIGJ1cm5lZCBzaG9ydGx5IGFmdGVyIHRha2Ugb2ZmIGR1ZQp0byBhIGZldyBtYWpvciBydW4tdGltZSBwcm9ibGVtcyB0aGF0IHN1cmZhY2VkIGFmdGVyIHJlbGVhc2UuClRoaXMgcmVsZWFzZSBzaG91bGQgZml4IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRob3NlIHByb2JsZW1zLgoKMS8xNi85NyA6IEZpeGVkIG1ham9yIG1lbW9yeSBtYW5hZ2VtZW50IGJ1ZyBvbiBMaW51eAoKMS8xNC85NyA6IEZpeGVkIGJ1ZyBpbiBmdW5jdGlvbnMgcmV0dXJuaW5nIGNvbnN0YW50IEMrKyByZWZlcmVuY2VzLgoKMS8xNC85NyA6IE1vZGlmaWVkIEMrKyBtb2R1bGUgdG8gaGFuZGxlIGRhdGF0eXBlcyBiZXR0ZXIuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IGEgKnNpbmdsZSogc2NvcGUgcmVzb2x1dGlvbgogICAgICAgICAgb3BlcmF0b3IgaW4gZGF0YXR5cGVzLiAgSWUgOiBGb286OmJhci4gICBTV0lHIGRvZXNuJ3QKICAgICAgICAgIHlldCBoYW5kbGUgbmVzdGVkIGNsYXNzZXMsIHNvIHRoaXMgc2hvdWxkIGJlCiAgICAgICAgICBzdWZmaWNpZW50IGZvciBub3cuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHR5cGVkZWYgaW5zaWRlIGEgQysrIGNsYXNzLgoKMS8xNC85NyA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBkYXRhdHlwZXMgZGVmaW5lZCBpbnNpZGUKICAgICAgICAgIGEgQysrIGNsYXNzLiAgU1dJRyB3YXMgbm90IGdlbmVyYXRpbmcgY29ycmVjdCBjb2RlLAogICAgICAgICAgYnV0IGEgbmV3IHNjb3BpbmcgbWVjaGFuaXNtIGFuZCBtZXRob2QgZm9yIGhhbmRsaW5nCiAgICAgICAgICBkYXRhdHlwZXMgaW5zaWRlIGEgQysrIGNsYXNzIGhhdmUgYmVlbiBhZGRlZC4KCjEvMTQvOTcgOiBDaGFuZ2VkIGVudW1lcmF0aW9ucyB0byB1c2UgdGhlIHZhbHVlIG5hbWUgaW5zdGVhZAogICAgICAgICAgb2YgYW55IHZhbHVlcyB0aGF0IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGludGVyZmFjZQogICAgICAgICAgZmlsZS4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0bwogICAgICAgICAgQysrIGNvbXBpbGVycy4KCjEvMTQvOTcgOiBSZW1vdmVkIHR5cGVkZWYgYnVnIHRoYXQgbWFkZSBhbGwgZW51bWVyYXRpb25zCiAgICAgICAgICBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHR5cGUgY2hlY2tlciAoc2luY2UKICAgICAgICAgIGl0IGdlbmVyYXRlZCBhbG90IG9mIHVubmVjZXNzYXJ5IGNvZGUpLgoKVmVyc2lvbiAxLjEgQmV0YTMgKEphbnVhcnkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBDKysgbW9kdWxlCgoyLiBGaXhlZCBtaW5vciBidWcgaW4gcG9pbnRlciB0eXBlLWNoZWNrZXIgd2hlbiB1c2luZwogICAtREFMTE9XX05VTEwuCgozLiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsgd2l0aCBQeXRob24gMS40YmV0YTMKCjQuIENoYW5nZWQgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRob3V0CiAgIHlhY2Mgb3IgYmlzb24uCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDI4LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIENoYW5nZWQgcGFyc2VyIHRvIHN1cHBvcnQgbW9yZSBDL0MrKyBkYXRhdHlwZXMgKHdlbGwsCiAgICBtb3JlIHZhcmlhbnRzKS4gICBUeXBlcyBsaWtlICJ1bnNpZ25lZCIsICJzaG9ydCBpbnQiLAogICAgImxvbmcgaW50IiwgZXRjLi4uIG5vdyB3b3JrLgoKMi4gICJ1bmlvbnMiIGFkZGVkIHRvIHBhcnNlci4KCjMuICBVc2Ugb2YgInR5cGVkZWYiIGFzIGluIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgIGRvdWJsZSB4LHksejsKCX0gVmVjdG9yOwoKICAgIE5vdyB3b3JrcyBjb3JyZWN0bHkuICAgVGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgaXMgdXNlZCBhcwogICAgdGhlIHN0cnVjdHVyZSBuYW1lLgoKNC4gIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmLCAjZWxzZSwgI2VuZGlmLCBldGMuLi4KICAgIGFkZGVkLgoKNS4gIE5ldyAlZGlzYWJsZWRvYywgJWVuYWJsZWRvYyBkaXJlY3RpdmVzIGFsbG93IGRvY3VtZW50YXRpb24KICAgIHRvIHNlbGVjdGl2ZWx5IGJlIGRpc2FibGVkIGZvciBjZXJ0YWluIHBhcnRzIG9mIGEgd3JhcHBlcgogICAgZmlsZS4KCjYuICBOZXcgUHl0aG9uIG1vZHVsZSBzdXBwb3J0cyBiZXR0ZXIgdmFyaWFibGUgbGlua2luZywgY29uc3RhbnRzLAogICAgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNy4gIFBlcmw1IG1vZHVsZSBpbXByb3ZlZCB3aXRoIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggWFMKICAgIGFuZCB4c3VicHAuICAgU1dJRyBwb2ludGVycyBhbmQgbm93IGNyZWF0ZWQgc28gdGhhdCB0aGV5CiAgICBhcmUgY29tcGF0aWJsZSB3aXRoIHhzdWJwcCBwb2ludGVycy4KCjguICBTdXBwb3J0IGZvciBbaW5jciBUY2xdIG5hbWVzcGFjZXMgYWRkZWQgdG8gVGNsIG1vZHVsZS4KCjkuICAlcHJhZ21hIGRpcmVjdGl2ZSBhZGRlZC4KCjEwLiAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgYWRkZWQuCgoxMS4gJW5hdGl2ZSBkaXJlY3RpdmUgYWRkZWQgdG8gYWxsb3cgcHJlLWV4aXN0aW5nIHdyYXBwZXIgZnVuY3Rpb25zCiAgICB0byBiZSB1c2VkLgoKMTIuIFdyb3RlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFNXSUcgaW5zdGFsbGF0aW9uLgoKMTMuIEZ1bmN0aW9uIHBvaW50ZXJzIG5vdyBhbGxvd2VkIHdpdGggdHlwZWRlZiBzdGF0ZW1lbnRzLgoKMTQuICV0eXBlZGVmIG1vZGlmaWVkIHRvIGluc2VydCBhIGNvcnJlc3BvbmRpbmcgQyB0eXBlZGVmIGludG8KICAgIHRoZSBvdXRwdXQgZmlsZS4KCjE1LiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gQysrIHJlZmVyZW5jZXMuCgoxNi4gTmV3IFN0cmluZyBhbmQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzZXMgYWRkIHRvIG1ha2UgZ2VuZXJhdGluZwogICAgd3JhcHBlciBjb2RlIGVhc2llci4KCjE3LiBGaXhlZCBjb21tYW5kIGxpbmUgb3B0aW9uIHByb2Nlc3NpbmcgdG8gZWxpbWluYXRlIGNvcmUgZHVtcHMKICAgIGFuZCB0byBhbGxvdyBoZWxwIG1lc3NhZ2VzLgoKMTguIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byBhbG1vc3QgYWxsIGNvZGUgbW9kdWxlcwoKClZlcnNpb24gMS4wIEJldGEgMyAoUGF0Y2ggMSkgSnVseSAxNywgMTk5Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuMCBGaW5hbCBpcyBub3QgcXVpdGUgcmVhZHkgeWV0LCBidXQgdGhpcyByZWxlYXNlIGZpeGVzIGEKbnVtYmVyIG9mIGltbWVkaWF0ZSBwcm9ibGVtcyA6CgoxLiAgQ29tcGlsZXIgZXJyb3JzIHdoZW4gdXNpbmcgLXN0cmljdCAxIHR5cGUgY2hlY2tpbmcgaGF2ZSBiZWVuIGZpeGVkLgoKMi4gIFBvaW50ZXIgdHlwZSBjaGVja2VyIG5vdyByZWNvZ25pemVzIHBvaW50ZXJzIG9mIHRoZSBmb3JtCiAgICBfMF9UeXBlIGNvcnJlY3RseS4KCjMuICBBIGZldyBtaW5vciBmaXhlcyB3ZXJlIG1hZGUgaW4gdGhlIE1ha2VmaWxlCgpWZXJzaW9uIDEuMCBCZXRhIDMgKEp1bmUgMTQsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgcmVsZWFzZSBpcyBpZGVudGljYWwgdG8gQmV0YTEgZXhjZXB0IGEgZmV3IG1pbm9yIGJ1Z3MgYXJlCmZpeGVkIGFuZCB0aGUgU1dJRyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUvVGsgNC4xLgpBIHRjbDcuNSBleGFtcGxlcyBkaXJlY3RvcnkgaXMgbm93IGluY2x1ZGVkLgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgTWFrZWZpbGUgdGhhdCBkaWRuJ3QgaW5zdGFsbCB0aGUgbGlicmFyaWVzCiAgY29ycmVjdGx5LgoKLSBTV0lHIExpYnJhcnkgZmlsZXMgYXJlIG5vdyB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41IGFuZCBUayA0LjEuCgotIE1pbm9yIGJ1ZyBmaXhlcyBpbiBvdGhlciBtb2R1bGVzLgoKClZlcnNpb24gMS4wIEJldGEgMSAgKEFwcmlsIDEwLCAxOTk2KS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBpcyB0aGUgZmlyc3QgInNlbWktb2ZmaWNpYWwiIHJlbGVhc2Ugb2YgU1dJRy4gICAgSXQgaGFzIGEKbnVtYmVyIG9mIHN1YnN0YW50aWFsIGltcHJvdmVtZW50cyBvdmVyIHRoZSBBbHBoYSByZWxlYXNlLiAgIFRoZXNlCm5vdGVzIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLS1ob3BlIEkgcmVtZW1iZXJlZCBldmVyeXRoaW5nLi4uLgoKMS4gIFRjbC9UawoKU1dJRyBpcyBrbm93biB0byB3b3JrIHdpdGggVGNsNy4zLCBUazMuNiBhbmQgbGF0ZXIgdmVyc2lvbnMuCkkndmUgYWxzbyB0ZXN0ZWQgU1dJRyB3aXRoIGV4cGVjdC01LjE5LgoKTm9ybWFsbHkgU1dJRyBleHBlY3RzIHRvIHVzZSB0aGUgaGVhZGVyIGZpbGVzICJ0Y2wuaCIgYW5kICJ0ay5oIi4KTmV3ZXIgdmVyc2lvbnMgb2YgVGNsL1RrIHVzZSB2ZXJzaW9uIG51bWJlcnMuICAgWW91IGNhbiBzcGVjaWZ5IHRoZXNlCmluIFNXSUcgYXMgZm9sbG93cyA6CgogICAgICAgICUgd3JhcCAtaHRjbCB0Y2w3LjQuaCAtaHRrIHRrNC4wLmggZXhhbXBsZS5pCgpPZiBjb3Vyc2UsIEkgcHJlZmVyIHRvIHNpbXBseSBzZXQgdXAgc3ltYm9saWMgbGlua3MgYmV0d2VlbiAidGNsLmgiIGFuZAp0aGUgbW9zdCByZWNlbnQgc3RhYmxlIHZlcnNpb24gb24gdGhlIG1hY2hpbmUuCgoyLiAgUGVybDQKClRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gYmFzZWQgb24gUGVybC00LjAzNS4gIFNXSUcncyBpbnRlcmZhY2UgdG8KUGVybDQgaXMgYmFzZWQgb24gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgaW4gdGhlICJQcm9ncmFtbWluZyBQZXJsIgpib29rIGJ5IExhcnJ5IFdhbGwsIGFuZCBmaWxlcyBsb2NhdGVkIGluIHRoZSAidXN1YiIgZGlyZWN0b3J5IG9mIHRoZQpQZXJsNCBkaXN0cmlidXRpb24uCgpJbiBvcmRlciB0byBjb21waWxlIHdpdGggUGVybDQsIHlvdSdsbCBuZWVkIHRvIGxpbmsgd2l0aCB0aGUgdXBlcmwubwpmaWxlIGZvdW5kIGluIHRoZSBQZXJsNCBzb3VyY2UgZGlyZWN0b3J5LiAgWW91IG1heSB3YW50IHRvIG1vdmUgdGhpcwpmaWxlIHRvIGEgbW9yZSBjb252ZW5pZW50IGxvY2F0aW9uLgoKMy4gIFBlcmw1CgpUaGlzIGlzIGEgc29tZXdoYXQgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uLCBidXQgaXMgYWxvdCBsZXNzCmJ1Z2d5IHRoYW4gdGhlIGFscGhhIHJlbGVhc2UuICAgICBTV0lHIG9wZXJhdGVzIGluZGVwZW5kZW50bHkgb2YKdGhlIFhTIGxhbmd1YWdlIGFuZCB4c3VicHAgc3VwcGxpZWQgd2l0aCBQZXJsNS4gIEN1cnJlbnRseSBTV0lHCnByb2R1Y2VzIHRoZSBuZWNlc3NhcnkgQyBjb2RlIGFuZCAucG0gZmlsZSBuZWVkZWQgdG8gZHluYW1pY2FsbHkKbG9hZCBhIG1vZHVsZSBpbnRvIFBlcmw1LgoKVG8gc3VwcG9ydCBQZXJsNSdzIG5vdGlvbiBvZiBtb2R1bGVzIGFuZCBwYWNrYWdlcyAoYXMgd2l0aCB4c3VicHApLAp5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIDoKCiAgICAgICAgJSB3cmFwIC1wZXJsNSAtbW9kdWxlIE15TW9kdWxlIC1wYWNrYWdlIE15UGFja2FnZSBleGFtcGxlLmkKCk5vdGUgOiBJbiBvcmRlciBmb3IgZHluYW1pYyBsb2FkaW5nIHRvIGJlIGVmZmVjdGl2ZSwgeW91IG5lZWQgdG8gYmUKY2FyZWZ1bCBhYm91dCBuYW1pbmcuICAgIEZvciBhIG1vZHVsZSBuYW1lZCAiTXlNb2R1bGUiLCB5b3UnbGwgbmVlZCB0bwpjcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY2FsbGVkICJNeU1vZHVsZS5zbyIgdXNpbmcgc29tZXRoaW5nIGxpa2UKCiAgICAgICAgJSBsZCAtc2hhcmVkIG15X29iai5vIC1vIE15TW9kdWxlLnNvCgpUaGUgdXNlIG9mIHRoZSAlaW5pdCBkaXJlY3RpdmUgbXVzdCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgc2luY2UgUGVybDUKY2FsbHMgYSBmdW5jdGlvbiAiYm9vdF9Nb2R1bGVOYW1lIiBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoaW5ncy4KU2VlIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgZm9yIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGdldCB0aGluZ3MKdG8gd29yay4KCjQuICBQeXRob24xLjMKClRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugc3VwcG9ydGluZyBQeXRob24uICAgIFRoZSBQeXRob24gcG9ydCBpcwpleHBlcmltZW50YWwgYW5kIG1heSBiZSByZXdyaXR0ZW4uICAgVmFyaWFibGUgbGlua2FnZSBpcyBkb25lIHRocm91Z2gKZnVuY3Rpb25zIHdoaWNoIGlzIHNvcnQgb2YgYSBrbHVkZ2UuICBJIGFsc28gdGhpbmsgaXQgd291bGQgYmUgbmljZQp0byBpbXBvcnQgU1dJRyBwb2ludGVycyBpbnRvIFB5dGhvbiBhcyBhIG5ldyBvYmplY3QgKGluc3RlYWQgb2Ygc3RyaW5ncykuCk9mIGNvdXJzZSwgdGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsuCgo1LiAgR3VpbGUzCgpJZiB5b3UgcmVhbGx5IHdhbnQgdG8gbGl2ZSBvbiB0aGUgZWRnZSwgcGljayB1cCBhIGNvcHkgb2YgR3VpbGUtaWlpIGFuZApwbGF5IGFyb3VuZCB3aXRoIHRoaXMuICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsLS0tZXNwZWNpYWxseSBzaW5jZQpJJ20gbm90IHN1cmUgd2hhdCB0aGUgb2ZmaWNpYWwgc3RhdGUgb2YgR3VpbGUgaXMgdGhlc2UgZGF5cy4gIFRoaXMKaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBzaG91bGQgSSBzdWRkZW5seSBmaWd1cmUgb3V0IGJldHRlcgp3YXlzIHRvIGRvIHRoaW5ncy4KCjYuICBFeHRlbmRpbmcgU1dJRwoKU1dJRyBpcyB3cml0dGVuIGluIEMrKyBhbHRob3VnaCBJIHRlbmQgdG8gdGhpbmsgb2YgdGhlIGNvZGUgYXMgbW9zdGx5CmJlaW5nIEFOU0kgQyB3aXRoIGEgbGl0dGxlIGluaGVyaXRhbmNlIHRocm93biBpbi4gICBFYWNoIHRhcmdldCBsYW5ndWFnZQppcyBpbXBsZW1lbnRlZCBhcyBhIEMrKyBjbGFzcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KSWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMsIHNlZSBBcHBlbmRpeCBDIG9mIHRoZSB1c2VyCm1hbnVhbC4gICBUaGVuIHRha2UgYSBsb29rIGF0IHRoZSAidXNlciIgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvbWUKY29kZSBmb3IgYnVpbGRpbmcgeW91ciBvd24gZXh0ZW5pb25zLgoKNy4gVGhlIFNXSUcgbGlicmFyeQoKVGhlIFNXSUcgbGlicmFyeSBpcyBzdGlsbCBpbmNvbXBsZXRlLiAgU29tZSBvZiB0aGUgZmlsZXMgbWVudGlvbmVkIGluCnRoZSB1c2VyIG1hbnVhbCBhcmUgdW5hdmFpbGFibGUuICAgIFRoZXNlIGZpbGVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKd2hlbiB0aGV5IGFyZSByZWFkeS4gICBTdWJzY3JpYmUgdG8gdGhlIFNXSUcgbWFpbGluZyBsaXN0IGZvciBhbm5vdW5jZW1lbnRzCmFuZCB1cGRhdGVzLgoKOC4gU1dJRyBEb2N1bWVudGF0aW9uCgpJIGhhdmUgc29tZXRpbWVzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHZpZXdpbmcgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBpbgpzb21lIHBvc3RzY3JpcHQgdmlld2Vycy4gICBIb3dldmVyLCB0aGUgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBwcmludApub3JtYWxseS4gICAgSSdtIHdvcmtpbmcgb24gbWFraW5nIG11Y2ggb2YgdGhlIGRvY3VtZW50YXRpb24gb25saW5lLApidXQgdGhpcyB0YWtlcyB0aW1lLgoKVmVyc2lvbiAwLjEgQWxwaGEgKEZlYnJ1YXJ5IDksIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIFJ1bi10aW1lIHR5cGUtY2hlY2tpbmcgb2YgU1dJRyBwb2ludGVycy4gICBQb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkCiAgICBhcyBzdHJpbmdzIHdpdGggYm90aCBudW1lcmljIGFuZCBlbmNvZGVkIHR5cGUgaW5mb3JtYXRpb24uICAgIFRoaXMgbWFrZXMKICAgIGl0IGEgbGl0dGxlIGhhcmRlciB0byBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCAoYW5kIGl0IGVsaW1pbmF0ZXMKICAgIHNvbWUgc2VnbWVudGF0aW9uIGZhdWx0cyBhbmQgb3RoZXIgb2RkaXRpZXMpLgoKMi4gIFB5dGhvbiAxLjMgbm93IHN1cHBvcnRlZC4KCjMuICAjZGVmaW5lIGFuZCBlbnVtIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwgY29uc3RhbnRzLgoKNC4gIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgJWluY2x1ZGUgZGlyZWN0aXZlIGFuZCBtYWRlIGl0IGFsb3QgbW9yZSBwb3dlcmZ1bC4KCjUuICBSZXN0cnVjdHVyZWQgdGhlIFNXSUcgbGlicmFyeSB0byBtYWtlIGl0IHdvcmsgYmV0dGVyLgoKNi4gIFZhcmlvdXMgYnVnIGZpeGVzIHRvIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgaW1wbGVtZW50YXRpb25zLgoKNy4gIEJldHRlciBpbXBsZW1lbnRhdGlvbiBvZiAldHlwZWRlZiBkaXJlY3RpdmUuCgo4LiAgTWFkZSBzb21lIGNoYW5nZXMgdG8gU1dJRydzIGNsYXNzIHN0cnVjdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBleHBhbmQuCiAgICBTV0lHIGlzIG5vdyBidWlsdCBpbnRvIGEgbGlicmFyeSBmaWxlIHRoYXQgeW91IGNhbiB1c2UgdG8gbWFrZSB5b3VyCiAgICBvd24gZXh0ZW5pb25zLgoKOS4gIE1hZGUgZXh0ZW5zaXZlIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50YXRpb24uCgoxMC4gTWlub3IgY2hhbmdlcyB0byB0aGUgU1dJRyBwYXJzZXIgdG8gbWFrZSBpdCB1c2UgbGVzcyBtZW1vcnkuCiAgICBBbHNvIHRvb2sgb3V0IHNvbWUgZXh0cmFuZW91cyBydWxlcyB0aGF0IHdlcmUgdW5kb2N1bWVudGVkIGFuZAogICAgZGlkbid0IHdvcmsgaW4gdGhlIGZpcnN0IHBsYWNlLgoKMTEuIFRoZSBTV0lHIGxpYnJhcnkgZmlsZXMgInRjbHNoIiwgIndpc2giLCAiZXhwZWN0IiwgZXRjLi4uIGluIHRoZSBmaXJzdAogICAgcmVsZWFzZSBoYXZlIGJlZW4gcmVzdHJ1Y3R1cmVkIGFuZCByZW5hbWVkIHRvICJ0Y2xzaC5pIiwgIndpc2guaSIsCiAgICBhbmQgc28gb24uCg==