U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCgpWZXJzaW9uIDMuMC4xMCAoMTIgSnVuIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMDYtMDY6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2OTguIEFkZCBzdXBwb3J0IGZvciAtcmVsYXRpdmVpbXBvcnQgZm9yIHB5dGhvbiAyLjcsIHNvIC1weTMgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIGFsc28gcmVxdWlyZWQgZm9yIHJlbGF0aXZlIGltcG9ydCBzdXBwb3J0LgoKMjAxNi0wNi0wNTogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzY5NCAtIEZpeCBwYWNrYWdlIGltcG9ydCByZWdyZXNzaW9ucyBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjkuCgogICAgICAgICAgICAxKSBUaGUgY29kZSBpbiAzLjAuOSBkaWQgbm90IGZhbGwgYmFjayB0byAnaW1wb3J0IF9mb28nIGlmICdpbXBvcnQgYmFyLl9mb28nIGZhaWxlZAogICAgICAgICAgICAoYXNzdW1pbmcgYmFyLmZvbyB3YXMgdGhlIG1haW4gbW9kdWxlKS4gRXZlcnkgcGxhY2UgX2ZvbyBpcyBpbXBvcnRlZCBub3cgZmlyc3QgdHJpZXMKICAgICAgICAgICAgaXQgZnJvbSB0aGUgcGFja2FnZSB3aGVyZSBmb28gd2FzIGZvdW5kIGFuZCBpZiB0aGF0IGZhaWxzIHRyaWVzIF9mb28gYXMgYSBnbG9iYWwgbW9kdWxlLgoKICAgICAgICAgICAgMikgVGhlIHNlcGFyYXRlIGJsb2NrIG9mIFB5dGhvbiBjb2RlIHRoYXQgaW5qZWN0ZWQgY29kZSB0byBwdWxsIGluIHRoZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZyb20gX2ZvbyB3aGVuIC1idWlsdGluIGlzIHVzZWQgbWFkZSB1c2Ugb2YgdGhlIC1weTMgc3dpdGNoIHRvIGVpdGhlciBkbwogICAgICAgICAgICAnZnJvbSAuX2ZvbyBpbXBvcnQgKicgb3IgImZyb20gX2ZvbyBpbXBvcnQgKiIuIFRoaXMgYmxvY2sgb2YgY29kZSBubyBsb25nZXIgZG9lcyB0aGlzCiAgICAgICAgICAgIGFuZCBpbnN0ZWFkIGNoZWNrcyB0aGUgUHl0aG9uIHZlcnNpb24gYXQgcnVudGltZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSwgc3dpZy0zLjAuMTAgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZWFzZSB0aGUgY3JlYXRpb24gb2Ygd3JhcHBlciBtb2R1bGVzCiAgICAgICAgICAgIHRoYXQgY2FuIGJlIGZ1bGx5IG1hZGUgcGFydCBvZiBhIFB5dGhvbiBwYWNrYWdlLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgYXNzdW1lcyB0aGUgZHluYW1pY2FsbHkgbGlua2VkIEMgbW9kdWxlIGlzIGEgZ2xvYmFsIG1vZHVsZS4KICAgICAgICAgICAgVGhlIGR5bmFtaWMgbW9kdWxlIGNhbiBub3cgYmUgcGxhY2VkIGludG8gZWl0aGVyIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHB1cmUgUHl0aG9uCiAgICAgICAgICAgIG1vZHVsZSBvciBhcyBhIGdsb2JhbCBtb2R1bGUuICBCb3RoIGxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgUHl0aG9uIHdyYXBwZXIgdG8KICAgICAgICAgICAgbG9jYXRlIHRoZSBDIG1vZHVsZS4KCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgY291bGQgY2F1c2UgYSBiYWNrd2FyZHMgaW5jb21wYXRpYmlsaXR5IHdpdGggc29tZSBjb2RlCiAgICAgICAgICAgIHRoYXQgd2FzIHJlbHlpbmcgb24gdGhlIGFiaWxpdHkgb2YgImZyb20gcGFja2FnZSBpbXBvcnQgX21vZHVsZSIgdG8KICAgICAgICAgICAgcHVsbCBhdHRyaWJ1dGVzIG91dCBvZiB0aGUgcGFja2FnZSBkaXJlY3RseS4gIElmIHlvdXIgY29kZSBwb3B1bGF0ZXMgYQogICAgICAgICAgICBtb2R1bGUgKHdoaWNoIGlzIGFsc28gYSBwYWNrYWdlKSB3aXRoIGF0dHJpYnV0ZXMgdGhhdCBhcmUgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB3aGljaCB3ZXJlIG5vdCBsb2FkZWQgaW4gYSBjb252ZW50aW9uYWwgd2F5LAogICAgICAgICAgICBzd2lnLTMuMC44IGFuZCBlYXJsaWVyIG1heSBoYXZlIHdvcmtlZCBkdWUgdG8gJ2Zyb20gcGFja2FnZSBpbXBvcnQKICAgICAgICAgICAgX21vZHVsZScgYnlwYXNzaW5nIGEgcmVhbCBpbXBvcnQgYW5kIHB1bGxpbmcgeW91ciBtb2R1bGUgaW4gYXMgYW4KICAgICAgICAgICAgYXR0cmlidXRlLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuICBTaW5jZSB0aGlzIGlzIG5vdCBhIGNvbW1vbiAob3IKICAgICAgICAgICAgZXZlbiByZWNvbW1lbmRlZCkgcHJhY3RpY2UsIG1vc3QgZm9sayBzaG91bGQgbm90IGJlIGFmZmVjdGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTA1LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzY5MCAtIFNtYXJ0IHBvaW50ZXIgdG8gJWlnbm9yZWQgY2xhc3MgZG9lc24ndCBleHBvc2UgaW5oZXJpdGVkIG1ldGhvZHMuCiAgICAgICAgICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgoKVmVyc2lvbiAzLjAuOSAoMjkgTWF5IDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNi0wNS0yNDogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMiAtIEFkZCBzdXBwb3J0IGZvciBQeXRob24ncyBpbXBsaWNpdCBuYW1lc3BhY2UgcGFja2FnZXMuCgoyMDE2LTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICM2MDIgLSBFcnJvciBoYW5kbGluZyByZWdyZXNzaW9uIG9mIG9wYXF1ZSBwb2ludGVycyBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIHN3aWctMy4wLjggd2hlbiBDIGZ1bmN0aW9ucyBleHBsaWNpdGx5IHJlc2V0IGEgcG9pbnRlciB1c2luZyAnREFUQV9QVFIoc2VsZikgPSAwJy4KICAgICAgICAgICAgQW4gT2JqZWN0UHJldmlvdXNseURlbGV0ZWQgZXJyb3Igd2FzIGluY29ycmVjdGx5IHRocm93biB3aGVuIHRoZSBwb2ludGVyIHdhcyB1c2VkCiAgICAgICAgICAgIGFzIGEgcGFyYW1ldGVyLgoKMjAxNi0wNS0xNzogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNjUxIC0gQ29ycmVjdCBvdmVybG9hZGVkIGZ1bmN0aW9uIGVycm9yIG1lc3NhZ2Ugd2hlbiBmdW5jdGlvbiBpcwogICAgICAgICAgICB1c2luZyAlbmV3b2JqZWN0LgoKMjAxNi0wNS0xNzogYXVyZWxqCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNTgyIC0gYWRkIHN1cHBvcnQgZm9yIGRvY3N0cmluZyBvcHRpb24gaW4gJW1vZHVsZSgpCgoyMDE2LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQzNCAtIFBhc3NpbmcgY2xhc3NlcyBieSB2YWx1ZSBhcyBwYXJhbWV0ZXJzIGluIGRpcmVjdG9yIG1ldGhvZHMgZGlkIG5vdCBjcmVhdGUKICAgICAgICAgICAgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCBsZWFkaW5nIHRvIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzIGlmIHRoZSBvYmplY3Qgd2FzIHVzZWQKICAgICAgICAgICAgYWZ0ZXIgdGhlIHVwY2FsbCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFBhc3NpbmcgYXJndW1lbnRzIGJ5IHZhbHVlIHNob3VsZG4ndCBnaXZlCiAgICAgICAgICAgIHJpc2UgdG8gdGhlc2Ugc29ydHMgb2YgbWVtb3J5IHByb2JsZW1zIGFuZCBzbyB0aGUgb2JqZWN0cyBhcmUgbm93IGNvcGllZCBhbmQgb3duZXJzaGlwCiAgICAgICAgICAgIG9mIHRoZWlyIGxpZmV0aW1lIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTYtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjExLiBGaXggYXNzZXJ0aW9uIGhhbmRsaW5nIGRlZmF1bHRhcmdzIHdoZW4gdXNpbmcgJWV4dGVuZCBmb3IgYSB0ZW1wbGF0ZQogICAgICAgICAgICBjbGFzcyBhbmQgdGhlIGV4dGVuZGVkIG1ldGhvZHMgY29udGFpbiBkZWZhdWx0IGFyZ3VtZW50cy4KCjIwMTYtMDUtMDU6IGVqdWxpYW4KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxNy4gRml4IG9wZXJhdG9yLyB3cmFwcGVycy4KCjIwMTYtMDUtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjY5LiBEb24ndCBpc3N1ZSB3YXJuaW5nIGFib3V0IGlnbm9yaW5nIGJhc2UgY2xhc3NlcyB3aGVuIHRoZSBkZXJpdmVkIGNsYXNzIGlzCiAgICAgICAgICAgIGl0c2VsZiBpZ25vcmVkLgoKMjAxNi0wNC0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeCB1c2Ugb2YgZ29vdXQgdHlwZW1hcCB3aGVuIGNhbGxpbmcgYmFzZSBtZXRob2QgYnkKCSAgICBmb3JjaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlIHRvIHRoZSB2YWx1ZSB3ZSBuZWVkLgoKMjAxNi0wNC0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeGVzIGZvciBHbyAxLjY6IGF2b2lkIHJldHVybmluZyBHbyBwb2ludGVycyBmcm9tCgkgICAgZGlyZWN0b3JzIHRoYXQgcmV0dXJuIHN0cmluZyB2YWx1ZXM7IGFkZCBhIHRyYWlsaW5nIDAgYnl0ZQoJICAgIHdoZW4gdHJlYXRpbmcgR28gc3RyaW5nIGFzIEMgY2hhciouCgoyMDE2LTA0LTA2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdICM1NTIgTWFrZSBTY2lsYWIgcnVudGltZSBrZWVwIHRyYWNrIG9mIHBvaW50ZXIgdHlwZXMKICAgICAgICAgICAgSW5zdGVhZCBvZiBhIFNjaWxhYiBwb2ludGVyIHdoaWNoIGhhcyBubyB0eXBlLCBTV0lHIFNjaWxhYiBtYXBzIGEKICAgICAgICAgICAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0bGlzdCBjb250YWluaW5nIHRoZSBwb2ludGVyIGFkcmVzcyBhbmQgaXRzIHR5cGUuCgoyMDE2LTA0LTAyOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5ICM1OTguIEZpeCBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYSBub24tZXhpc3RlbnQKICAgICAgICAgICAgYXR0cmlidXRlLiBUaGUgcHJldmlvdXMgY3J5cHRpYyBlcnJvciBtZXNzYWdlOgogICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiB0eXBlIG9iamVjdCAnb2JqZWN0JyBoYXMgbm8gYXR0cmlidXRlICdfX2dldGF0dHJfXycKICAgICAgICAgICAgaXMgbm93IHJlcGxhY2VkIHdpdGggb25lIG1lbnRpb25pbmcgdGhlIGF0dHJpYnV0ZSBuYW1lLCBlZzoKICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogJ0Zvbycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ2JhcicKCjIwMTYtMDQtMDI6IGRlcmt1Y2kKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMCB0byBmaXggIzYwNy4KICAgICAgICAgICAgRml4IHNpbmdsZSBhcmd1bWVudHMgd2hlbiB1c2luZyBweXRob24gLWJ1aWx0aW4gLU8gd2l0aCAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikKCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzICM1OTQuIEZpeCBhc3NlcnRpb24gZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZW4gd3JhcHBpbmcgYSBDKysxMSBlbnVtIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgcHJpdmF0ZSBpbiBhIGNsYXNzLgoKICAgICAgICAgICAgQWxzbyBkb24ndCB3cmFwIHByaXZhdGUgZW51bXMgZm9yIGEgZmV3IGxhbmd1YWdlcyB0aGF0IGF0dGVtcHRlZCB0byBkbyBzby4KCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSB1bnNpZ25lZCBsb25nIGxvbmcgbWFyc2hhbGxpbmcgaW1wcm92ZW1lbnRzIHdoZW4gYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgICAgICAgaXMgcGFzc2VkIGZyb20gSmF2YSB0byBDLiBBIGNhc3QgdG8gc2lnbmVkIGxvbmcgbG9uZyBpbiB0aGUgQyBsYXllciB3aWxsIG5vdwogICAgICAgICAgICByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIHZhbHVlLiBObyBjaGFuZ2UgZm9yIHBvc2l0aXZlIG51bWJlcnMgcGFzc2VkIHRvIEMuCiAgICAgICAgICAgIEZpeGVzICM2MjMuCgoyMDE2LTAzLTIyOiBhbGV4d2FyZwoJICAgIFtMdWFdICMzOTggRml4IGx1YSBfX2dldGl0ZW0gKyBpbmhlcml0YW5jZQogICAgICAgICAgICBUaGUgbmV3IGhhbmRsaW5nIG9mIGNsYXNzZXMgaW4gTHVhIChub3QgbWVyZ2luZyBtZXRob2RzIGludG8gdGhlIGRlcml2ZWQgY2xhc3NlcykKICAgICAgICAgICAgYnJlYWtzIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhIF9fZ2V0aXRlbSBmdW5jdGlvbi4gVGhlIF9fZ2V0aXRlbSBmdW5jdGlvbgogICAgICAgICAgICBwcmV2ZW50cyBtZXRob2QgY2FsbHMgdG8gYW55IG1ldGhvZCBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcy4gVGhpcyBmaXggY2FsbHMKICAgICAgICAgICAgX19nZXRpdGVtIG9ubHkgaWYgdGhlIG1lbWJlciBpcyBub3QgZm91bmQgdXNpbmcgcmVjdXJzaXZlIGxvb2t1cC4KCjIwMTYtMDMtMTg6IHB0b211bGlrCgkgICAgW1B5dGhvbl0gIzU2MyBTdG9wIGdlbmVyYXRpbmcgdW5uZWNlc3NhcnkgX3N3aWdjb25zdGFudCBoZWxwZXJzLgoKMjAxNi0wMy0xNjogcmljaGFyZGJlYXJlCgkgICAgW1JdICM2MzYgQWRkIGV4dHJhIHN0ZDo6dmVjdG9yIG51bWVyaWMgdHlwZXMKCjIwMTYtMDMtMTQ6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBzdGRfYXJyYXkuaSBmb3IgQysrMTEgc3RkOjphcnJheSBzdXBwb3J0LgoKMjAxNi0wMy0xMjogd3NmdWx0b24KCSAgICBbSmF2YSwgQyMsIERdIEZpeCBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZXJzIHdpdGggJWphdmFjb25zdCgxKQogICAgICAgICAgICAlY3Njb25zdCgxKSBvciAlZG1hbmlmZXN0Y29uc3QuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgdGhlIGNhc2Ugd2hlbiBhbiBpbnRlZ2VyIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxpemVyLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVyB7IHN0YXRpYyBjb25zdCBjaGFyIHcgPSAxMDA7IH07CgoJICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBwYXJzaW5nIGVudW0gdmFsdWVzIHVzaW5nIGNoYXIgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICB3aGVuIHRoZXNlIHZhbHVlcyBhcHBlYXIgaW4gdGhlIEphdmEgY29kZSAodXN1YWxseSB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkpCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGVudW0gWCB7IHgxID0gJ1xuJywgeDIgPSAnXDEnIH07CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgY2hhciB2YXJpYWJsZXMgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFkgeyBzdGF0aWMgY29uc3QgY2hhciB5ID0gJ1xuJzsgfQoKICAgICAgICAgICAgTGlrZXdpc2UgZm9yIEQgYW5kICVkbWFuaWZlc3Rjb25zdGFudC4gRm9yIEMjIGFuZCAlY3Njb25zdCgxKSwgY2hhcgogICAgICAgICAgICB2YWx1ZXMgaW4gQyMgYXJlIG5vdyBoZXggZXNjYXBlZCBhcyBDIyBkb2Vzbid0IHN1cHBvcnQgQyBvY3RhbCBlc2NhcGluZy4KCjIwMTYtMDMtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBBZGQgc3VwcG9ydCBmb3IgdHJlYXRpbmcgQysrIGJhc2UgY2xhc3NlcyBhcyBKYXZhIGludGVyZmFjZXMKICAgICAgICAgICAgaW5zdGVhZCBvZiBKYXZhIHByb3h5IGNsYXNzZXMuIFRoaXMgZW5hYmxlIHNvbWUgc29ydCBvZiBzdXBwb3J0IGZvcgogICAgICAgICAgICBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIHN3aWdpbnRlcmZhY2UuaSBhbmQKICAgICAgICAgICAgcHJvdmlkZXMgYWRkaXRpb25hbCBtYWNyb3MgKHNlZSBKYXZhLmh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbik6CgogICAgICAgICAgICAgICVpbnRlcmZhY2UoQ1RZUEUpCiAgICAgICAgICAgICAgJWludGVyZmFjZV9pbXBsKENUWVBFKQogICAgICAgICAgICAgICVpbnRlcmZhY2VfY3VzdG9tKCJQUk9YWSIsICJJTlRFUkZBQ0UiLCBDVFlQRSkKCjIwMTYtMDMtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCByc3RyaXAgZW5jb2RlciBmb3IgdXNlIGluICVyZW5hbWUuIFRoaXMgaXMgbGlrZSB0aGUgc3RyaXAgZW5jb2RlciBidXQKICAgICAgICAgICAgc3RyaXBzIHRoZSBzeW1ib2wncyBzdWZmaXggaW5zdGVhZCBvZiB0aGUgcHJlZml4LiBUaGUgZXhhbXBsZSBiZWxvdwogICAgICAgICAgICB3aWxsIHJlbmFtZSBTb21lVGhpbmdDbHMgdG8gU29tZVRoaW5nIGFuZCBBbm90aGVyVGhpbmdDbHMgdG8gQW5vdGhlclRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHJzdHJpcDpbQ2xzXSlzIikgIiI7CgogICAgICAgICAgICAgIGNsYXNzIFNvbWVUaGluZ0NscyB7fTsKICAgICAgICAgICAgICBzdHJ1Y3QgQW5vdGhlclRoaW5nQ2xzIHt9OwoKMjAxNi0wMy0wMTogb2xseQoJICAgIEZpeCBpc2Zpbml0ZSgpIGNoZWNrIHRvIHdvcmsgd2l0aCBHQ0M2LiAgRml4ZXMKCSAgICBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy82MTUgcmVwb3J0ZWQgYnkganBsZXNuaWsuCgoyMDE2LTAyLTE3OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkIG1pc3Npbmcga2V5d29yZHMgJ2FzJyBhbmQgJ3dpdGgnIHRvIHB5dGhvbmt3LnN3Zy4KCjIwMTYtMDItMDc6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gcmVjb2duaXNlIHZhcmlvdXMgdW5hcnkgZnVuY3Rpb25zCiAgICAgICAgICAgICogVXNlIF9fZmxvYXRfXygpIGZvciBudW1lcmljIGNvbnZlcnNpb25zLCBlLmcuIHdoZW4gY2FsbGluZyBkb3VibGUoKQogICAgICAgICAgICAqIE1hcCB2YXJpb3VzIHVuYXJ5IGZ1bmN0aW9ucywgZS5nLiBhYnMoKSB0byBfX2Fic19fKCksIHNlZSBmdWxsIGxpc3QKICAgICAgICAgICAgICBpbiBzZWN0aW9uIDMyLjMuMTAgb2YgbWFudWFsOyBvbmx5IGF2YWlsYWJsZSBpbiBPY3RhdmUgMy44LjAgb3IgbGF0ZXIKCjIwMTYtMDItMDc6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gZXhwb3J0IGZ1bmN0aW9uIHN3aWdfb2N0YXZlX3ByZXJlcSgpIGZvciB0ZXN0aW5nIE9jdGF2ZSB2ZXJzaW9uCgoyMDE2LTAyLTA2OiBwam9oYW5ndXN0YXZzc29uCiAgICAgICAgICAgIFtDI10gRml4IGR1cGxpY2F0ZSBzeW1ib2wgcHJvYmxlbXMgd2hlbiBsaW5raW5nIHRoZSBzb3VyY2UgZ2VuZXJhdGVkCiAgICAgICAgICAgIGZyb20gbXVsdGlwbGUgU1dJRyBtb2R1bGVzIGludG8gb25lIHNoYXJlZCBsaWJyYXJ5IGZvciB0aGUgLW5hbWVzcGFjZQogICAgICAgICAgICBvcHRpb24uIFRoZSBuYW1lc3BhY2UgaXMgbm93IG1hbmdsZWQgaW50byB0aGUgZ2xvYmFsIFBJbnZva2UgZnVuY3Rpb24KICAgICAgICAgICAgbmFtZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMDEtMjc6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gUHl0aG9uIEJ5dGVzCiAgICAgICAgICAgIGFuZCBVbmljb2RlIG9iamVjdHMgdXNpbmcgYnkgZGVmaW5pbmcgU1dJR19QWVRIT05fU1RSSUNUX0JZVEVfQ0hBUgogICAgICAgICAgICBhbmQgU1dJR19QWVRIT05fU1RSSUNUX1VOSUNPREVfV0NIQVIuCgoyMDE2LTAxLTI3OiBzdGVldmUKICAgICAgICAgICAgW0dvXSBFbnN1cmUgc3RydWN0cyBhcmUgcHJvcGVybHkgcGFja2VkIGJldHdlZW4gZ2MgYW5kIEdDQy9jbGFuZy4KCjIwMTYtMDEtMjU6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gU3VwcG9ydCB0aGUgZnVsbCBQeXRob24gdGVzdCBzdWl0ZSBpbiAtY2xhc3NpYyBtb2RlCiAgICAgICAgICAgICogQ29udmVydCBsb25nL3Vuc2lnbmVkIGxvbmcvbG9uZyBsb25nL3Vuc2lnbmVkIGxvbmcgbG9uZyB0byBQeUludAogICAgICAgICAgICAgIHJhdGhlciB0aGFuIFB5TG9uZyB3aGVuIHBvc3NpYmxlLiBDZXJ0YWluIHB5dGhvbiBmdW5jdGlvbnMgbGlrZQogICAgICAgICAgICAgIGxlbigpIHJlcXVpcmUgYSBQeUludCB3aGVuIG9wZXJhdGluZyBvbiBvbGQtc3R5bGUgY2xhc3Nlcy4KICAgICAgICAgICAgKiBBZGQgc3VwcG9ydCBmb3Igc3RhdGljIG1ldGhvZHMgaW4gY2xhc3NpYyBtb2RlLCBpbmNsdWRpbmcgc3VwcG9ydAogICAgICAgICAgICAgIGZvciBweXRob25hcHBlbmQsIHB5dGhvbnByZXBlbmQsIGFuZCBkb2NzdHJpbmdzLgogICAgICAgICAgICAqIFJlbW92aW5nIHRoZSB1c2Ugb2YgX19zd2lnX2dldG1ldGhvZHNfXyBmb3Igc3RhdGljIG1lbWJlciBtZXRob2RzCiAgICAgICAgICAgICAgc2luY2UgdGhleSB3aWxsIGFsd2F5cyBiZSBmb3VuZCBieSB0aGUgc3RhbmRhcmQgYXJndW1lbnQgbG9va3VwCiAgICAgICAgICAgICogRml4IGEgYnVnIHdoZXJlIHRoZSB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IHdoZW4KICAgICAgICAgICAgICBjaGVja2luZyBmb3IgbmV3LXN0eWxlIGNsYXNzIHN1cHBvcnQKCjIwMTYtMDEtMjM6IGFobm9sZHMKICAgICAgICAgICAgW0dvXSBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEdvIHRlc3Qtc3VpdGUgb24gT1NYOgogICAgICAgICAgICAqIFRoZSBsaW5rZXIgb24gT1NYIHJlcXVpcmVzIHRoYXQgYWxsIHN5bWJvbHMgKGV2ZW4gd2VhayBzeW1ib2xzKQogICAgICAgICAgICAgIGFyZSBkZWZpbmVkIGF0IGxpbmsgdGltZS4gQmVjYXVzZSB0aGUgZnVuY3Rpb24gX2Nnb190b3BvZnN0YWNrIGlzCiAgICAgICAgICAgICAgb25seSBkZWZpbmVkIHN0YXJ0aW5nIGluIEdvIHZlcnNpb24gMS40LCB3ZSBleHBsaWNpdGx5IG1hcmsgaXQgYXMKICAgICAgICAgICAgICB1bmRlZmluZWQgZm9yIG9sZGVyIHZlcnNpb25zIG9mIEdvIG9uIE9TWC4KICAgICAgICAgICAgKiBBdm9pZCB3cml0aW5nIGVtcHR5IHN3aWdhcmdzIHN0cnVjdHMsIHNpbmNlIGVtcHR5IHN0cnVjdHMgYXJlIG5vdAogICAgICAgICAgICAgIGFsbG93ZWQgaW4gZXh0ZXJuICJDIiBibG9ja3MuCgoyMDE2LTAxLTEyOiBvbGx5CgkgICAgW0phdmFzY3JpcHRdIExvb2sgZm9yICJub2RlanMiIGFzIHdlbGwgYXMgIm5vZGUiLCBhcyBpdCdzIHBhY2thZ2VkCgkgICAgYXMgdGhlIGZvcm1lciBvbiBEZWJpYW4uCgoyMDE2LTAxLTEyOiBvbGx5CgkgICAgW0phdmFzY3JpcHRdIEZvciB2OCA+PSA0LjMuMCwgdXNlIFY4X01BSk9SX1ZFUlNJT04uCgkgICAgRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3N3aWcvc3dpZy9pc3N1ZXMvNTYxLgoKMjAxNi0wMS0xMDogYWhub2xkcwogICAgICAgICAgICBJbXByb3ZlZCBzaXplX3QgYW5kIHB0cmRpZmZfdCB0eXBlbWFwcyB0byBzdXBwb3J0IGxhcmdlIHZhbHVlcwogICAgICAgICAgICBvbiBwbGF0Zm9ybXMgd2hlcmUgc2l6ZW9mKHNpemVfdCkgPiBzaXplb2YodW5zaWduZWQgbG9uZykgYW5kCiAgICAgICAgICAgIHNpemVvZihwdHJkaWZmX3QpID4gc2l6ZW9mKGxvbmcpLgoKVmVyc2lvbiAzLjAuOCAoMzEgRGVjIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0xMi0zMDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHBkZiBkb2N1bWVudGF0aW9uIGlzIG5vdyBnZW5lcmF0ZWQgYnkgd2todG1sdG9wZGYgYW5kIGhhcyBjb2xvdXIKICAgICAgICAgICAgZm9yIHRoZSBjb2RlIHNuaXBwZXRzIGp1c3QgbGlrZSB0aGUgaHRtbCBkb2N1bWVudGF0aW9uIQoKMjAxNS0xMi0yMzogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBGaXhlcyBmb3IgY29udmVyc2lvbiBvZiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXIgdHlwZXM6CgogICAgICAgICAgICBObyBsb25nZXIgY2hlY2sgZm9yIFB5SW50IG9iamVjdHMgaW4gUHl0aG9uMy4gQmVjYXVzZSBQeUludF9DaGVjawogICAgICAgICAgICBhbmQgZnJpZW5kcyBhcmUgI2RlZmluZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHlMb25nIG1ldGhvZHMsIHRoaXMKICAgICAgICAgICAgaGFkIGNhdXNlZCBlcnJvcnMgaW4gUHl0aG9uMyB3aGVyZSB2YWx1ZXMgZ3JlYXRlciB0aGFuIHdoYXQgY291bGQgYmUKICAgICAgICAgICAgc3RvcmVkIGluIGEgbG9uZyB3ZXJlIGluY29ycmVjdGx5IGludGVycHJldGVkIGFzIHRoZSB2YWx1ZSAtMSB3aXRoCiAgICAgICAgICAgIHRoZSBQeXRob24gZXJyb3IgaW5kaWNhdG9yIHNldCB0byBPdmVyZmxvd0Vycm9yLiBUaGlzIGFwcGxpZXMgdG8KICAgICAgICAgICAgYm90aCB0aGUgY29udmVyc2lvbnMgUHlMb25nLT5sb25nIGFuZCBQeUxvbmctPmRvdWJsZS4KCiAgICAgICAgICAgIENvbnZlcnNpb24gZnJvbSBQeUxvbmcgdG8gbG9uZywgdW5zaWduZWQgbG9uZywgbG9uZyBsb25nLCBhbmQKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIG5vdyByYWlzZSBPdmVyZmxvd0Vycm9yIGluc3RlYWQgb2YgVHlwZUVycm9yIGluCiAgICAgICAgICAgIGJvdGggUHl0aG9uMiBhbmQgUHl0aG9uMyBmb3IgUHlMb25nIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZQogICAgICAgICAgICBleHByZXNzaWJsZSBieSB0aGUgY29ycmVzcG9uZGluZyBDIHR5cGUuIFRoaXMgbWF0Y2hlcyB0aGUgZXhpc3RpbmcKICAgICAgICAgICAgYmVoYXZpb3IgZm9yIG90aGVyIGludGVncmFsIHR5cGVzIChzaWduZWQgYW5kIHVuc2lnbmVkIGludHMsIHNob3J0cywKICAgICAgICAgICAgYW5kIGNoYXJzKSwgYXMgd2VsbCBhcyB0aGUgY29udmVyc2lvbiBmb3IgUHlJbnQgdG8gYWxsIG51bWVyaWMKICAgICAgICAgICAgdHlwZXMuIFRoaXMgYWxzbyBpbmRpcmVjdGx5IGFwcGxpZXMgdG8gdGhlIHNpemVfdCBhbmQgcHRyZGlmZl90CiAgICAgICAgICAgIHR5cGVzLCB3aGljaCBkZXBlbmQgb24gdGhlIGNvbnZlcnNpb25zIGZvciB1bnNpZ25lZCBsb25nIGFuZCBsb25nLgoKMjAxNS0xMi0xOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDIgVW5pY29kZSBVVEYtOCBzdHJpbmdzIGNhbiBiZSB1c2VkIGFzIGlucHV0cyB0byBjaGFyICogb3IKICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZXMgaWYgdGhlIGdlbmVyYXRlZCBDL0MrKyBjb2RlIGhhcyBTV0lHX1BZVEhPTl8yX1VOSUNPREUgZGVmaW5lZC4KCjIwMTUtMTItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlcyAjMjg2LCAjMTI4CiAgICAgICAgICAgIFJlbW92ZSBjY2FjaGUtc3dpZy4xIG1hbiBwYWdlIC0gcGxlYXNlIHVzZSB0aGUgQ0NhY2hlLmh0bWwgZG9jcyBpbnN0ZWFkLgogICAgICAgICAgICBUaGUgeW9kbDJtYW4gYW5kIHlvZGwyaHRtbCB0b29scyBhcmUgbm8gbG9uZ2VyIHVzZWQgYW5kIHNvIFNXSUcgbm8KICAgICAgICAgICAgbG9uZ2VyIGhhcyBhIGRlcGVuZGVuY3kgb24gdGhlc2UgcGFja2FnZXMgd2hpY2ggd2VyZSByZXF1aXJlZCB3aGVuCiAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZ2l0LgoKMjAxNS0xMi0xNjogenR1cm5lci9jb2xlYgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uMy41IGludGVycHJldGVyIGFzc2VydGlvbnMgd2hlbiBvYmplY3RzIGFyZSBiZWluZwogICAgICAgICAgICBkZWxldGVkIGR1ZSB0byBhbiBleGlzdGluZyBleGNlcHRpb24uIE1vc3Qgbm90YWJseSBpbiBnZW5lcmF0b3JzCiAgICAgICAgICAgIHdoaWNoIHRlcm1pbmF0ZSB1c2luZyBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uLiBGaXhlcyAjNTU5ICM1NjAgIzU3My4KICAgICAgICAgICAgSWYgYSBmdXJ0aGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQgZHVyaW5nIGFuIG9iamVjdCBkZXN0cnVjdGlvbiwKICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlIGlzIHVzZWQgb24gdGhpcyBzZWNvbmQgZXhjZXB0aW9uIGFuZCB0aGUKICAgICAgICAgICAgb3JpZ2luYWwgZXhjZXB0aW9uIGJ1YmJsZXMgdGhyb3VnaC4KCjIwMTUtMTItMTQ6IGFobm9sZHMvd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGluIG1pc3NpbmcgaW5pdGlhbGl6ZXJzIGZvciB0cF9maW5hbGl6ZSwKICAgICAgICAgICAgbmJfbWF0cml4X211bHRpcGx5LCBuYl9pbnBsYWNlX21hdHJpeF9tdWx0aXBseSwgaHRfcXVhbG5hbWUKICAgICAgICAgICAgaHRfY2FjaGVkX2tleXMgYW5kIHRwX3ByZXYuCgoyMDE1LTEyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU1RMIHdyYXBwZXJzIHRvIG5vdCBnZW5lcmF0ZSA8OiBkaWdyYXBocy4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgc3RkOjp2ZWN0b3I8OjpYOjpZPiB3YXMgc29tZXRpbWVzIGdlbmVyYXRlZCwgbm93CiAgICAgICAgICAgIGNvcnJlY3RlZCB0byBzdGQ6OnZlY3RvcjwgOjpYOjpZID4uCgoyMDE1LTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU1RMIHJhbmdlcyBhbmQgc2xpY2VzIGZpeGVzLgoKICAgICAgICAgICAgUnVieSBTVEwgY29udGFpbmVyIHNldHRpbmcgc2xpY2VzIGZpeGVzOgoKICAgICAgICAgICAgU2V0dGluZyBhbiBTVEwgY29udGFpbmVyIHdyYXBwZXIgc2xpY2UgYmV0dGVyIG1hdGNoZXMgdGhlIHdheSBSdWJ5CiAgICAgICAgICAgIGFycmF5cyB3b3JrLiBUaGUgYmVoYXZpb3VyIGlzIG5vdyB0aGUgc2FtZSBhcyBSdWJ5IGFycmF5cy4gVGhlIG9ubHkKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRoZSBkZWZhdWx0IHZhbHVlIHVzZWQgd2hlbiBleHBhbmRpbmcgYSBjb250YWluZXIKICAgICAgICAgICAgY2Fubm90IGJlIG5pbCBhcyB0aGlzIGlzIG5vdCBhIHZhbGlkIHR5cGUvdmFsdWUgZm9yIEMrKyBjb250YWluZXIKICAgICAgICAgICAgZWxlbWVudHMuCgogICAgICAgICAgICBPYnRhaW5pbmcgYSBSdWJ5IFNUTCBjb250YWluZXIgcmFuZ2VzIGFuZCBzbGljZXMgZml4ZXM6CgogICAgICAgICAgICBBY2Nlc3MgdmlhIHJhbmdlcyBhbmQgc2xpY2VzIG5vdyBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gUnVieSBhcnJheXMuCiAgICAgICAgICAgIFRoZSBmaXhlcyBhcmUgbW9zdGx5IGZvciBvdXQgb2YgcmFuZ2UgaW5kaWNlcyBhbmQgbGVuZ3Rocy4KICAgICAgICAgICAgLSBaZXJvIGxlbmd0aCBzbGljZSByZXF1ZXN0cyByZXR1cm4gYW4gZW1wdHkgY29udGFpbmVyIGluc3RlYWQgb2YgbmlsLgogICAgICAgICAgICAtIFNsaWNlcyB3aGljaCByZXF1ZXN0IGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyCiAgICAgICAgICAgICAgbm8gbG9uZ2VyIGNob3Agb2ZmIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICAgICAgIC0gUmFuZ2VzIHdoaWNoIHVzZWQgdG8gcmV0dXJuIG5pbCBub3cgcmV0dXJuIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlCiAgICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQgaXMgYSB2YWxpZCBpbmRleC4KCiAgICAgICAgICAgIFJ1YnkgU1RMIGNvbnRhaW5lciBuZWdhdGl2ZSBpbmRleGluZyBzdXBwb3J0IGltcHJvdmVkLgoKICAgICAgICAgICAgVXNpbmcgbmVnYXRpdmUgaW5kZXhlcyB0byBzZXQgdmFsdWVzIHdvcmtzIHRoZSBzYW1lIGFzIFJ1YnkgYXJyYXlzLCBlZwoKICAgICAgICAgICAgJXRlbXBsYXRlKEludFZlY3Rvcikgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIGl2ID0gSW50VmVjdG9yLm5ldyhbMSwyLDMsNF0pCiAgICAgICAgICAgIGl2Wy00XSA9IDkgIyA9PiBbMSwyLDMsOV0KICAgICAgICAgICAgaXZbLTVdID0gOSAjID0+IEluZGV4RXJyb3IKCjIwMTUtMTEtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEFkZCBzdGQ6OmFycmF5IGNvbnRhaW5lciB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZXNlIHdvcmsgbXVjaCBsaWtlIGFueSBvZiB0aGUgb3RoZXIgU1RMIGNvbnRhaW5lcnMgZXhjZXB0IFB5dGhvbi9SdWJ5IHNsaWNpbmcKICAgICAgICAgICAgaXMgc29tZXdoYXQgbGltaXRlZCBiZWNhdXNlIHRoZSBhcnJheSBpcyBhIGZpeGVkIHNpemUuIE9ubHkgc2xpY2VzIG9mCiAgICAgICAgICAgIHRoZSBmdWxsIHNpemUgYXJlIHN1cHBvcnRlZC4KCjIwMTUtMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM1MzkgLSBTdXBwb3J0IFB5dGhvbiAzLjUgYW5kIC1idWlsdGluLiAgUHlBc3luY01ldGhvZHMgaXMgYSBuZXcKICAgICAgICAgICAgbWVtYmVyIGluIFB5SGVhcFR5cGVPYmplY3QuCgoyMDE1LTEwLTA2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRG9uJ3QgZW1pdCBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBhIGRpcmVjdG9yCgkgICAgY2xhc3Mgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QsIHNpbmNlIHRoZSBmdW5jdGlvbiB3aWxsCgkgICAgYWx3YXlzIHBhbmljLgoKMjAxNS0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVzaGFyZWRfcHRyIHN1cHBvcnQgZm9yIHByaXZhdGUgYW5kIHByb3RlY3RlZCBpbmhlcml0YW5jZS4KICAgICAgICAgICAgLSBSZW1vdmUgdW5uZWNlc3NhcnkgV2FybmluZyA1MjA6IERlcml2ZWQgY2xhc3MgJ0Rlcml2ZWQnIG9mICdCYXNlJwogICAgICAgICAgICAgIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlcgogICAgICAgICAgICAtIERvIG5vdCBnZW5lcmF0ZSBjb2RlIHRoYXQgYXR0ZW1wdHMgdG8gY2FzdCB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gaW4gdGhlCiAgICAgICAgICAgICAgdHlwZSBzeXN0ZW0gcnVudGltZSBpbiBzdWNoIGNhc2VzIGFzIGl0IGRvZXNuJ3QgY29tcGlsZSBhbmQgY2FuJ3QgYmUgdXNlZC4KICAgICAgICAgICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHdhcm5pbmcgNTIwIGZvciAlc2hhcmVkX3B0ciB3aGVuIHRoZSBiYXNlIGNsYXNzIGlzIGlnbm9yZWQuCgoyMDE1LTEwLTAxOiB2a2FsaW5pbgogICAgICAgICAgICBGaXggIzUwODogRml4IHNlZ2ZhdWx0IHBhcnNpbmcgYW5vbnltb3VzIHR5cGVkZWYgbmVzdGVkIGNsYXNzZXMuCgoyMDE1LTA5LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQWRkIHNoYXJlZF9wdHIgc3VwcG9ydAoKMjAxNS0wOS0xMzoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gUmVzb2x2ZSB0cmFja2luZyBidWcgLSBpc3N1ZSAjMjI1LgogICAgICAgICAgICBUaGUgYnVnIGlzIHRoYXQgdGhlIHRyYWNraW5nIGNvZGUgdXNlcyBhIHJ1YnkgaGFzaCBhbmQgdGh1cyBtYXkKICAgICAgICAgICAgYWxsb2NhdGUgb2JqZWN0cyAoQmlnbnVtKSB3aGlsZSBydW5uaW5nIHRoZSBHQy4gVGhpcyB3YXMgdG9sZXJhdGVkIGluCiAgICAgICAgICAgIDEuOCBidXQgaXMgaW52YWxpZCAocmFpc2VzIGFuIGV4Y2VwdGlvbikgaW4gMS45LgogICAgICAgICAgICBUaGUgcGF0Y2ggdXNlcyBhIEMgaGFzaCAoYWxzbyB1c2VkIGJ5IHJ1YnkpIGluc3RlYWQuCgoyMDE1LTA5LTA5OiBseXplCiAgICAgICAgICAgIFtDRkZJXSBFeHRlbmQgdGhlICJleHBvcnQiIGZlYXR1cmUgaW4gdGhlIENGRkkgbW9kdWxlIHRvIHN1cHBvcnQKICAgICAgICAgICAgZXhwb3J0aW5nIHRvIGEgc3BlY2lmaWVkIHBhY2thZ2UuCgoyMDE1LTA5LTA0OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGRvY3N0cmluZ3MgZm9yICVjYWxsYmFjayBmdW5jdGlvbnMuCgoyMDE1LTA5LTAzOiBkZW1pLXJsdWRkeQogICAgICAgICAgICBbR29dIFJlbW92ZWQgZ29sYW5nIHN0cmluZ2luZyBmb3Igc2lnbmVkL3Vuc2lnbmVkIGNoYXIKCiAgICAgICAgICAgIENoYW5nZWQgZGVmYXVsdCBoYW5kbGluZyBvZiBzaWduZWQgY2hhciogYW5kIHVuc2lnbmVkIGNoYXIqIHRvIGJlCiAgICAgICAgICAgIG9wYXF1ZSBwb2ludGVycyByYXRoZXIgdGhhbiBzdHJpbmdzLCBzaW1pbGFybHkgdG8gaG93IG90aGVyCiAgICAgICAgICAgIGxhbmd1YWdlcyB3b3JrLgoKICAgICAgICAgICAgQW55IGV4aXN0aW5nIGNvZGUgcmVseWluZyBvbiB0cmVhdGluZyBzaWduZWQgY2hhciogb3IgdW5zaWduZWQKICAgICAgICAgICAgY2hhciogYXMgYSBzdHJpbmcgY2FuIHJlc3RvcmUgdGhlIG9sZCBiZWhhdmlvciB3aXRoIHR5cGVtYXBzLmkgYnkKICAgICAgICAgICAgdXNpbmcgJWFwcGx5IHRvIGNvcHkgdGhlIFt1bmNoYW5nZWRdIGNoYXIqIGJlaGF2aW9yLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE1LTA4LTA3OiB0YWxieQogICAgICAgICAgICBbUGVybF0gdGlkeSAtV3RhdXRvbG9naWNhbC1jb25zdGFudC1vdXQtb2YtcmFuZ2UtY29tcGFyZSB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIGdlbmVyYXRlZCBjb2RlIHVuZGVyIGNsYW5nCgoyMDE1LTA4LTA3OiB4YW50YXJlcwogICAgICAgICAgICBbUHl0aG9uXSBwZXAyNTcgJiBudW1weWRvYyBjb25mb3JtaW5nIGRvY3N0cmluZ3M6CiAgICAgICAgICAgIC0gTW9uby1saW5lIG1vZHVsZSBkb2Nzc3RyaW5nCiAgICAgICAgICAgIC0gUmV3cml0ZSBhdXRvZG9jIHBhcmFtZXRlcnMgc2VjdGlvbiBpbiBudW1weWRvYyBzdHlsZToKICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vbnVtcHkvbnVtcHkvYmxvYi9tYXN0ZXIvZG9jL0hPV1RPX0RPQ1VNRU5ULnJzdC50eHQKICAgICAgICAgICAgLSBPbmUgbGluZSBzdW1tYXJ5IHNob3VsZCBlbmQgd2l0aCAiLiIKICAgICAgICAgICAgLSBBZGRzIGEgYmxhbmsgbGluZSBhZnRlciBjbGFzcyBkb2NzdHJpbmcKCjIwMTUtMDgtMDU6IHZhZHoKICAgICAgICAgICAgW0phdmFdIE1ha2UgKGNoYXIqIFNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMgdXNhYmxlIGZvcgogICAgICAgICAgICBzdHJpbmdzIG9mIG90aGVyIHR5cGVzLCBlLmcuICJ1bnNpZ25lZCBjaGFyKiIuCgpWZXJzaW9uIDMuMC43ICgzIEF1ZyAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wOC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBwb3RlbnRpYWwgc2VjdXJpdHkgZXhwbG9pdCBpbiBnZW5lcmF0ZWQgSmF2YSBjbGFzc2VzLgogICAgICAgICAgICBUaGUgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBKYXZhCiAgICAgICAgICAgIGNsYXNzZXMgYXJlIG5vdyBkZWNsYXJlZCAndHJhbnNpZW50JyBieSBkZWZhdWx0LiBGdXJ0aGVyIGRldGFpbHMgb2YgdGhlIGV4cGxvaXQKICAgICAgICAgICAgaW4gQW5kcm9pZCBpcyBiZWluZyBwdWJsaXNoZWQgaW4gYW4gYWNhZGVtaWMgcGFwZXIgYXMgcGFydCBvZiBVU0VOSVggV09PVCAnMTU6CiAgICAgICAgICAgIGh0dHBzOi8vd3d3LnVzZW5peC5vcmcvY29uZmVyZW5jZS93b290MTUvd29ya3Nob3AtcHJvZ3JhbS9wcmVzZW50YXRpb24vcGVsZXMuCgogICAgICAgICAgICBJbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCB5b3UgYXJlIHJlbHlpbmcgb24gdGhlc2UgbWVtYmVycyBiZWluZyBzZXJpYWxpemFibGUsCiAgICAgICAgICAgIHRoZW4geW91IHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcwogICAgICAgICAgICB0byBnZW5lcmF0ZSB0aGUgb2xkIGdlbmVyYXRlZCBjb2RlLiBUaGUgcmVsZXZhbnQgdHlwZW1hcHMgYXJlIGluIHRoZSBMaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIGluIHRoZSBqYXZhLnN3ZywgYm9vc3Rfc2hhcmVkX3B0ci5pIGFuZCBib29zdF9pbnRydXNpdmVfcHRyLmkgZmlsZXMuIENvcHkgdGhlCiAgICAgICAgICAgIHJlbGV2YW50IGRlZmF1bHQgdHlwZW1hcHMgaW50byB5b3VyIGludGVyZmFjZSBmaWxlIGFuZCByZW1vdmUgdGhlICd0cmFuc2llbnQnIGtleXdvcmQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTUtMDgtMDE6IHZhZHoKICAgICAgICAgICAgTWFrZSBjb25maWd1cmUgLS13aXRob3V0LWFsbGxhbmcgb3B0aW9uIG1vcmUgdXNlZnVsOiBpdCBjYW4gbm93IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZvbGxvd2luZwogICAgICAgICAgICAtLXdpdGgteHh4IG9wdGlvbnMsIGFsbG93aW5nIHRvIGVhc2lseSBlbmFibGUganVzdCBvbmUgb3IgdHdvIGxhbmd1YWdlcy4KCjIwMTUtMDctMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDQwIC0gSW5pdGlhbGlzZSBhbGwgbmV3bHkgY3JlYXRlZCBhcnJheXMgd2hlbiB1c2luZyAlYXJyYXlfZnVuY3Rpb25zIGFuZCAlYXJyYXlfY2xhc3MKICAgICAgICAgICAgaW4gdGhlIGNhcnJheXMuaSBsaWJyYXJ5IC0gYnVnIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB1c2luZyBDKysuCgoyMDE1LTA3LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJbXByb3ZlIGluZGVudGF0aW9uIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIGZvciBjb2RlIGluIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgJXB5dGhvbnByZXBlbmQKICAgICAgICAgICAgICAlcHl0aG9uYXBwZW5kCiAgICAgICAgICAgICAgJXB5dGhvbmNvZGUKICAgICAgICAgICAgICAlcHl0aG9uYmVnaW4KICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikKCiAgICAgICAgICAgIE9sZCBlcnJvciBleGFtcGxlOgogICAgICAgICAgICAgIEVycm9yOiBMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCAobGluZSAzIG9mIHB5dGhvbmNvZGUpCgogICAgICAgICAgICBOZXcgZXJyb3IgZXhhbXBsZToKICAgICAgICAgICAgICBFcnJvcjogTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKGxpbmUgMyBvZiAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKICAgICAgICAgICAgICBhcyBubyBsaW5lIHNob3VsZCBiZSBpbmRlbnRlZCBsZXNzIHRoYW4gdGhlIGluZGVudGF0aW9uIGluIGxpbmUgMQoKICAgICAgICAgICAgT2xkIHdhcm5pbmcgZXhhbXBsZToKICAgICAgICAgICAgICBXYXJuaW5nIDc0MDogV2hpdGVzcGFjZSBwcmVmaXggZG9lc24ndCBtYXRjaCAobGluZSAyIG9mICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQoKICAgICAgICAgICAgTmV3IHdhcm5pbmcgZXhhbXBsZToKICAgICAgICAgICAgICBXYXJuaW5nIDc0MDogV2hpdGVzcGFjZSBpbmRlbnRhdGlvbiBpcyBpbmNvbnNpc3RlbnQgY29tcGFyZWQgdG8gZWFybGllciBsaW5lcyAobGluZSAzIG9mCiAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCgogICAgICAgICAgICAKMjAxNS0wNy0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICM0NzUuIEltcHJvdmUgZG9jc3RyaW5nIGluZGVudGF0aW9uIGhhbmRsaW5nLgogICAgICAgICAgICAKICAgICAgICAgICAgU1dJRy0zLjAuNSBhbmQgZWFybGllciBzb21ldGltZXMgdHJ1bmNhdGVkIHRleHQgcHJvdmlkZWQgaW4gdGhlIGRvY3N0cmluZyBmZWF0dXJlLgogICAgICAgICAgICBUaGlzIG9jY3VycmVkIHdoZW4gdGhlIGluZGVudGF0aW9uICh3aGl0ZXNwYWNlKSBpbiB0aGUgZG9jc3RyaW5nIHdhcyBsZXNzIGluIHRoZQogICAgICAgICAgICBzZWNvbmQgb3IgbGF0ZXIgbGluZXMgd2hlbiBjb21wYXJlZCB0byB0aGUgZmlyc3QgbGluZS4KICAgICAgICAgICAgU1dJRy0zLjAuNiBnYXZlIGEgJ0xpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkJyBlcnJvciBpbnN0ZWFkIG9mIHRydW5jYXRpbmcKICAgICAgICAgICAgdGhlIGRvY3N0cmluZyB0ZXh0LgogICAgICAgICAgICBOb3cgdGhlIGluZGVudGF0aW9uIGZvciB0aGUgJ2RvY3N0cmluZycgZmVhdHVyZSBpcyBzbWFydGVyIGFuZCBpcyBhcHByb3ByaWF0ZWx5CiAgICAgICAgICAgIGFkanVzdGVkIHNvIHRoYXQgbm8gdHJ1bmNhdGlvbiBvY2N1cnMuCgoyMDE1LTA3LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBTdXBwb3J0IGZvciBzcGVjaWFsIHZhcmlhYmxlIGV4cGFuc2lvbiBpbiB0eXBlbWFwIGF0dHJpYnV0ZXMuIEV4YW1wbGUgdXNhZ2UgZXhwYW5zaW9uCiAgICAgICAgICAgIGluIHRoZSAnb3V0JyBhdHRyaWJ1dGUgKEMjIHNwZWNpZmljKToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3R5cGUsIG91dD0iJCoxX2x0eXBlIikgdW5zaWduZWQgaW50JiAiJCoxX2x0eXBlIgoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGFzICQqMV9sdHlwZSBleHBhbmRzIHRvICd1bnNpZ25lZCBpbnQnOgoKICAgICAgICAgICAgICAldHlwZW1hcChjdHlwZSwgb3V0PSJ1bnNpZ25lZCBpbnQiKSB1bnNpZ25lZCBpbnQmICJ1bnNpZ25lZCBpbnQiCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlcyBjYW4gYmUgdXNlZCB3aXRoaW4gc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG9vLiBFeGFtcGxlIHVzYWdlIGV4cGFuc2lvbjoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSB1bnNpZ25lZCBpbnQgInVpbnQiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgJCoxX2x0eXBlKSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgJCoxX2x0eXBlKSIKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGVzIGFyZSBleHBhbmRlZCBmaXJzdCBhbmQgaGVuY2UgdGhlIGFib3ZlIGlzIGVxdWl2YWxlbnQgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiCgogICAgICAgICAgICB3aGljaCB0aGVuIGV4cGFuZHMgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSJ1aW50IikgdW5zaWduZWQgaW50JiAidWludCIKCjIwMTUtMDctMjI6IGxpbmRsZXlmCgkgICAgQXBwbHkgcGF0Y2ggIzQzOSAtIHN1cHBvcnQgZm9yICR0eXBlbWFwKCkgKGFrYSBlbWJlZGRlZCB0eXBlbWFwcyBvciBzcGVjaWFsIHZhcmlhYmxlCiAgICAgICAgICAgIG1hY3JvcykgaW4gdHlwZW1hcCBhdHRyaWJ1dGVzLiBBIHNpbXBsZSBleGFtcGxlIHdoZXJlICR0eXBlbWFwKCkgaXMgZXhwYW5kZWQgaW4gdGhlCiAgICAgICAgICAgICdvdXQnIGF0dHJpYnV0ZSAoQyMgc3BlY2lmaWMpOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIHVuc2lnbmVkIGludCAidWludCIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIgoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9InVpbnQiKSB1bnNpZ25lZCBpbnQmICJ1aW50IgoKMjAxNS0wNy0xODogbTd0aG9uCgkgICAgW1B5dGhvbl0gRG9jc3RyaW5ncyBwcm92aWRlZCB2aWEgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cgcXVvdGVkIGFuZCBhZGRlZCB0bwogICAgICAgICAgICB0aGUgdHBfZG9jIHNsb3Qgd2hlbiB1c2luZyBweXRob24gYnVpbHRpbiBjbGFzc2VzICgtYnVpbHRpbikuIFdoZW4gbm8gZG9jc3RyaW5nIGlzCiAgICAgICAgICAgIHByb3ZpZGVkLCB0aGUgdHBfZG9jIHNsb3QgaXMgc2V0IHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgY2xhc3MgbmFtZS4KICAgICAgICAgICAgR2l0aHViIGlzc3VlcyAjNDQ1IGFuZCAjNDYxLgoKMjAxNS0wNy0xNzoga3d3ZXR0ZQogICAgICAgICAgICBbb2N0YXZlXSBTdXBwb3J0IE9jdGF2ZSB2ZXJzaW9uIDQuMC4wICh0aGFua3MgdG8gcGF0Y2hlcyBmcm9tIE9yaW9uIFBvcGxhd3NraSkuCgoyMDE1LTA3LTA3OiB3c2Z1bHRvbgoJICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHdyYXBwZXIgZm9yIGEgY2xhc3MnIGNvbnN0cnVjdG9yIGlmIHRoYXQgY2xhc3MgaGFzCiAgICAgICAgICAgIGFueSBiYXNlIGNsYXNzIHdpdGggYSBwcml2YXRlIGRlc3RydWN0b3IuIFRoaXMgaXMgYmVjYXVzZSB5b3VyIGNvbXBpbGVyIHNob3VsZAogICAgICAgICAgICBub3QgYWxsb3cgYSBjbGFzcyB0byBiZSBpbnN0YW50aWF0ZWQgaWYgYSBiYXNlIGhhcyBhIHByaXZhdGUgZGVzdHJ1Y3Rvci4gU29tZQogICAgICAgICAgICBjb21waWxlcnMgZG8sIHNvIGlmIHlvdSBuZWVkIHRoZSBvbGQgYmVoYXZpb3VyLCB1c2UgdGhlICJub3RhYnN0cmFjdCIgZmVhdHVyZSwgZWc6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIERlcml2ZWQ7CiAgICAgICAgICAgICAgY2xhc3MgQmFzZSB7CiAgICAgICAgICAgICAgICB+QmFzZSgpIHt9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2Uge307CgpWZXJzaW9uIDMuMC42ICg1IEp1bCAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wNy0wMjogd3NmdWx0b24KCSAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gdGhlIHRlbXBsYXRlIGtleXdvcmQgaXMgdXNlZCBpbiB0eXBlcywgZWc6CgogICAgICAgICAgICAgIHN0ZDo6dGVtcGxhdGUgdmVjdG9yPGludD4gdjsKCjIwMTUtMDctMDI6IG5nbGFkaXR6CgkgICAgW0x1YV0gUHVzaCBjaGFyYWN0ZXJzIGFzIHVuZm9ybWF0dGVkIDEtY2hhcmFjdGVyIHN0cmluZ3MgdG8gYXZvaWQKCSAgICB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIHN1Y2ggYXMgKGNoYXIpMTI3IGJlaW5nIGNvbnZlcnRlZCB0bwoJICAgICI8XDEyNz4iIHdpdGggTHVhIDUuMyBhbmQgbGF0ZXIuICAoZ2l0aHViIFBSICM0NTIpCgoyMDE1LTA2LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wcm92ZSBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlIGluICVweXRob25jb2RlLgoKCSAgICBQcmV2aW91c2x5IFNXSUcgbG9va2VkIGF0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgZmlyc3QgbGluZSBhbmQKCSAgICByZW1vdmVkIHRoYXQgbWFueSBjaGFyYWN0ZXJzIGZyb20gZWFjaCBzdWJzZXF1ZW50IGxpbmUsIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGF0IHRob3NlIGNoYXJhY3RlcnMgd2VyZS4gIFRoaXMgd2FzIG1hZGUgd29yc2UgYmVjYXVzZSBTV0lHJ3MKCSAgICBwcmVwcm9jZXNzb3IgcmVtb3ZlcyBhbnkgd2hpdGVzcGFjZSBiZWZvcmUgYSAnIycuICBGaXhlcyBnaXRodWIKCSAgICBpc3N1ZSAjMzc5LCByZXBvcnRlZCBieSBKb2UgT3J0b24uCgoyMDE1LTA2LTEyOiB3c2Z1bHRvbgoJICAgIFtSXSBGaXggIzQzMCAtIGNhbGwgdG8gU1dJR19jcmVhdGVOZXdSZWYgaW4gY29weVRvQyB3YXMgaW5jb3JyZWN0bHkgbmFtZWQuCgoyMDE1LTA2LTExOiBzZ2hpcmF0ZQoJICAgIFtDI10gUGF0Y2ggIzQyNyBhZGRzIGluIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1vdXRmaWxlIHRvIGNvbWJpbmUgYWxsIHRoZQogICAgICAgICAgICBnZW5lcmF0ZWQgQyMgY29kZSBpbnRvIGEgc2luZ2xlIGZpbGUuCgoyMDE1LTA2LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgcHJvY2Vzc2luZyBDKysxMSB0eXBlIGFsaWFzaW5nLiBJc3N1ZSAjNDI0LgoKMjAxNS0wNS0yODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBZGQgbmV3IGZlYXR1cmUgInB5dGhvbjpjZGVmYXVsdGFyZ3MiIHRvIGNvbnRyb2wgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24uIEJ5IGRlZmF1bHQsIFNXSUcgYXR0ZW1wdHMgdG8gY29udmVydCBDL0MrKyBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcwogICAgICAgICAgICBpbnRvIFB5dGhvbiB2YWx1ZXMgYW5kIGdlbmVyYXRlcyBjb2RlIGludG8gdGhlIFB5dGhvbiBsYXllciB3aXRoIHRoZXNlIHZhbHVlcy4KICAgICAgICAgICAgUmVjZW50IHZlcnNpb25zIG9mIFNXSUcgYXJlIGFibGUgdG8gY29udmVydCBtb3JlIG9mIHRoZXNlIHZhbHVlcywgaG93ZXZlciwgdGhlCiAgICAgICAgICAgIG5ldyBiZWhhdmlvdXIgY2FuIGJlIGNpcmN1bXZlbnRlZCBpZiBkZXNpcmVkIHZpYSB0aGlzIG5ldyBmZWF0dXJlLCBzdWNoIHRoYXQKICAgICAgICAgICAgdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBDIGxheWVyIGFuZCBub3QgdGhlIFB5dGhvbiBsYXllci4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBDREEgewogICAgICAgICAgICAgICAgaW50IGZmZihpbnQgYSA9IDEsIGJvb2wgYiA9IGZhbHNlKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBQeXRob24gbGF5ZXIgaXM6CgogICAgICAgICAgICAgIGNsYXNzIENEQShfb2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGRlZiBmZmYoc2VsZiwgYT0xLCBiPUZhbHNlKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdF9hcmdzLkNEQV9mZmYoc2VsZiwgYSwgYikKCiAgICAgICAgICAgIEFkZGluZyB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjpjZGVmYXVsdGFyZ3MiKSBDREE6OmZmZjsKCiAgICAgICAgICAgIFJlc3VsdHMgaW46CgogICAgICAgICAgICAgIGNsYXNzIENEQShfb2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGRlZiBmZmYoc2VsZiwgKmFyZ3MpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2FyZ3MuQ0RBX2ZmZihzZWxmLCAqYXJncykKCiAgICAgICAgICAgIFNvbWUgY29kZSBnZW5lcmF0aW9uIG1vZGVzLCBlZyAtYnVpbHRpbiBhbmQgLWZhc3Rwcm94eSwgYXJlIHVuYWZmZWN0ZWQgYnkgdGhpcyBhcwogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGFsd2F5cyBvYnRhaW5lZCBmcm9tIHRoZSBDIGxheWVyLgoKMjAxNS0wNS0yNzogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBEZWFsIHdpdGggYW4gaW50ZWdlciBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHR5cGVkZWYgdG8gYm9vbAoJICAgIHBhcmFtZXRlciBpbiB0aGUgQysrIHByb3RvdHlwZS4gIFNlZSAjMzI3LiBSZWdyZXNzaW9uIGZyb20gMy4wLjAgb253YXJkcy4KCjIwMTUtMDUtMTk6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggd2FybmluZyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgY29kZSB3aXRoIE1TVkMuCgkgICAgKEZpeGVzIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9wYXRjaGVzLzM1MS8gcmVwb3J0ZWQgYnkKCSAgICBNYXRldXN6IFN6eW1hv3NraSkuCgoyMDE1LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IHdyYXBwaW5nIHNoYXJlZF9wdHIgb2YgY2xhc3NlcyB3aXRoIHByaXZhdGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyB0aGUgInVucmVmIiBmZWF0dXJlIHdoZW4gdXNlZCBvbiBjbGFzc2VzIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9ycy4KCjIwMTUtMDUtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbXVsdGktYXJndW1lbnQgdHlwZW1hcHMgKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkKICAgICAgICAgICAgc28gdGhhdCB0aGV5IGNhbiBiZSBhcHBsaWVkIHRvIGEgd2lkZXIgcmFuZ2Ugb2YgdHlwZXMuIEZpeGVzICMzODUuCgoyMDE1LTA1LTA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRGVhbCB3aXRoIGFuIGludGVnZXIgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBib29sCgkgICAgcGFyYW1ldGVyIGluIHRoZSBDKysgcHJvdG90eXBlLiAgRml4ZXMgZ2l0aHViICMzMjcsIHJlcG9ydGVkIGJ5CgkgICAgR3JlZyBBbGxlbi4KCjIwMTUtMDUtMDc6IExpbmRsZXlGCgkgICAgW0phdmFdIEFsbG93IGZlYXR1cmUoImRpcmVjdG9yIikgYW5kIGZlYXR1cmUoInJlZiIpIHRvIGJlIHVzZWQKCSAgICB0b2dldGhlci4gIEdpdGh1YiBQUiM0MDMuCgoyMDE1LTA1LTA1OiBvbGx5CgkgICAgU3VwcHJlc3Mgd2FybmluZyAzMjUgIk5lc3RlZCBjbGFzcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAoRm9vCgkgICAgaWdub3JlZCkiIHdoZW4gRm9vIGhhcyBhbHJlYWR5IGJlZW4gZXhwbGljaXRseSBpZ25vcmVkIHdpdGggIiVpZ25vcmUiLgoKMjAxNS0wNS0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGZyaWVuZCB0ZW1wbGF0ZXMsIGluY2x1ZGluZyBvcGVyYXRvciBvdmVybG9hZGluZyAtIGZpeGVzICMxOTYuIENvbnNpZGVyaW5nCiAgICAgICAgICAgIHRoZSBleGFtcGxlIGJlbG93LCBwcmV2aW91c2x5IHRoZSBvcGVyYXRvciBnYXZlIGEgc3ludGF4IGVycm9yIGFuZCBmcmllbmRmdW5jIGluY29ycmVjdGx5CiAgICAgICAgICAgIHdhcm5lZCB3aXRoOgoKICAgICAgICAgICAgICJXYXJuaW5nIDUwMzogQ2FuJ3Qgd3JhcCAnZnJpZW5kZnVuYzwoVHlwZSk+JyB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuIgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgTXlDbGFzcyB7CiAgICAgICAgICAgICAgICBmcmllbmQgaW50IGZyaWVuZGZ1bmMgPFR5cGU+KGRvdWJsZSBpcywgTXlDbGFzcyA8VHlwZT4gJiB4KTsKICAgICAgICAgICAgICAgIGZyaWVuZCBpbnQgb3BlcmF0b3I8PCA8VHlwZT4oZG91YmxlIHVuLCBjb25zdCBNeUNsYXNzIDxUeXBlPiAmeCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgYWxzbyBwcmV2aW91c2x5IGluY29ycmVjdGx5IHdhcm5lZCB3aXRoOgoKICAgICAgICAgICAgICAiV2FybmluZyAzMDI6IElkZW50aWZpZXIgJ3RlbXBsYXRlX2ZyaWVuZCcgcmVkZWZpbmVkIChpZ25vcmVkKSwiCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgdGVtcGxhdGVfZnJpZW5kKFQpOwogICAgICAgICAgICAgIHN0cnVjdCBNeVRlbXBsYXRlIHsKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGZyaWVuZCBUIHRlbXBsYXRlX2ZyaWVuZChUKTsKICAgICAgICAgICAgICB9OwoKMjAxNS0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGhhbmRsaW5nIG9mIGNvbnZlcnNpb24gb3BlcmF0b3JzIHdoZXJlIHRoZSBvcGVyYXRvciBpcyBzcGxpdCBvdmVyIG11bHRpcGxlCiAgICAgICAgICAgIGxpbmVzIG9yIGhhcyBjb21tZW50cyB3aXRoaW4gdGhlIG9wZXJhdG9yIHR5cGUuIEZpeGVzICM0MDEuCgogICAgICAgICAgICBBbHNvIGZpeCBzaW1pbGFyIHByb2JsZW0gd2l0aCBub3JtYWwgb3BlcmF0b3JzIHdoaWNoIGdhdmUgYSBzeW50YXggZXJyb3IgaWYgc3BsaXQgb3ZlcgogICAgICAgICAgICBtdWx0aXBsZSBsaW5lcyBvciBoYWQgYSBjb21tZW50IHdpdGhpbiB0aGUgb3BlcmF0b3IgZGVjbGFyYXRpb24uCgoyMDE1LTA0LTMwOiBvbGx5CgkgICAgSWdub3JlIHVua25vd24gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgd2hpY2ggYXJlIGluc2lkZSBhbiBpbmFjdGl2ZQoJICAgIGNvbmRpdGlvbmFsIChnaXRodWIgaXNzdWUgIzM5NCwgcmVwb3J0ZWQgYnkgRGFuIFdpbGNveCkuCgkgICAgUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDMuMC4zLgoKMjAxNS0wNC0yNzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggImRlZmF1bHQiIHR5cGVtYXAgdXNlZCBhZnRlciBhbiBhcmd1bWVudCB3aXRoICJudW1pbnB1dHM9MCIgKCMzNzcpLgoKMjAxNS0wNC0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyNTYuIENvZGUgZ2VuZXJhdGVkIHdpdGggJy1idWlsdGluIC1tb2Rlcm5hcmdzJyBzZWdmYXVsdHMgZm9yIGFueQogICAgICAgICAgICBtZXRob2QgdGFraW5nIHplcm8gYXJndW1lbnRzLgoKICAgICAgICAgICAgQWxzbyBmaXhlczogIlN5c3RlbUVycm9yOiBlcnJvciByZXR1cm4gd2l0aG91dCBleGNlcHRpb24gc2V0IiBkdXJpbmcgZXJyb3IgY2hlY2tpbmcKICAgICAgICAgICAgd2hlbiB1c2luZyBqdXN0IC1idWlsdGluIGFuZCB0aGUgaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgaXMgcGFzc2VkIHRvIGEgY2xhc3MKICAgICAgICAgICAgbWV0aG9kIGV4cGVjdGluZyB6ZXJvIGFyZ3VtZW50cy4KCjIwMTUtMDQtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzM4NiAtIE1lbW9yeSBsZWFrIGZpeCBpbiAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcy4KCjIwMTUtMDQtMjM6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gTWFrZSAiZGVmYXVsdCIgdHlwZW1hcCB3b3JrIGFnYWluICgjMzMwLCAjMzc3KS4KCjIwMTUtMDQtMjM6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSB1c2Ugb2YgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBwb2ludGVyIHR5cGVzICgjMzY1LCAjMzc2KS4KCjIwMTUtMDQtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAnbWFrZSBjaGVjay1jY2FjaGUnIHdoaWNoIGlzIHBhcnQgb2YgJ21ha2UgY2hlY2snIHdoZW4gb25lIG9mIHRoZSBDQ0FDSEVfCiAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcywgZm9yIGV4YW1wbGUgQ0NBQ0hFX0RJU0FCTEUsIGlzIHNldC4KCjIwMTUtMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENsZWFyZXIgd2FybmluZyBtZXNzYWdlIGZvciBiYWRseSBjb25zdHJ1Y3RlZCB0eXBlY2hlY2sgdHlwZW1hcHMuIEZvciBleGFtcGxlLCB3YXM6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozOiBXYXJuaW5nIDQ2NzogT3ZlcmxvYWRlZCBmb28oaW50KSBub3Qgc3VwcG9ydGVkIChubyB0eXBlIGNoZWNraW5nCiAgICAgICAgICAgICAgcnVsZSBmb3IgJ2ludCcpLgoKICAgICAgICAgICAgTm93OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzogV2FybmluZyA0Njc6IE92ZXJsb2FkZWQgZm9vKGludCkgbm90IHN1cHBvcnRlZCAoaW5jb21wbGV0ZSB0eXBlIGNoZWNraW5nCiAgICAgICAgICAgICAgcnVsZSAtIG5vIHByZWNlZGVuY2UgbGV2ZWwgaW4gdHlwZWNoZWNrIHR5cGVtYXAgZm9yICdpbnQnKS4KCjIwMTUtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzM1MyAtIExpbmtlciBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICdFeGNlcHRpb25NYXRjaGVzJyB3aGVuCiAgICAgICAgICAgIHVzaW5nIGRpcmVjdG9ycyBhbmQgbXVsdGlwbGUgbW9kdWxlcy4KCjIwMTUtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lcmdlICMzMjAgLSBNYWtlIF9fZGljdF9fIGFjY2Vzc2libGUgZm9yIFB5dGhvbiBidWlsdGluIGNsYXNzZXMuCgoyMDE1LTA0LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM3NSAtIHBhcnNpbmcgb2YgZXh0ZXJuICJDIiBhbmQgdHlwZWRlZiBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBleHRlcm4gIkMiIHR5cGVkZWYgdm9pZCAoKkhvb2syX3QpKGludCwgY29uc3QgY2hhciAqKTsKICAgICAgICAgICAgICBleHRlcm4gIkMiIHR5cGVkZWYgaW50IEludGVnZXI7CgoyMDE1LTAzLTEyOiBvbGx5CgkgICAgLURTV0lHX0RJUkVDVE9SX1NUQVRJQyBpcyBub3cgc3VwcG9ydGVkIGZvciBhbGwgbGFuZ3VhZ2VzIHdpdGgKCSAgICBkaXJlY3RvciBzdXBwb3J0LCBub3Qgb25seSBQeXRob24gYW5kIFBIUC4KCjIwMTUtMDMtMDI6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgLWNnbyBvcHRpb24sIHJlcXVpcmVkIGZvciBHbyB2ZXJzaW9ucyAxLjUgYW5kCgkgICAgbGF0ZXIuCgoyMDE1LTAyLTI2OiBvbGx5CgkgICAgRml4IHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHRvcD09TlVMTCwgaW50cm9kdWNlZCBieSBuZXN0ZWQgY2xhc3MKCSAgICBoYW5kbGluZyAocmVwb3J0ZWQgaW4gaXNzdWUjMzQ2IGJ5IFBhd2W/IFRvbXVsaWspLgoKMjAxNS0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMgd2hlbgogICAgICAgICAgICBkZWZpbmVkIGFuZCBkZWNsYXJlZCBpbmxpbmUuCgoyMDE1LTAyLTA5OiBtaXNoYXMKICAgICAgICAgICAgW0dvXSBGaXggJWltcG9ydCBvZiBmaWxlcyBpbiBzdWIgZGlyZWN0b3JpZXMuCgoyMDE1LTAyLTA1OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIElnbm9yZSBHbyBzcGVjaWZpYyB0eXBlIG1hcHMgKGdvaW4sIGdvb3V0LCBldGMuKSBpZiB0aGV5IGFyZSBlbXB0eS4KCjIwMTUtMDItMDU6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gR2VuZXJhdGVkIEdvIGNvZGUgbm8gbG9uZ2VyIGNhbGxzIF9zd2lnX2dvYWxsb2NhdGUgb3IKICAgICAgICAgICAgX3N3aWdfbWFrZWdvc3RyaW5nLCBhcyB0aGV5IHdpbGwgbm8gbG9uZ2VyIHdvcmsgYXMgb2YgR28gMS41LgoKVmVyc2lvbiAzLjAuNSAoMzEgSmFuIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbiAtY2xhc3NpYyBhbmQgcHJvcGVydHkgc2V0dGluZy4gU2V0dGluZyBwcm9wZXJ0aWVzIG9uIGNsYXNzaWMgY2xhc3NlcwogICAgICAgICAgICB3YXMgYnJva2VuIGluIHN3aWctMy4wLjMgYnkgYXR0ZW1wdGluZyB0byB1c2UgX19zZXRhdHRyX18uIFRoaXMgcmVncmVzc2lvbiBpcyBmaXhlZCBub3cKICAgICAgICAgICAgYnkgdXNpbmcgX19kaWN0X18gYWdhaW4gd2hlbiB1c2luZyAtY2xhc3NpYy4KICAgICAgICAgICAgRml4ZXMgcGF0Y2ggIzIzMi4KCjIwMTUtMDEtMjc6IHNtYXJjaGV0dG8KCSAgICBbU2NpbGFiXSBTdXBwb3J0IGZvciB0aGUgU2NpbGFiIGxhbmd1YWdlIGhhcyBiZWVuIGFkZGVkCgoyMDE1LTAxLTIzOiBvbGx5CgkgICAgW1BIUF0gV2hlbiB3cmFwcGluZyBhIHJldHVybmVkIHJlc291cmNlIGFzIGFuIG9iamVjdCwgY2hlY2sgaWYgYWxsCgkgICAgY2FzZXMgd3JhcCBpdCBpbiB0aGUgc2FtZSBjbGFzcywgYW5kIGlmIHNvIGVsaW1pbmF0ZSB0aGUgcG9pbnRsZXNzCgkgICAgc3dpdGNoIHN0YXRlbWVudCB3cmFwcGVyIHdlIHByZXZpb3VzbHkgZ2VuZXJhdGVkLgoKMjAxNS0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gTWVyZ2UgcGF0Y2ggIzI5NyBmb3IgU0YgYnVnICMxMjc3IC0gT2N0YXZlIHNoYXJlZF9wdHIgc3VwcG9ydAoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gTWVyZ2UgcGF0Y2ggIzI1MCAtIEZpeGVzIGZvciB1c2luZyAlY29uc3RhbnQgYW5kIG9iamVjdHMgKG5vbi1wcmltaXRpdmUgdHlwZXMpCgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgR29dIE1lcmdlIHBhdGNoICMzMDggYW5kIGZpeCAjMzA3IC0gQysrMTEgc3Ryb25nbHkgdHlwZWQgZW51bSBzdXBwb3J0CiAgICAgICAgICAgIGluIGRpcmVjdG9ycwoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gU2Vjb25kIGZpeCBmb3IgIzI5NCAjMjk2IC0gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFNXSUctMy4wLjMgd2hlbgogICAgICAgICAgICB3cmFwcGluZyBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cywgdGhpcyB0aW1lIHdoZW4gdXNpbmcga3dhcmdzLgoKVmVyc2lvbiAzLjAuNCAoMTQgSmFuIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wMS0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdmYXVsdCBpbiBkaXJlY3RvciB1cGNhbGwgY2hlY2sgd2hlbiB1c2luZyBQSFAgYnVpbHQgd2l0aAoJICAgIFpUUyBlbmFibGVkLiAgRml4ZXMgIzE1NSwgcmVwb3J0ZWQgYnkgUGllcnJlIExhYmFzdGllLgoKMjAxNS0wMS0xMjogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5NCAjMjk2IC0gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFNXSUctMy4wLjMgd2hlbgogICAgICAgICAgICB3cmFwcGluZyBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4gSW52YWxpZCBvciBtaXNzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIHdlcmUgc29tZXRpbWVzIGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBweXRob24gbGF5ZXIuCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgQWxsb3cgQysrMTEgImV4cGxpY2l0IGNvbnN0ZXhwciIuICBGaXhlcyBnaXRodWIgaXNzdWUgIzI4NCByZXBvcnRlZAoJICAgIGJ5IFBhd2VsIFRvbXVsaWsuICBBbHNvIGhhbmRsZSAiY29uc3RleHByIGV4cGxpY2l0IiBhbmQgImNvbnN0ZXhwcgoJICAgIHN0YXRpYyIuCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgV2hlbiByZXBvcnRpbmcgYW4gZXJyb3IgZm9yIGEgY29uc3RydWN0IHdoaWNoIGhhc24ndCBiZWVuCgkgICAgdGVybWluYXRlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgcmVhY2hlZCwgcmVwb3J0IGl0IGF0IHRoZQoJICAgIHN0YXJ0IGxpbmUgcmF0aGVyIHRoYW4gIkVPRiIgYXMgdGhlbiB0b29scyBsaWtlIGVkaXRvcnMgYW5kIElERXMKCSAgICB3aWxsIHRha2UgeW91IHRvIGEgZ2VuZXJhbGx5IG1vcmUgdXNlZnVsIHBsYWNlIGZvciBmaXhpbmcgdGhlCgkgICAgcHJvYmxlbS4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBJbXByb3ZlIGVycm9yIG1lc3NhZ2VzIGZvciBhIGZldyBjYXNlcyB3aGljaCBwcmV2aW91c2x5IGdhdmUgdGhlCgkgICAgb25lIG9mIHRoZSBjcnlwdGljIGNhdGNoLWFsbCBlcnJvcnMgIlN5bnRheCBlcnJvciBpbiBpbnB1dCIuCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgUHJvdmlkZSAtY3BwZXh0IGFzIGEgZ2VuZXJhbCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciBzZXR0aW5nIHRoZQoJICAgIGV4dGVuc2lvbiB1c2VkIGZvciBnZW5lcmF0ZWQgQysrIGZpbGVzIChwcmV2aW91c2x5IGl0IHdhcyBzcGVjaWZpYwoJICAgIHRvIHRoZSBQSFAgYmFja2VuZCkuICBEZXByZWNhdGUgdGhlIGVxdWl2YWxlbnQgLXN1ZmZpeCBvcHRpb24KCSAgICBwcm92aWRlZCBieSB0aGUgT2NhbWwgYmFja2VuZCwgYnV0IGNvbnRpbnVlIHRvIHN1cHBvcnQgdGhhdCBmb3IKCSAgICBub3cuCgpWZXJzaW9uIDMuMC4zICgzMCBEZWMgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTEyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI4MCAtIGFib3J0IHVzaW5nIGFsbCBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aGluIG90aGVyIHRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMuCgoyMDE0LTEyLTI3OiB0YWxieQogICAgICAgICAgICBbUGVybF0gSXNzdWUgIzI4MiBwZXJsNSBhcmNobGliIHZzIGFyY2hsaWJleHAKICAgICAgICAgICAgW1BlcmxdIHRpZHkgIndhcm5pbmc6IGR1cGxpY2F0ZSAnZXh0ZXJuJyBkZWNsYXJhdGlvbiBzcGVjaWZpZXIiIHdoZW4gYnVpbGRpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgY2xhbmcKCjIwMTQtMTItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciAlY29uc3RhbnQgYW5kIHN0cnVjdHMvY2xhc3NlcyAtIGlzc3VlICMyNzIKCjIwMTQtMTItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQ1IC0gcmVncmVzc2lvbiAoc2luY2Ugc3dpZy0zLjAuMCkgaW4gdGVtcGxhdGVkIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgVGVtcGxhdGVkIGNvbnN0cnVjdG9ycyBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIC0gdGhleSB3ZXJlIGluY29ycmVjdGx5IGlnbm9yZWQgd2l0aCBhIHdhcm5pbmcgNTA0OgogICAgICAgICAgICAiRnVuY3Rpb246IHh5eiBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZS4gSWdub3JlZC4iCgoyMDE0LTEyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgQysrMTEgc3Ryb25nbHkgdHlwZWQgZW51bWVyYXRpb25zLgoKMjAxNC0xMS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBtdWx0aXBseSBkZWZpbmVkIGVycm9yIHdoZW4gdXNpbmcgJXJlbmFtZSBvZiBlbnVtIGl0ZW1zIHdoZW4gdXNpbmcgdGhlICJzaW1wbGUgZW51bSIKICAgICAgICAgICAgd3JhcHBlcnMuCgoyMDE0LTEwLTI4OiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMDEgVGhlIGdlbmVyYXRlZCAucHkgZmlsZSBubyBsb25nZXIgdXNlcyAqYXJncyBmb3IgYWxsIFB5dGhvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBJbnN0ZWFkLCB0aGUgcGFyYW1ldGVycyBhcmUgbmFtZWQgdXNpbmcgdGhlIEMrKyBwYXJhbWV0ZXIgbmFtZXMuCgogICAgICAgICAgICAiY29tcGFjdGRlZmF1bHRhcmdzIiBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIHRvIHJlc3RvcmUgdGhlIG9sZCBiZWhhdmlvdXIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTQtMTAtMjQ6IHRpbW90aGVlY291cgogICAgICAgICAgICBbRF0gUGF0Y2ggIzIwNCBVc2UgY29yZS5hdG9taWMuYXRvbWljT3AgdG8gbXV0YXRlIHNoYXJlZCB2YXJpYWJsZXMKCjIwMTQtMTAtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpc3N1ZSAjMjQyIC0gVXNlIG9mIHRoZSAia3dhcmdzIiBmZWF0dXJlIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IHR1cm5zIG9uIHRoZQogICAgICAgICAgICAiY29tcGFjdGRlZmF1bHRhcmdzIiBmZWF0dXJlIGlmIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydCBrd2FyZ3MuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFmZmVjdHMgYWxsIGxhbmd1YWdlcyBleGNlcHQgUHl0aG9uIGFuZCBSdWJ5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0xMC0xMDogZGlvcmNldHkKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIzMiBGaXggcHJvcGVydHkgYWNjZXNzIHVzaW5nIGRpcmVjdG9ycwoKMjAxNC0xMC0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ZXMgd2hlbiB1c2luZyAtYnVpbHRpbiBhbmQgc3RkOjp2ZWN0b3Ivc3RkOjpsaXN0IHdyYXBwZXJzIHRvIGFsbG93IGRlbGV0aW9uCiAgICAgICAgICAgIG9mIHNpbmdsZSBlbGVtZW50cywgc3VjaCBhcyAnZGVsIHZlY1swXScuCgoyMDE0LTA5LTMwOiBvbGl2ZXJiCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBNZXJnZSBwYXRjaCAjMjE2IGJ5IFJpY2hpZTc2NSAtIEFkZGVkIHN1cHBvcnQgZm9yIG1hbnkgdmVyc2lvbnMgb2YgdjggamF2YXNjcmlwdC4KCjIwMTQtMDktMzA6IG9saXZlcmIKICAgICAgICAgICAgW0phdmFzY3JpcHRdIE1lcmdlIHBhdGNoICMxOTUgYnkgeml0dGl4IC0gRml4ZWQgSlNDbGFzc1JlZiBkZWNsYXJhdGlvbiBub3QgdXNpbmcgdGhlIHN0YXRpYyBvbmUuCgoyMDE0LTA5LTMwOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gSW4gY29uZmlndXJlIHNjcmlwdCwgcmVxdWlyZSBHbyAxLjEgb3IgbGF0ZXIuCgoyMDE0LTA5LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjA3IC0gRml4IE5vIG1vZHVsZSBlcnJvciB3aXRoIC1yZWxhdGl2ZWltcG9ydCB3aGVuIHVzaW5nIHNpbmdsZQogICAgICAgICAgICBoZWFkZXIgZmlsZSBpbXBvcnQuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMjA4IC0gSW5pdGlhbGlzZSBuZXdseSBjcmVhdGVkIGFycmF5IHdoZW4gdXNpbmcgYXJyYXlfZnVuY3Rpb25zIGluIHRoZQogICAgICAgICAgICBjYXJyYXlzLmkgbGlicmFyeSAoQysrIHVzYWdlKS4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjMTg3IC0gRml4IGNyYXNoIG9uIHNodXRkb3duIG9mIHRoZSBSdWJ5IGludGVycHJldGVyIGlmIG1vcmUgdGhhbiBvbmUKICAgICAgICAgICAgbW9kdWxlIHdhcyBsb2FkZWQgYXQgYSB0aW1lIHdoZW4gZGF0YSBpcyBiZWluZyBzaGFyZWQgYmV0d2VlbiBtb2R1bGVzLgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxNjggLSBGaXggbGVhayBpbiBKYXZhIGRpcmVjdG9yIHN0cmluZyBoYW5kbGluZyBhZnRlciB0aGUgSmF2YQogICAgICAgICAgICB1cGNhbGwgd2hlbiBjYWxsZWQgZnJvbSBhIG5hdGl2ZSB0aHJlYWQuCgoyMDE0LTA5LTI1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRqdXN0IGdlbmVyYXRlZCBjb2RlIHRvIHdvcmsgd2l0aCB1cGNvbWluZyBHbyAxLjQKCSAgICByZWxlYXNlLgoKMjAxNC0wOS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHBhdGNoIGZyb20gVGhvbWFzIE1hc2xhY2ggdG8gZml4IGNyYXNoIGluIHdyYXBwZXJzIHdoZW4gdXNpbmcgLXRocmVhZHMgaW4KICAgICAgICAgICAgdGhlIFNUTCBpdGVyYXRvcnMgKFN3aWdQeUl0ZXJhdG9yIGRlc3RydWN0b3IpLgoKMjAxNC0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNZXJnZSBwYXRjaCAjMjI5IGZyb20gY29udHJlIC0gQWRkIGJvb2wgYXJyYXkgdHlwZXMgdG8gYXJyYXlzX2NzaGFycC5pCgoyMDE0LTA5LTEyOiBvbGx5CgkgICAgW1BIUF0gQWRkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW55IFBIUCBpbnRlcmZhY2VzIGEgd3JhcHBlZCBjbGFzcwoJICAgIGltcGxlbWVudHMsIGUuZy46ICV0eXBlbWFwKCJwaHBpbnRlcmZhY2VzIikgTXlJdGVyYXRvciAiSXRlcmF0b3IiOwoKMjAxNC0wOS0xMTogb2xseQoJICAgIFtQSFBdIEZpeCB0aHJvd2luZyBhIFBIUCBleGNlcHRpb24gdGhyb3VnaCBDKysgZnJvbSBhIHN1YmNsYXNzZWQKCSAgICBkaXJlY3RvciBtZXRob2QgLSBQSFAgTlVMTCBnZXRzIHJldHVybmVkIGJ5IHRoZSBzdWJjbGFzc2VkIG1ldGhvZAoJICAgIGluIHRoaXMgY2FzZSwgc28gdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXAgbmVlZHMgdG8gYWxsb3cgdGhhdCAoYXQKCSAgICBsZWFzdCBpZiBhbiBleGNlcHRpb24gaXMgYWN0aXZlKS4KCjIwMTQtMDktMDk6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgZ29hcmdvdXQgdHlwZW1hcC4KCjIwMTQtMDktMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnbWVudGF0aW9uIGZhdWx0cyB3aXRoIGRpcmVjdG9ycyBpbiBQSFAgPj0gNS40LCBhbmQKCSAgICByZWVuYWJsZSBydW5tZSB0ZXN0cyBmb3IgZGlyZWN0b3JfYmFzaWMgdGVzdGNhc2UuICBGaXggZnJvbQoJICAgIHBhdmVsLWNoYXJ2YXQgaW4gaXNzdWUjMTY0LgoKMjAxNC0wOS0wNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBpbXR5cGUsIGdvaW4sIGdvb3V0LCBnb2RpcmVjdG9yaW4sIGFuZAoJICAgIGdvZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHRvIHN1cHBvcnQgd3JpdGluZyBHbyBjb2RlIHRvCgkgICAgY29udmVydCBiZXR3ZWVuIHR5cGVzLgoKMjAxNC0wOS0wMjogb2xseQoJICAgIFtQeXRob25dIEZpeCByZWdyZXNzaW9uIGluIGluZGVudGF0aW9uIG9mIHB5dGhvbiBjb2RlIHByb2R1Y2VkIHdpdGgKCSAgICAtbW9kZXJuLCBpbnRyb2R1Y2VkIGJ5IGNoYW5nZXMgaW4gIzE4OC4gIFJlcG9ydGVkIGJ5IGZhYmllbmNhc3RhbgoJICAgIGluICMyMTguCgoyMDE0LTA5LTAxOiBvbGx5CgkgICAgSXNzdWUgYW4gZXJyb3IgZm9yIHVua25vd24gU1dJRyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcywgcmF0aGVyCgkgICAgdGhhbiBxdWlldGx5IGlnbm9yaW5nIHRoZW0uICBSZXBvcnRlZCBieSBqcmhlbHNleSBpbiBpc3N1ZSMyMTcuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTA4LTE1OiB0YWxieQogICAgICAgICAgICBbUGVybF0gSW5jbHVkZSBndWFyZCBmaXggZm9yIG5lc3RlZCBtb2R1bGVzIGZyb20gQW50aG9ueSBIZWFkaW5nIChTRiBQYXRjaCAjMzUwKS4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIwMCBmcm9tIGdwZXRyb3UgLSBDaGFuZ2VkIENTaGFycCBsaWNlbnNlIGhlYWRlciB0byBpbmNsdWRlIGF1dG8tZ2VuZXJhdGVkCiAgICAgICAgICAgIHRhZyBzbyB0aGF0IFN0eWxlQ29wIGlnbm9yZXMgdGhlIGZpbGVzLgoKMjAxNC0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1lcmdlIHBhdGNoICMxOTggZnJvbSBZdXZhbCBLYXNodGFuIC0gU3VwcG9ydCBmb3IgamF2YS5uaW8uQnl0ZUJ1ZmZlciBtYXBwaW5nIHRvCiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBpbiB2YXJpb3VzLmkgaW4gTklPQlVGRkVSIHR5cGVtYXBzLgoKMjAxNC0wNy0xNDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIENoYW5nZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byB1c2Ugdm9pZCAqLCBub3QgdWludDgsIHNvCgkgICAgdGhhdCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwb3NzaWJseSBjb250YWluaW5nCgkgICAgcG9pbnRlcnMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgMS4zIGdhcmJhZ2UgY29sbGVjdG9yCgkgICAgZG9lcyBub3QgY29sbGVjdCBwb2ludGVycyBwYXNzZWQgdG8gQysrIGNvZGUuCgoyMDE0LTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICMxMzc1IC0gRXhwYW5zaW9uIG9mIHRoZSAkcGFyZW50Y2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgaW5jb3JyZWN0bHkgY29udGFpbnMKICAgICAgICAgICAgYnJhY2tldHMgaW4gdGhlIGV4cGFuZGVkIG5hbWUuCgpWZXJzaW9uIDMuMC4yICg0IEp1biAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wNi0wMjogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIFB1bGwgcmVxdWVzdCAjMTc2OgogICAgICAgICAgICBJZiBjbGFzcyBoYXMgbm8gX19lcSBpbXBsZW1lbnRlZCwgdGhlbiBkZWZhdWx0IF9fZXEgaXMgZ2VuZXJhdGVkLiAKICAgICAgICAgICAgRGVmYXVsdCBfX2VxIGNvbXBhcmVzIGFjdHVhbCBwb2ludGVycyBzdG9yZWQgaW5zaWRlIEx1YSB1c2VyZGF0YS4KCjIwMTQtMDYtMDI6IHZrYWxpbmluCiAgICAgICAgICAgIEZpeCAjMTgzIC0gJWV4dGVuZCBhbmQgdW5uYW1lZCBuZXN0ZWQgc3RydWN0cwoKMjAxNC0wNS0yODoga3d3ZXR0ZQogICAgICAgICAgICBGaXggaW5zdGFsbCBmYWlsdXJlIHdoZW4gdXNpbmcgYW4gJ291dCBvZiBzb3VyY2UnIGJ1aWxkIHVzaW5nIHRoZSBzaGlwcGVkCiAgICAgICAgICAgIHRhcmJhbGwgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuMS4KCjIwMTQtMDUtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIGRlcHJlY2F0ZWQgLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lIGFyZ3VtZW50cwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKVmVyc2lvbiAzLjAuMSAoMjcgTWF5IDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wNS0yNTogaGZhbGNpYwoJICAgIFtQeXRob25dIFB5dGhvbiAzIGJ5dGUgc3RyaW5nIG91dHB1dDogdXNlIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIgogICAgICAgICAgICBpZiBhdmFpbGFibGUgb24gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHRoYXQncyBpbiB1c2UuIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgb3JpZ2luYWwgYnl0ZSBzdHJpbmcgKGFuZCBwb3RlbnRpYWxseSB0cnlpbmcgYSBmYWxsYmFjawogICAgICAgICAgICBlbmNvZGluZykgaWYgdGhlIGJ5dGVzIGNhbid0IGJlIGRlY29kZWQgYXMgVVRGLTguCgogICAgICAgICAgICBQcmV2aW91c2x5LCBhIFVuaWNvZGVEZWNvZGVFcnJvciB3b3VsZCBiZSByYWlzZWQgd2l0aCBubyB3YXkgdG8gdHJlYXQKICAgICAgICAgICAgdGhlIGRhdGEgYXMgYnl0ZXMgb3IgdHJ5IGFub3RoZXIgY29kZWMuCgoyMDE0LTA1LTE4OiB2a2FsaW5pbgoJICAgIEJ1ZyAjMTc1IC0gUmVzdG9yZSAlZXh0ZW5kIHRvIHdvcmsgZm9yIHVubmFtZWQgbmVzdGVkIHN0cnVjdHVyZXMgYnkgdXNpbmcgYSBDCiAgICAgICAgICAgIHN5bWJvbCBjb21wcmlzaW5nIHRoZSBvdXRlciBzdHJ1Y3R1cmUgbmFtZSBhbmQgdW5uYW1lZCB2YXJpYWJsZSBpbnN0YW5jZSBuYW1lLgoKMjAxNC0wNS0xNToga3d3ZXR0ZQoJICAgIEFkZCAjMTY2IC0gJ21ha2UgY2hlY2snIG5vdyB3b3JrcyBvdXQgb2Ygc291cmNlLiBUaGlzIHJlcXVpcmVkIHRoZSBleGFtcGxlcyB0byBidWlsZAogICAgICAgICAgICBvdXQgb2Ygc291cmNlLiBUaGUgbWFpbiBsYW5ndWFnZXMgaGF2ZSBiZWVuIHRlc3RlZCAtIEMjLCBHbywgR3VpbGUsIEphdmEsIEphdmFzY3JpcHQsCiAgICAgICAgICAgIEx1YSwgT2N0YXZlLCBQZXJsLCBQSFAsIFB5dGhvbiwgUnVieSBhbmQgVGNsLgoKMjAxNC0wNS0wMTogT2xpdmVyIEJ1Y2h0YWxhCgkgICAgSmF2YXNjcmlwdCBzdXBwb3J0IGFkZGVkLCBzZWUgSmF2YXNjcmlwdCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAxNC0wNS0wMTogb2xseQoJICAgIFtQSFBdIFRoZSBnZW5lcmF0ZWQgX19pc3NldCgpIG1ldGhvZCBub3cgcmV0dXJucyB0cnVlIGZvciByZWFkLW9ubHkgcHJvcGVydGllcy4KCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgW0dvXSBGaXggZ28gLi9jb25maWd1cmUgcGFyc2luZyBvZiBnY2NnbyAtLXZlcnNpb24sIGFuZAogICAgICAgICAgICBnb3J1bnRpbWUuc3dnIHR5cG8gaW4gX19HTlVDX1BBVENITEVWRUxfXyAoU0YgQnVnICMxMjk4KQoKMjAxNC0wNC0yNDoga3d3ZXR0ZQogICAgICAgICAgICBGaXgge3B5dGhvbnxwZXJsNXxydWJ5fHRjbH0vamF2YSBleGFtcGxlcwoKICAgICAgICAgICAgSW4gTGliL2djai9jbmkuaSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBuZXdlciBnY2ogdmVyc2lvbnM6CgogICAgICAgICAgICAtIHJlbW92ZSBKdkFsbG9jT2JqZWN0KCkgd2hpY2ggZ2NqIG5vIGxvbmdlciBkZWZpbmVzLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNC0wNC0xNiAgQnJ5Y2UgTWNLaW5sYXkgIDxtY2tpbmxheUByZWRoYXQuY29tPgogICAgICAgICAgICAgICAgKiBnY2ovY25pLmggKEp2QWxsb2NPYmplY3QpOiBSZW1vdmUgdGhlc2Ugb2Jzb2xldGUsCiAgICAgICAgICAgICAgICB1bmRvY3VtZW50ZWQgQ05JIGNhbGxzLgoKICAgICAgICAgICAgLSBjaGFuZ2UgSnZDcmVhdGVKYXZhVk0oKSBhcmd1bWVudCBmcm9tIHZvaWQqIHRvIEp2Vk1Jbml0QXJncyosIGZyb20gZ2NqIENoYW5nZWxvZzoKICAgICAgICAgICAgICAyMDA1LTAyLTIzICBUaG9tYXMgRml0enNpbW1vbnMgIDxmaXR6c2ltQHJlZGhhdC5jb20+CiAgICAgICAgICAgICAgUFIgbGliZ2NqLzE2OTIzCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgKEp2Q3JlYXRlSmF2YVZNKTogRGVjbGFyZSB2bV9hcmdzIGFzIEp2Vk1Jbml0QXJncyogcmF0aGVyIHRoYW4gdm9pZCouCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTA0LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiBCdWcgIzEzNjYgLSBSZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBvZiBzdHJ0b2ltYXggYW5kIHN0cnRvdW1heCBpbiBpbnR0eXBlcy5pCgoyMDE0LTA0LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRW51bXMgd2hpY2ggaGF2ZSBiZWVuIGlnbm9yZWQgdmlhICVpZ25vcmUgYW5kIGFyZSBzdWJzZXF1ZW50bHkKICAgICAgICAgICAgdXNlZCBhcmUgaGFuZGxlZCBzbGlnaHRseSBkaWZmZXJlbnRseS4gVHlwZSB3cmFwcGVyIGNsYXNzZXMgYXJlIG5vdyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGEgd3JhcHBlciBvZiBhbiBlbXB0eSBlbnVtLiBQcmV2aW91c2x5IGluIEphdmEgdW5jb21waWxhYmxlCiAgICAgICAgICAgIGNvZGUgd2FzIGdlbmVyYXRlZCBhbmQgaW4gQyMgYW4gaW50IHdhcyB1c2VkLgoKMjAxNC0wNC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHJlZ3Jlc3Npb24gaW4gMy4wLjAgd2hlcmUgbGVnYWwgY29kZSBmb2xsb3dpbmcgYW4gb3BlcmF0b3I8PCBkZWZpbml0aW9uIG1pZ2h0CiAgICAgICAgICAgIGdpdmUgYSBzeW50YXggZXJyb3IuIFNGIEJ1ZyAjMTM2NS4KCjIwMTQtMDQtMDM6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgZGlyZWN0b3IgY29uc3RydWN0b3JzIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4KCjIwMTQtMDQtMDI6IG9sbHkKCSAgICBbUEhQXSBQYXNzIHRoZSBaVFMgY29udGV4dCB3ZSBhbHJlYWR5IGhhdmUgdG8gYXZvaWQgbmVlZGluZyB0bwoJICAgIGNhbGwgVFNSTUxTX0ZFVENILCB3aGljaCBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZS4KCjIwMTQtMDQtMDI6IG9sbHkKCSAgICBbUEhQXSBQYXNzIFpUUyBjb250ZXh0IHRocm91Z2ggdG8gdF9vdXRwdXRfaGVscGVyKCkgc28gaXQgd29ya3MKCSAgICB3aXRoIGEgWlRTLWVuYWJsZWQgYnVpbGQgb2YgUEhQLiAgUmVwb3J0ZWQgYnkgUGllcnJlIExhYmFzdGllIGluCgkgICAgZ2l0aHViIFBSIzE1NS4KCjIwMTQtMDMtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjIEQgR29dIEZpeGVzIGZvciBDIGVudW1zIHVzZWQgaW4gYW4gQVBJIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bQogICAgICAgICAgICBoYXMgbm90IGJlZW4gcGFyc2VkLiBGb3IgRCwgdGhpcyBmaXhlcyBhIHNlZ2ZhdWx0IGluIFNXSUcuIFRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgbm93IHByb2R1Y2UgY29kZSB0aGF0IGNvbXBpbGVzLCBhbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bSBpcyBuZWVkZWQKICAgICAgICAgICAgaW4gb3JkZXIgdG8gdXNlIHRoZSBlbnVtIHByb3Blcmx5IGZyb20gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTQtMDMtMjM6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBGaXggZm9yIHVzYWdlIG9mIHNucHJpbnRmIGluIEx1YSBydW50aW1lIHdoaWNoIFZpc3VhbCBTdHVkaW8gZG9lcyBub3QgaGF2ZS4KClZlcnNpb24gMy4wLjAgKDE2IE1hciAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgaW5pdGlhbGx5IGRldmVsb3BlZCBhcyBDKysweCBzdXBwb3J0IGJ5IE1hdGV2eiBKZWtvdmVjIGFzIGEgR29vZ2xlIFN1bW1lciBvZiBDb2RlCiAgICAgICAgICAgIHByb2plY3QgaGFzIGJlZW4gZnVydGhlciBleHRlbmRlZC4gVGhlIEMrKzExIHN1cHBvcnQgaXMgY29tcHJlaGVuc2l2ZSwgYnV0IGJ5IG5vIG1lYW5zIGNvbXBsZXRlCiAgICAgICAgICAgIG9yIHdpdGhvdXQgbGltaXRhdGlvbnMuIEZ1bGwgZGV0YWlscyBmb3IgZWFjaCBuZXcgZmVhdHVyZSBpbiBDKysxMSBpcyBjb3ZlcmVkIGluIHRoZQogICAgICAgICAgICBDUGx1c1BsdXMxMS5odG1sIGNoYXB0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gd2hpY2ggaXMgaW5jbHVkZWQgaW4gU1dJRyBhbmQgYWxzbyBhdmFpbGFibGUKICAgICAgICAgICAgb25saW5lIGF0IGh0dHA6Ly93d3cuc3dpZy5vcmcvRG9jMy4wL0NQbHVzUGx1czExLmh0bWwuCgoyMDE0LTAzLTE0OiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gTnVtZXJvdXMgTHVhIGltcHJvdmVtZW50czoKICAgICAgICAgICAgMS4gJW5zcGFjZSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiBOYW1lc3BhY2VzIGFyZSBtYXBwZWQgdG8gdGFibGVzIGluIHRoZSBtb2R1bGUsIHdpdGggdGhlIHNhbWUKICAgICAgICAgICAgICAgbmFtZSBhcyB0aGUgQysrIG5hbWVzcGFjZS4KICAgICAgICAgICAgMi4gSW5oZXJpdGFuY2UgaXMgbm93IGhhbmRsZWQgZGlmZmVyZW50bHkuIEVhY2ggY2xhc3MgbWV0YXRhYmxlIGtlZXBzIGEgbGlzdCBvZiBjbGFzcyBiYXNlcyBpbnN0ZWFkCiAgICAgICAgICAgICAgIG9mIG1lcmdpbmcgYWxsIG1lbWJlcnMgb2YgYWxsIGJhc2VzIGludG8gdGhlIGRlcml2ZWQgY2xhc3MuCiAgICAgICAgICAgIDMuIFRoZSBuZXcgbWV0YXRhYmxlcyByZXN1bHQgaW4gZGlmZmVyZW5jZXMgaW4gYWNjZXNzaW5nIGNsYXNzIG1lbWJlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICBzdHJ1Y3QgVGVzdCB7CiAgICAgICAgICAgICAgICAgICAgIGVudW0geyBURVNUMSA9IDEwLCBURVNUMiA9IDIwIH07CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgSUNPTlNUID0gMTI7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgTm93IHRoaXMgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdC5URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdC5JQ09OU1QpCiAgICAgICAgICAgICAgICAgVGhlIG9sZCB3YXkgd2FzOgogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0X1RFU1QxKQogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0X0lDT05TVCkKCiAgICAgICAgICAgIDQuIFRoZSBzcGVjaWFsIGNsYXNzIG1ldGF0YWJsZSBtZW1iZXIgIi5jb25zdHJ1Y3RvciIgd2FzIHJlbW92ZWQuIE5vdyBTV0lHIGdlbmVyYXRlcyB0aGUgcHJveHkKICAgICAgICAgICAgICAgZnVuY3Rpb24gYnkgaXRzZWxmIGFuZCBhc3NpZ25zIGl0IGRpcmVjdGx5IHRvIHRoZSBjbGFzcyB0YWJsZSAiX19jYWxsIiBtZXRob2QuCiAgICAgICAgICAgIDUuIGVMdWEgc2hvdWxkIGFsc28gbm93IHN1cHBvcnQgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIDYuICdjb25zdCcgc3VidGFibGUgaW4gZUx1YSBpcyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCgogICAgICAgICAgICBDaGFuZ2VzIGluIGJlaGF2aW91cjoKICAgICAgICAgICAgYS4gWW91IGNhbiBubyBsb25nZXIgYXNzaWduIHRvIG5vbi1leGlzdGluZyBjbGFzcyBtZW1iZXJzIGluIGNsYXNzZXMgd2l0aG91dCBhIF9fc2V0aXRlbV9fIG1ldGhvZC4KICAgICAgICAgICAgICAgSXQgd2lsbCBjYXVzZSBhIEx1YSBlcnJvci4KICAgICAgICAgICAgYi4gWW91IGNhbiBubyBsb25nZXIgaXRlcmF0ZSBvdmVyIGEgbW9kdWxlIHRhYmxlIGFuZCBjb3B5IGV2ZXJ5dGhpbmcgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KICAgICAgICAgICAgICAgQWN0dWFsbHksIHRoaXMgd2FzIG5ldmVyIHRoZSBjYXNlLCBidXQgaXQgaXMgbm93IGV4cGxpY2l0bHkgcHJvaGliaXRlZC4KICAgICAgICAgICAgYy4gTm93IGNoYW5naW5nIGEgYmFzZSBjbGFzcyB3aWxsIGltbWVkaWF0ZWx5IGFmZmVjdCBhbGwgZGVyaXZlZCBjbGFzc2VzLgogICAgICAgICAgICBkLiBUaGVyZSBtaWdodCBiZSBzb21lIGlzc3VlcyB3aXRoIGluaGVyaXRhbmNlLiBBbHRob3VnaCB0aGUgYmFzZXMgaXRlcmF0aW9uIHNjaGVtZSBpcyB0aGUgc2FtZQogICAgICAgICAgICAgICBhcyB3YXMgdXNlZCBmb3IgbWVyZ2luZyBiYXNlIGNsYXNzZXMgaW50byBkZXJpdmVkIG9uZSwgc29tZSB1bmtub3duIGlzc3VlcyBtYXkgYXJpc2UuCgogICAgICAgICAgICBUaGUgb2xkIG1ldGF0YWJsZSBiZWhhdmlvdXIgY2FuIGJlIHJlc3RvcmVkIGJ5IHVzaW5nIHRoZSAtbm8tb2xkLW1ldGF0YWJsZS1iaW5kaW5ncyBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBDaGFuZ2UgaW4gZGVmYXVsdCBiZWhhdmlvdXIgd3JhcHBpbmcgQysrIGJvb2wuIE9ubHkgYSBQeXRob24gVHJ1ZSBvciBGYWxzZQogICAgICAgICAgICB3aWxsIG5vdyB3b3JrIGZvciBDKysgYm9vbCBwYXJhbWV0ZXJzLiBUaGlzIGZpeGVzIG92ZXJsb2FkaW5nIGJvb2wgd2l0aCBvdGhlciB0eXBlcy4KICAgICAgICAgICAgUHl0aG9uIDIuMyBtaW5pbXVtIGlzIG5vdyByZXF1aXJlZCBmb3Igd3JhcHBpbmcgYm9vbC4KCiAgICAgICAgICAgIFdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoYm9vbCB2YWx1ZSkgeyByZXR1cm4gImJvb2wiOyB9CiAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ZlcmxvYWRlZChpbnQgdmFsdWUpIHsgcmV0dXJuICJpbnQiOyB9CgogICAgICAgICAgICBQcmV2aW91cyBiZWhhdmlvdXI6CiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoRmFsc2UpCiAgICAgICAgICAgICAgJ2ludCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChUcnVlKQogICAgICAgICAgICAgICdpbnQnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoMCkKICAgICAgICAgICAgICAnaW50JwoKICAgICAgICAgICAgTm93IHdlIGdldCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKEZhbHNlKQogICAgICAgICAgICAgICdib29sJwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKDApCiAgICAgICAgICAgICAgJ2ludCcKCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBpcyB3aGVuIHdyYXBwaW5nIGJvb2wgaW4gbm9uLW92ZXJsb2FkZWQgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBib29sZnVuY3Rpb24oYm9vbCB2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOyB9CgogICAgICAgICAgICBUaGUgcHJldmlvdXMgYmVoYXZpb3VyIHdhcyB2ZXJ5IFB5dGhvbmljOgogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oIiIpCiAgICAgICAgICAgICAgJ2ZhbHNlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oImhpIikKICAgICAgICAgICAgICAndHJ1ZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDEyLjM0KQogICAgICAgICAgICAgICd0cnVlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMCkKICAgICAgICAgICAgICAnZmFsc2UnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigxKQogICAgICAgICAgICAgICd0cnVlJwoKICAgICAgICAgICAgTm93IHRoZSBuZXcgYmVoYXZpb3VyIG1vcmUgYWxvbmcgdGhlIGxpbmVzIG9mIEMrKyBkdWUgdG8gc3RyaWN0ZXIgdHlwZSBjaGVja2luZy4gVGhlCiAgICAgICAgICAgIGFib3ZlIGNhbGxzIHJlc3VsdCBpbiBhbiBleGNlcHRpb24gYW5kIG5lZWQgdG8gYmUgZXhwbGljaXRseSBjb252ZXJ0ZWQgaW50byBhIGJvb2wgYXMKICAgICAgICAgICAgZm9sbG93czoKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDApCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgICAgICAgICAgICBUeXBlRXJyb3I6IGluIG1ldGhvZCAnYm9vbGZ1bmN0aW9uJywgYXJndW1lbnQgMSBvZiB0eXBlICdib29sJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oYm9vbCgwKSkKICAgICAgICAgICAgICAnZmFsc2UnCgogICAgICAgICAgICBUaGUgb2xkIGJlaGF2aW91ciBjYW4gYmUgcmVzdXJyZWN0ZWQgYnkgcGFzc2luZyB0aGUgLURTV0lHX1BZVEhPTl9MRUdBQ1lfQk9PTCBjb21tYW5kIGxpbmUKICAgICAgICAgICAgcGFyYW1ldGVyIHdoZW4gZXhlY3V0aW5nIFNXSUcuIFR5cGVtYXBzIGNhbiBvZiBjb3Vyc2UgYmUgd3JpdHRlbiB0byBjdXN0b21pc2UgdGhlIGJlaGF2aW91cgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgcGFyYW1ldGVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDY6IHdzZnVsdG9uCgkgICAgRml4IFNGIEJ1ZyAjMTM2MyAtIFByb2JsZW0gd2l0aCBtZXRob2Qgb3ZlcmxvYWRpbmcgd2hlbiBzb21lIG1ldGhvZHMgYXJlIGFkZGVkIGJ5ICVleHRlbmQKICAgICAgICAgICAgYW5kIG90aGVycyBhcmUgcmVhbCBtZXRob2RzIGFuZCB1c2luZyB0ZW1wbGF0ZSBkZWZhdWx0IHBhcmFtZXRlcnMgd2l0aCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgVGhpcyBpcyBub3RpY2VhYmxlIGFzIGEgcmVncmVzc2lvbiBzaW5jZSAyLjAuMTIgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIGhhbmRsaW5nIGZvciBzb21lIGxhbmd1YWdlcyB3aGVuIHRoZSBzbWFydCBwb2ludGVyIHdyYXBzIHN0ZDo6bWFwIGFuZCBvdGhlciBTVEwgY29udGFpbmVycy4KCjIwMTQtMDMtMDI6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gU0YgUGF0Y2ggIzM0NiBmcm9tIEplbnMgS3J1ZWdlci4gQ29ycmVjdCBleGNlcHRpb24gdGhyb3duIGF0dGVtcHRpbmcgdG8KICAgICAgICAgICAgYWNjZXNzIGEgbm9uLWV4aXN0ZW50IEMvQysrIGdsb2JhbCB2YXJpYWJsZSBvbiB0aGUgJ2N2YXInIG9iamVjdC4gVGhlIGV4Y2VwdGlvbiB0aHJvd24KICAgICAgICAgICAgdXNlZCB0byBiZSBhIE5hbWVFcnJvci4gSG93ZXZlciwgYXMgdGhpcyBhY2Nlc3MgaXMgdmlhIGEgcHJpbWFyeSwgYW4gQXR0cmlidXRlRXJyb3IKICAgICAgICAgICAgaXMgbW9yZSBjb3JyZWN0IGFuZCBzbyB0aGUgZXhjZXB0aW9uIHRocm93biBub3cgaXMgYW4gQXR0cmlidXRlRXJyb3IuIFJlZmVyZW5jZToKICAgICAgICAgICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8yL3JlZmVyZW5jZS9leHByZXNzaW9ucy5odG1sI2F0dHJpYnV0ZS1yZWZlcmVuY2VzCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTAxOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFBhdGNoICMxNDMgRml4IHR5cGUgc2hvd24gd2hlbiB1c2luZyB0eXBlKCkgdG8gaW5jbHVkZSB0aGUgbW9kdWxlIGFuZCBwYWNrYWdlCiAgICAgICAgICAgIG5hbWUgd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTQtMDMtMDE6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gU0YgcGF0Y2ggIzM0NyBGaXggbWlzc2luZyBhcmd1bWVudCBjb3VudCBjaGVja2luZyB3aXRoIC1tb2Rlcm4uCiAgICAgICAgICAgIEZpeGVzIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCB3aGVuIGJ1aWx0aW4gY2hhbmdlcyB3ZXJlIGludHJvZHVjZWQgaW4gU1dJRy0yLjAuMy4KCjIwMTQtMDItMjE6IHdzZnVsdG9uCgkgICAgW1BIUF0gRml4IHdhcm5pbmcgc3VwcHJlc3Npb24gdXNpbmcgJXdhcm5maWx0ZXIgZm9yIFBIUCByZXNlcnZlZCBjbGFzcyBuYW1lcy4KCjIwMTQtMDItMTk6IG9sbHkKCSAgICBbTHVhXSBBZGQga2V5d29yZCB3YXJuaW5ncyBmb3IgTHVhIGtleXdvcmRzIGFuZCBCYXNpYyBGdW5jdGlvbnMuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgLVdhbGxrdyBub3cgaW5jbHVkZXMga2V5d29yZHMgZm9yIGFsbCBsYW5ndWFnZXMgd2l0aCBrZXl3b3JkCgkgICAgd2FybmluZ3MgKHByZXZpb3VzbHkgR28gYW5kIFIgd2VyZSBtaXNzaW5nKS4KCjIwMTQtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIGxpc3RzIG9mIFBIUCBrZXl3b3JkcyB3aXRoIG5ldyBvbmVzIGZyb20gUEhQIDUuNAoJICAgIGFuZCBuZXdlciAoYW5kIHNvbWUgbWlzc2luZyBvbmVzIGZyb20gNS4zKS4gIFJlc2VydmVkIFBIUCBjb25zdGFudHMKCSAgICBuYW1lcyBhcmUgbm93IGNoZWNrZWQgYWdhaW5zdCBlbnVtIHZhbHVlcyBhbmQgY29uc3RhbnRzLCBpbnN0ZWFkCgkgICAgb2YgYWdhaW5zdCBmdW5jdGlvbiBhbmQgbWV0aG9kIG5hbWVzLiAgQnVpbHQtaW4gUEhQIGZ1bmN0aW9uIG5hbWVzCgkgICAgbm8gbG9uZ2VyIG1hdGNoIG1ldGhvZHMgYWRkZWQgYnkgJWV4dGVuZC4gIEZ1bmN0aW9ucyBhbmQgbWV0aG9kcwoJICAgIG5hbWVkICdfX3NsZWVwJywgJ19fd2FrZXVwJywgJ25vdCcsICdwYXJlbnQnLCBvciAndmlydHVhbCcgYXJlIG5vCgkgICAgbG9uZ2VyIG5lZWRsZXNzbHkgcmVuYW1lZC4KCjIwMTQtMDItMTU6IHdzZnVsdG9uCgkgICAgRml4IHRoZSAlJGlzbWVtYmVyICVyZW5hbWUgcHJlZGljYXRlcyB0byBhbHNvIGFwcGx5IHRvIG1lbWJlcnMgYWRkZWQgdmlhICVleHRlbmQuCgogICAgICAgICAgICBBZGQgJSRpc2V4dGVuZG1lbWJlciBmb3IgJXJlbmFtZSBvZiBtZW1iZXJzIGFkZGVkIHZpYSAlZXh0ZW5kLiBUaGlzIGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gbm9ybWFsIGNsYXNzL3N0cnVjdCBtZW1iZXJzIGFuZCAlZXh0ZW5kIG1lbWJlcnMuIEZvciBleGFtcGxlCiAgICAgICAgICAgICclJGlzbWVtYmVyLCAlJG5vdCAlJGlzZXh0ZW5kbWVtYmVyJyB3aWxsIG5vdyBpZGVudGlmeSBqdXN0IGNsYXNzL3N0cnVjdCBtZW1iZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMi0xNjogaGZhbGNpYwogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMTM3IC0gZml4IGNyYXNoZXMvZXhjZXB0aW9ucyBpbiBleGNlcHRpb24gaGFuZGxpbmcgaW4gUHl0aG9uIDMuMwoKMjAxNC0wMi0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBzdXBwb3J0IGZvciB0aGUgY2RhdGEgbGlicmFyeS4KCjIwMTQtMDItMDg6IHZrYWxpbmluCiAgICAgICAgICAgIE5lc3RlZCBjbGFzcyBzdXBwb3J0IGFkZGVkLiBUaGlzIHByaW1hcmlseSBhbGxvd3MgU1dJRyB0byBwcm9wZXJseSBwYXJzZSBuZXN0ZWQKICAgICAgICAgICAgY2xhc3NlcyBhbmQga2VlcCB0aGUgbmVzdGVkIGNsYXNzIGluZm9ybWF0aW9uIGluIHRoZSBwYXJzZSB0cmVlLiBKYXZhIGFuZCBDIwogICAgICAgICAgICBoYXZlIHV0aWxpc2VkIHRoaXMgaW5mb3JtYXRpb24gd3JhcHBpbmcgdGhlIEMrKyBuZXN0ZWQgY2xhc3NlcyBhcyBKYXZhL0MjCiAgICAgICAgICAgIG5lc3RlZCBjbGFzc2VzLiBUaGUgcmVtYWluaW5nIHRhcmdldCBsYW5ndWFnZXMgaWdub3JlIG5lc3RlZCBjbGFzc2VzIGFzIGluCiAgICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zLiBIZWxwIGlzIG5lZWRlZCBieSB1c2VycyBvZiB0aGVzZSByZW1haW5pbmcgbGFuZ3VhZ2VzIHRvCiAgICAgICAgICAgIGRlc2lnbiBob3cgQysrIG5lc3RlZCBjbGFzc2VzIGNhbiBiZSBiZXN0IHdyYXBwZWQuIFBsZWFzZSB0YWxrIHRvIHVzIG9uIHRoZQogICAgICAgICAgICBzd2lnLWRldmVsIG1haWxpbmcgbGlzdCBpZiB5b3UgdGhpbmsgeW91IGNhbiBoZWxwLgoKICAgICAgICAgICAgUHJldmlvdXNseSwgdGhlcmUgd2FzIGxpbWl0ZWQgbmVzdGVkIGNsYXNzIHN1cHBvcnQuIE5lc3RlZCBjbGFzc2VzIHdlcmUgdHJlYXRlZAogICAgICAgICAgICBhcyBvcGFxdWUgcG9pbnRlcnMuIEhvd2V2ZXIsIHRoZSAibmVzdGVkd29ya2Fyb3VuZCIgZmVhdHVyZSBwcm92aWRlZCBhIHdheSB0bwogICAgICAgICAgICB3cmFwIGEgbmVzdGVkIGNsYXNzIGFzIGlmIGl0IHdhcyBhIGdsb2JhbCBjbGFzcy4gVGhpcyBmZWF0dXJlIG5vIGxvbmdlciBleGlzdHMKICAgICAgICAgICAgYW5kIGlzIHJlcGxhY2VkIGJ5IHRoZSBuZXcgImZsYXRuZXN0ZWQiIGZlYXR1cmUuIFRoaXMgZWZmZWN0aXZlbHkgZG9lcyB0aGUgc2FtZQogICAgICAgICAgICB0aGluZyB3aXRoIGxlc3MgbWFudWFsIGNvZGUgdG8gYmUgd3JpdHRlbi4gUGxlYXNlIHNlZSB0aGUgJ05lc3RlZCBjbGFzc2VzJwogICAgICAgICAgICBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uIGluIFNXSUdQbHVzLmh0bWwgaWYgeW91IHdlcmUgcHJldmlvdXNseSB1c2luZyB0aGlzCiAgICAgICAgICAgIGZlYXR1cmUuCgogICAgICAgICAgICBTV0lHIG5vdyBwYXJzZXMgdGhlIGNvbnRlbnRzIG9mIG5lc3RlZCBjbGFzc2VzIHdoZXJlIHByZXZpb3VzbHkgaXQgZGlkIG5vdC4gWW91CiAgICAgICAgICAgIG1heSBmaW5kIHRoYXQgeW91IHdpbGwgbmVlZCB0byBtYWtlIGFkanVzdG1lbnRzIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgYXMKICAgICAgICAgICAgZWZmZWN0aXZlbHkgZXh0cmEgY29kZSBpcyBiZWluZyB3cmFwcGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMi0wNjogZ2phbnNzZW5zCiAgICAgICAgICAgIFtHdWlsZV0gUGF0Y2ggIzEzMy4gTWFrZSBzY20gdG8gc3RyaW5nIGNvbnZlcnNpb24gd29yayB3aXRoIG5vbi1hc2NpaSBzdHJpbmdzLgogICAgICAgICAgICBHdWlsZSAyIGhhcyBhIGNvbXBsZXRlbHkgcmV3cml0dGVuIHN0cmluZyBpbXBsZW1lbnRhdGlvbi4gU1dJRyBtYWRlIHNvbWUgYXNzdW1wdGlvbnMKICAgICAgICAgICAgdGhhdCBhcmUgbm8gbG9uZ2VyIHZhbGlkIGFzIHRvIHRoZSBpbnRlcm5hbHMgb2YgZ3VpbGUncyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCgoyMDE0LTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBuZXcgc3dpZ3R5cGVfaW5vdXQuaSBsaWJyYXJ5IGNvbnRhaW5pbmcgU1dJR1RZUEUgKiYgT1VUUFVUIHR5cGVtYXBzLgoKICAgICAgICAgICAgRXhhbXBsZSB1c2FnZSB3cmFwcGluZzoKCiAgICAgICAgICAgICAgdm9pZCBmKFhYWCAqJiB4KSB7IHggPSBuZXcgWFhYKDExMSk7IH0KCiAgICAgICAgICAgIHdvdWxkIGJlOgoKICAgICAgICAgICAgICBYWFggeCA9IG51bGw7CiAgICAgICAgICAgICAgZihvdXQgeCk7CiAgICAgICAgICAgICAgLy8gdXNlIHgKICAgICAgICAgICAgICB4LkRpc3Bvc2UoKTsgLy8gbWFudWFsbHkgY2xlYXIgbWVtb3J5IG9yIG90aGVyd2lzZSBsZWF2ZSBvdXQgYW5kIGxlYXZlIGl0IHRvIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgoKMjAxNC0wMS0yMTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAlZ29faW1wb3J0IGRpcmVjdGl2ZS4KCjIwMTQtMDEtMjE6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgc3VwcG9ydCBmb3IgR28gMS4zLCBub3QgeWV0IHJlbGVhc2VkLgoKMjAxNC0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3IgZXhjZXB0aW9ucyAoU3dpZzo6RGlyZWN0b3JFeGNlcHRpb24pIG5vdyBkZXJpdmUgZnJvbSBzdGQ6OmV4Y2VwdGlvbgogICAgICAgICAgICBhbmQgaGVuY2UgcHJvdmlkZSB0aGUgd2hhdCgpIG1ldGhvZC4gSW4gUHl0aG9uIGFuZCBSdWJ5LCB0aGlzIHJlcGxhY2VzIHRoZSBub3cKICAgICAgICAgICAgZGVwcmVjYXRlZCBEaXJlY3RvckV4Y2VwdGlvbjo6Z2V0TWVzc2FnZSgpIG1ldGhvZC4KCjIwMTQtMDEtMTQ6IGRpb3JjZXR5CiAgICAgICAgICAgIFBhdGNoICMxMTIgLSBGaXggc3ltYm9sIHJlc29sdXRpb24gaW52b2x2aW5nIHNjb3BlcyB0aGF0IGhhdmUgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICAgIG9mIHR5cGVkZWZzIC0gZml4ZXMgc29tZSB0ZW1wbGF0ZSByZXNvbHV0aW9ucyBhcyB3ZWxsIGFzIHNvbWUgdHlwZW1hcCBzZWFyY2hlcy4KCjIwMTQtMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBhbmQgZG9jdW1lbnQgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSBvdmVycmlkZSBiZWhhdmlvdXIgLSB0aGUgbmF0dXJhbHZhcgogICAgICAgICAgICBmZWF0dXJlIGF0dGFjaGVkIHRvIGEgdmFyaWFibGUgbmFtZSBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBuYXR1cmFsdmFyCiAgICAgICAgICAgIGZlYXR1cmUgYXR0YWNoZWQgdG8gdGhlIHZhcmlhYmxlJ3MgdHlwZS4gVGhlIG92ZXJyaWRpbmcgd2FzIG5vdCB3b3JraW5nCiAgICAgICAgICAgIHdoZW4gdHVybmluZyB0aGUgZmVhdHVyZSBvZmYgb24gdGhlIHZhcmlhYmxlJ3MgbmFtZS4KCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IGFueSB1c2Ugb2YgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSB3aWxsIG92ZXJyaWRlIHRoZSBnbG9iYWwKICAgICAgICAgICAgc2V0dGluZy4gUHJldmlvdXNseSB3aGVuIHNldCBnbG9iYWxseSBieSAtbmF0dXJhbHZhciBvciAlbW9kdWxlKG5hdHVyYWx2YXI9MSksCiAgICAgICAgICAgIHVzZSBvZiB0aGUgbmF0dXJhbHZhciBmZWF0dXJlIHdhcyBub3QgYWx3YXlzIGhvbm91cmVkLgoKMjAxNC0wMS0wNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeCBidWcgdGhhdCBicm9rZSB1c2luZyBkaXJlY3RvcnMgZnJvbSBhIHRocmVhZCBub3QKCSAgICBjcmVhdGVkIGJ5IEdvLgoKMjAxMy0xMi0yNDogcHRvbXVsaWsKICAgICAgICAgICAgW1B5dGhvbl0gU0YgQnVnICMxMjk3CgogICAgICAgICAgICBSZXNvbHZlIHNldmVyYWwgaXNzdWVzIHJlbGF0ZWQgdG8gcHl0aG9uIGltcG9ydHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBpbXBvcnQgbW9kdWxlcyBoYXZpbmcgdGhlIHNhbWUgbW9kdWxlCiAgICAgICAgICAgIG5hbWVzLCBidXQgYmVsb25naW5nIGluIGRpZmZlcmVudCBwYWNrYWdlcy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEZyb20gdGhlIHVzZXIncyB2aWV3cG9pbnQsIHRoaXMgcGF0Y2ggZ2l2ZXMgYSBsaXR0bGUgYml0IG1vcmUgY29udHJvbCBvbgogICAgICAgICAgICBpbXBvcnQgc3RhdGVtZW50cyBnZW5lcmF0ZWQgYnkgU1dJRy4gVGhlIHVzZXIgbWF5IGNob29zZSB0byB1c2UgcmVsYXRpdmUKICAgICAgICAgICAgb3IgYWJzb2x1dGUgaW1wb3J0cy4KICAgICAgICAgICAgCiAgICAgICAgICAgIFNvbWUgZGV0YWlsczoKICAgICAgICAgICAgICAtIHdlIChzdGlsbCkgZ2VuZXJhdGUgaW1wb3J0IHN0YXRlbWVudHMgaW4gdGhlIGZvcm0gJ2ltcG9ydCBhLmIuYycgd2hpY2gKICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGFic29sdXRlIGltcG9ydHMgaW4gcHl0aG9uMyBhbmQgKHRoZSBvbmx5IGF2YWlsYWJsZSkKICAgICAgICAgICAgICAgIGFtYmlndW91cyBvbmUgaW4gcHl0aG9uMi4KICAgICAgICAgICAgICAtIGFkZGVkIC1yZWxhdGl2ZWltcG9ydCBvcHRpb24gdG8gdXNlIGV4cGxpY2l0IHJlbGF0aXZlIGltcG9ydCBzeW50YXgKICAgICAgICAgICAgICAgIChweXRob24zKSwKCiAgICAgICAgICAgIFRoZSAiUHl0aG9uIFBhY2thZ2VzIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uIGRpc2N1c3NlcyBob3cgdG8gd29yawogICAgICAgICAgICB3aXRoIGltcG9ydGluZyBwYWNrYWdlcyBpbmNsdWRpbmcgdGhlIG5ldyAtcmVsYXRpdmVpbXBvcnQgY29tbWFuZCBsaW5lIG9wdGlvbi4KCjIwMTMtMTItMjM6IHZhZHoKICAgICAgICAgICAgW09jdGF2ZSwgUGVybCwgUHl0aG9uLCBSLCBSdWJ5LCBUY2xdIENoYW5nZSB0aGUgbGVuZ3RoIG9mIHN0cmluZ3MgY3JlYXRlZCBmcm9tIGZpeGVkLXNpemUgY2hhcgogICAgICAgICAgICBidWZmZXJzIGluIEMgY29kZS4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnJlYWs6IGEgImNoYXIgYnVmWzVdIiBjb250YWluaW5nICJob1wwbGEiIHdhcwogICAgICAgICAgICByZXR1cm5lZCBhcyBhIHN0cmluZyBvZiBsZW5ndGggNSBiZWZvcmUsIGJ1dCBpcyByZXR1cm5lZCBhcyBhIHN0cmluZyBvZiBsZW5ndGggMiBub3cuIEFsc28sCiAgICAgICAgICAgIGl0IHdhcyBwb3NzaWJsZSB0byBhc3NpZ24gYSAobm9uLU5VTC10ZXJtaW5hdGVkKSBzdHJpbmcgImhlbGxvIiB0byBzdWNoIGEgYnVmZmVyIGJlZm9yZSBidXQKICAgICAgICAgICAgbm93IHRoaXMgZmFpbHMgYW5kIG9ubHkgImhlbG8iIGNhbiBmaXQuCgogICAgICAgICAgICBBcHBseSAiY2hhciBGSVhTSVpFW0FOWV0iIHR5cGVtYXBzIHRvIGV4cGxpY2l0bHkgY2hvb3NlIHRoZSBvbGQgYmVoYXZpb3VyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0xMi0yMzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnMuCgoyMDEzLTEyLTE4OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRG9uJ3QgcmVxdWlyZSB0aGF0IEdvIGVudmlyb25tZW50IHZhcmlhYmxlcyBiZSBzZXQKCSAgICB3aGVuIHJ1bm5pbmcgZXhhbXBsZXMgb3IgdGVzdHN1aXRlIHdoZW4gdXNpbmcgR28gMSBvcgoJICAgIGxhdGVyLgoKMjAxMy0xMi0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFJlbW92ZSAtbG9uZ3NpemUgb3B0aW9uIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKCSAgICBpZ25vcmUgaXQgaWYgc2VlbikuCgoyMDEzLTEyLTE3OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIC1nby1wa2dwYXRoIG9wdGlvbi4KCjIwMTMtMTItMTY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBVcGRhdGUgZm9yIEdvIDEuMiByZWxlYXNlLiAgQWRkIHN1cHBvcnQgZm9yIGxpbmtpbmcKCSAgICBTV0lHIGNvZGUgZGlyZWN0bHkgaW50byBleGVjdXRhYmxlLCByYXRoZXIgdGhhbiB1c2luZyBhCgkgICAgc2hhcmVkIGxpYnJhcnkuCgoyMDEzLTEyLTEzOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIFNXSUcgc291cmNlIGZpbGUgbmFtZSBhcyBjb21tZW50cyBpbiBnZW5lcmF0ZWQKCSAgICBmaWxlcy4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgR28gZG9jdW1lbnRhdGlvbiB0b29scy4KCjIwMTMtMTItMTI6IGpsZXZlcXVlCgkgICAgW0x1YV0gRml4IHR5cG8gKHdjaGFyIGluc3RlYWQgb2Ygd2NoYXJfdCkgd2hpY2ggbWFkZSB3Y2hhci5pCgkgICAgZm9yIEx1YSB1c2VsZXNzLgoKMjAxMy0xMi0xMjogdm1pa2xvcwoJICAgIFtQSFBdIFBIUCdzIHBlY3VsaWFyIGNhbGwtdGltZSBwYXNzLWJ5LXJlZmVyZW5jZSBmZWF0dXJlIHdhcwoJICAgIGRlcHJlY2F0ZWQgaW4gUEhQIDUuMyBhbmQgcmVtb3ZlZCBpbiBQSFAgNS40LCBzbyB1cGRhdGUgdGhlIFJFRgoJICAgIHR5cGVtYXBzIGluIHBocHBvaW50ZXJzLmkgdG8gc3BlY2lmeSBwYXNzLWJ5LXJlZmVyZW5jZSBpbiB0aGUKCSAgICBmdW5jdGlvbiBkZWZpbml0aW9uLiAgRXhhbXBsZXMvcGhwL3BvaW50ZXIgaGFzIGJlZW4gdXBkYXRlZAoJICAgIGFjY29yZGluZ2x5LgoKMjAxMy0xMi0xMjogb2xseQoJICAgIFtQSFBdIFRoZSB1c2FnZSBvZiAkaW5wdXQgaW4gUEhQIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGhhcyBiZWVuCgkgICAgY2hhbmdlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgbGFuZ3VhZ2VzLiAgVGhlIHR5cGVtYXBzCgkgICAgcHJvdmlkZWQgYnkgU1dJRyBoYXZlIGJlZW4gdXBkYXRlZCBhY2NvcmRpbmdseSwgYnV0IGlmIHlvdQoJICAgIGhhdmUgd3JpdHRlbiB5b3VyIG93biBkaXJlY3Rvcm91dCB0eXBlbWFwcywgeW91J2xsIG5lZWQgdG8KCSAgICB1cGRhdGUgJGlucHV0IHRvICYkaW5wdXQgKG9yIG1ha2UgZXF1aXZhbGVudCBjaGFuZ2VzKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTEtMjc6IHZhZHoKICAgICAgICAgICAgW0MjLCBKYXZhLCBQeXRob25dIEFkZCBzdGRfYXV0b19wdHIuaSBkZWZpbmluZyB0eXBlbWFwcyBmb3IgcmV0dXJuaW5nIHN0ZDo6YXV0b19wdHI8Pi4KCjIwMTMtMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggIzc5IGZyb20gQnJhbnQgS3lzZXIKICAgICAgICAgICAgICAtIFJlbW92ZSB1c2luZyBkaXJlY3RpdmVzIGZyb20gdGhlIGdlbmVyYXRlZCBDIyBjb2RlIGFuZCBmdWxseSBxdWFsaWZ5IHRoZSB1c2Ugb2YgYWxsIC5ORVQKICAgICAgICAgICAgICAgIGZyYW1ld29yayB0eXBlcyBpbiBvcmRlciB0byBtaW5pbWl6ZSBwb3RlbnRpYWwgbmFtZSBjb2xsaXNpb25zIGZyb20gaW5wdXQgZmlsZXMgZGVmaW5pbmcKICAgICAgICAgICAgICAgIHR5cGVzLCBuYW1lc3BhY2UsIGV0YyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgLk5FVCBmcmFtZXdvcmsgbWVtYmVycy4KICAgICAgICAgICAgICAtIEdsb2JhbGx5IHF1YWxpZnkgdGhlIHVzZSBvZiAuTkVUIGZyYW1ld29yayB0eXBlcyBpbiB0aGUgU3lzdGVtIG5hbWVzcGFjZQogICAgICAgICAgICAgIC0gUmVtb3ZlIC5ORVQgMS4xIHN1cHBvcnQsIC5ORVQgMiBpcyB0aGUgbWluaW11bSBmb3IgdGhlIEMjIG1vZHVsZQoKICAgICAgICAgICAgVGhpcyBpcyBhIHBvdGVudGlhbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBicmVhayBpZiBjb2RlIGhhcyBiZWVuIGFkZGVkIHJlbHlpbmcgb24gdGhlc2UgdXNpbmcKICAgICAgICAgICAgc3RhdGVtZW50cyB0aGF0IHVzZWQgdG8gYmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB1c2luZyBTeXN0ZW07CiAgICAgICAgICAgICAgdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKICAgICAgICAgICAgVGhlIHF1aWNrIGZpeCB0byBhZGQgdGhlc2UgYmFjayBpbiBpcyB0byBhZGQgdGhlIC1EU1dJRzJfQ1NIQVJQIGNvbW1hbmQgbGluZSBvcHRpb24gd2hlbgogICAgICAgICAgICBleGVjdXRpbmcgU1dJRy4gU2VlIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggc29tZSBjb3JuZXIgY2FzZXMgZm9yIHRoZSAkcGFja2FnZXBhdGgvJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCgoyMDEzLTExLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzkxIGZyb20gTWFydmluIEdyZWVuYmVyZyAtIEFkZCBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZSBmb3IgaW1wcm92ZWQKICAgICAgICAgICAgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGRpcmVjdG9yIG1ldGhvZHMgZm9yIEphdmEuCgoyMDEzLTEwLTE1OiB2YWR6CiAgICAgICAgICAgIEFsbG93IHVzaW5nIFxsLCBcTCwgXHUsIFxVIGFuZCBcRSBpbiB0aGUgc3Vic3RpdHV0aW9uIHBhcnQgb2YgJShyZWdleDovcGF0dGVybi9zdWJzdC8pCiAgICAgICAgICAgIGluc2lkZSAlcmVuYW1lIHRvIGNoYW5nZSB0aGUgY2FzZSBvZiB0aGUgdGV4dCBiZWluZyByZXBsYWNlZC4KCjIwMTMtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBBcHBseSAjOTYgLSBzdXBlcmNsYXNzIG5vdCBsaXNwaWZ5CgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBNZXJnZSBpbiBDKysxMSBzdXBwb3J0IGZyb20gdGhlIGdzb2MyMDA5LW1hdGV2eiBicmFuY2ggd2hlcmUgTWF0ZXZ6IEpla292ZWMgZmlyc3QKICAgICAgICAgICAgc3RhcnRlZCB0aGUgQysrMHggYWRkaXRpb25zLiBEb2N1bWVudGF0aW9uIG9mIHRoZSBDKysxMSBmZWF0dXJlcyBzdXBwb3J0ZWQgaXMgaW4gYQogICAgICAgICAgICBuZXcgQ2hhcHRlciBvZiB0aGUgZG9jdW1lbnRhdGlvbiwgIlNXSUcgYW5kIEMrKzExIiBpbiBEb2MvTWFudWFsL0NQbHVzUGx1czExLmh0bWwuCgoyMDEzLTEwLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJW5hdHVyYWx2YXIgbm90IGhhdmluZyBhbnkgYWZmZWN0IG9uIHRlbXBsYXRlZCBjbGFzc2VzIGluc3RhbnRpYXRlZCB3aXRoIGFuCiAgICAgICAgICAgIGVudW0gYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgoyMDEzLTA5LTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGEgbWVtb3J5IGxlYWsgZm9yIHRoZSBqYXZhIGNoYXIgKipTVFJJTkdfQVJSQVkgdHlwZW1hcHMuCgpWZXJzaW9uIDIuMC4xMiAoOSBGZWIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAxLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUEhQXSBGaXggY29tcGlsYXRpb24gZXJyb3IgaW4gWlRTIG1vZGUgKDY0IGJpdCB3aW5kb3dzKSBkdWUgdG8gaW5jb3JyZWN0IHBsYWNlbWVudAogICAgICAgICAgICBvZiBUU1JNTFNfRkVUQ0goKSBpbiBTV0lHX1BocF9HZXRNb2R1bGUoKSBhcyByZXBvcnRlZCBieSBNYXJrIERhd3Nvbi1CdXR0ZXJ3b3J0aC4KCjIwMTQtMDEtMTM6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gdXBkYXRlIHN1cHBvcnQgdG8gT2N0YXZlIHZlcnNpb24gMy44LjAKCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIG5vIGxvbmdlciBkZWZpbmVzIE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIsIGJ1dCAzLjguMQogICAgICAgICAgICAgIHdpbGwgZGVmaW5lIE9DVEFWRV97TUFKT1IsTUlOT1IsUEFUQ0h9X1ZFUlNJT04gaW5zdGVhZDogc2VlCiAgICAgICAgICAgICAgICBodHRwOi8vaGcuc2F2YW5uYWguZ251Lm9yZy9oZ3dlYi9vY3RhdmUvcmV2L2I2YjZlMGRjNzAwZQogICAgICAgICAgICAgIFNvIHdlIG5vdyB1c2UgYSBuZXcgbWFjcm8gU1dJR19PQ1RBVkVfUFJFUkVRKG1ham9yLG1pbm9yLHBhdGNoKSB0bwogICAgICAgICAgICAgIGVuYWJsZSBmZWF0dXJlcyByZXF1aXJpbmcgT2N0YXZlIHZlcnNpb24gbWFqb3IubWlub3IucGF0Y2ggb3IgbGF0ZXIuCgogICAgICAgICAgICAgIEZvciBPY3RhdmUgdmVyc2lvbnMgcHJpb3IgdG8gMy44LjEsIHdlIHJlY29uc3RydWN0IHZhbHVlcyBmb3IKICAgICAgICAgICAgICBPQ1RBVkVfe01BSk9SLE1JTk9SLFBBVENIfV9WRVJTSU9OIGJhc2VkIG9uIE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIsCiAgICAgICAgICAgICAgZXh0cmFjdGVkIGZyb20gT2N0YXZlJ3MgQ2hhbmdlTG9ncy4gQW4gYWRkaXRpb25hbCBoYWNrIGlzIG5lZWRlZCB0bwogICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gT2N0YXZlIDw9IDMuMi54IGFuZCAzLjguMCwgbmVpdGhlciBvZiB3aGljaCBkZWZpbmUKICAgICAgICAgICAgICBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLgoKICAgICAgICAgICAgLSBPY3RhdmUgMy44LjAgZGVwcmVjYXRlcyBzeW1ib2xfdGFibGU6OnZhcnJlZigpLCBzbyByZW1vdmUgaXRzIHVzZQogICAgICAgICAgICAgIGZvciB0aGlzIGFuZCBmdXR1cmUgdmVyc2lvbnMgb2YgT2N0YXZlLgoKICAgICAgICAgICAgLSBPY3RhdmUgMy44LjAgcmVtb3ZlcyBvY3RhdmVfdmFsdWU6OmlzX3JlYWxfbmRfYXJyYXkoKSwgdXNlZCBpbgogICAgICAgICAgICAgIG9jdGF2ZV9zd2lnX3R5cGU6OmRpbXMoKS4gSXRzIHVzZSBpcyBub3QgcmVxdWlyZWQgaGVyZSwgc28gcmVtb3ZlIGl0LgoKICAgICAgICAgICAgLSBSZXRlc3RlZCBhZ2FpbnN0IE9jdGF2ZSB2ZXJzaW9ucyAzLjAuNSwgMy4yLjQsIDMuNC4zLCAzLjYuNCwgYW5kIDMuOC4wLgoKICAgICAgICAgICAgLSBVcGRhdGVkIE9jdGF2ZSBkb2N1bWVudGF0aW9uIHdpdGggdGVzdGVkIE9jdGF2ZSB2ZXJzaW9ucywgYW5kIGFkZGVkIGEKICAgICAgICAgICAgICB3YXJuaW5nIGFnYWluc3QgdXNpbmcgdmVyc2lvbnMgPD0gMy54LngsIHdoaWNoIGFyZSBubyBsb25nZXIgdGVzdGVkLgoKMjAxMy0xMi0yMjogd3NmdWx0b24KICAgICAgICAgICAgQysrMTEgc3VwcG9ydCBmb3IgbmV3IHZlcnNpb25zIG9mIGVyYXNlIGFuZCBpbnNlcnQgaW4gdGhlIFNUTCBjb250YWluZXJzLgoKICAgICAgICAgICAgVGhlIGVyYXNlIGFuZCBpbnNlcnQgbWV0aG9kcyBpbiB0aGUgY29udGFpbmVycyB1c2UgY29uc3RfaXRlcmF0b3IgaW5zdGVhZAogICAgICAgICAgICBvZiBpdGVyYXRvciBpbiBDKysxMS4gIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHRoZSBtZXRob2RzIHdyYXBwZWQgbXVzdCBtYXRjaAogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBleGFjdGx5LiBTcGVjaWZpY2FsbHkgd2hlbiBmdWxsIHR5cGUgaW5mb3JtYXRpb24gZm9yCiAgICAgICAgICAgIHRlbXBsYXRlIHR5cGVzIGlzIG1pc3Npbmcgb3IgU1dJRyBmYWlscyB0byBsb29rIHVwIHRoZSB0eXBlIGNvcnJlY3RseSwKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfdmVjdG9yLmk+CiAgICAgICAgICAgICAgdHlwZWRlZiBmbG9hdCBSZWFsOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShSZWFsVmVjdG9yKSBzdGQ6OnZlY3RvcjxSZWFsPjsKCiAgICAgICAgICAgIFNXSUcgZG9lcyBub3QgZmluZCBzdGQ6OnZlY3RvcjxSZWFsPjo6aXRlcmF0b3IgYmVjYXVzZSAldGVtcGxhdGUgdXNpbmcKICAgICAgICAgICAgdHlwZWRlZnMgZG9lcyBub3QgYWx3YXlzIHdvcmsgYW5kIHNvIFNXSUcgZG9lc24ndCBrbm93IGlmIHRoZSB0eXBlIGlzCiAgICAgICAgICAgIGNvcHlhYmxlIGFuZCBzbyB1c2VzIFN3aWdWYWx1ZVdyYXBwZXI8aXRlcmF0b3I+IHdoaWNoIGRvZXMKICAgICAgICAgICAgbm90IHN1cHBvcnQgY29udmVyc2lvbiB0byBhbm90aGVyIHR5cGUgKGNvbnN0X2l0ZXJhdG9yKS4gVGhpcyByZXN1bHRlZAogICAgICAgICAgICBpbiBjb21waWxhdGlvbiBlcnJvcnMgd2hlbiB1c2luZyB0aGUgQysrMTEgdmVyc2lvbiBvZiB0aGUgY29udGFpbmVycy4KCiAgICAgICAgICAgIENsb3NlcyAjNzMKCjIwMTMtMTAtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggU0YgIzEzNDAgLSBWaXN1YWwgU3R1ZGlvIGNvbXBpbGUgZXJyb3IgaW4gQysrIHdyYXBwZXJzIGR1ZSB0byAjaW5jbHVkZSA8ZXhjZXB0aW9uPgogICAgICAgICAgICB3aXRoaW4gZXh0ZXJuICJDIiBibG9jay4KCjIwMTMtMTAtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiAjMTM0NSAtIE1pc3NpbmcgI2luY2x1ZGUgPHN0ZGRlZi5oPiBmb3Igb2Zmc2V0b2Ygd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTMtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5ICM5MiAtIG1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudHMgZm9yIFNXSUdfTHVhX2FkZF9uYW1lc3BhY2VfZGV0YWlscygpCiAgICAgICAgICAgIGFuZCBTV0lHX0x1YV9uYW1lc3BhY2VfcmVnaXN0ZXIoKS4KClZlcnNpb24gMi4wLjExICgxNSBTZXAgMjAxMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMy0wOS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBhdHRlbXB0IHRvIGZyZWUgYSBub24taGVhcCBvYmplY3QgaW4gT1VUUFVUIHR5cGVtYXBzIGZvcjoKICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqT1VUUFVUCiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgICAgc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgICAgY2hhciAqT1VUUFVUCiAgICAgICAgICAgICAgc2lnbmVkIGNoYXIqT1VUUFVUCiAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcipPVVRQVVQKCjIwMTMtMDktMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFB1bGwgR2l0IHBhdGNoICM2Mi4KICAgICAgICAgICAgICAxKSBTdGF0aWMgbWVtYmVycyBhbmQgc3RhdGljIGZ1bmN0aW9ucyBpbnNpZGUgY2xhc3MgY2FuIGJlIGFjY2Vzc2VkIGFzCiAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZS5DbGFzc05hbWUuRnVuY3Rpb25OYW1lIChNZW1iZXJOYW1lIHJlc3BlY3RpdmVseSkuIE9sZCB3YXkgc3VjaCBhcwogICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUuQ2xhc3NOYW1lX0Z1bmN0aW9uTmFtZSBzdGlsbCB3b3Jrcy4KICAgICAgICAgICAgICAyKSBTYW1lIGdvZXMgZm9yIGVudW1zIGluc2lkZSBjbGFzc2VzOiBNb2R1bGVOYW1lLkNsYXNzTmFtZS5FbnVtVmFsdWUxIGV0Yy4KCjIwMTMtMDktMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtVVExdIEluZmluaXR5IGlzIG5vdyBieSBkZWZhdWx0IGFuIGFjY2VwdGFibGUgdmFsdWUgZm9yIHR5cGUgJ2Zsb2F0Jy4gVGhpcyBmaXggbWFrZXMKICAgICAgICAgICAgdGhlIGhhbmRsaW5nIG9mIHR5cGUgJ2Zsb2F0JyBhbmQgJ2RvdWJsZScgdGhlIHNhbWUuIFRoZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGUKICAgICAgICAgICAgQzk5IGlzZmluaXRlKCkgbWFjcm8sIG9yIG90aGVyd2lzZSBzb21lIHBsYXRmb3JtIGRlcGVuZGVudCBlcXVpdmFsZW50cywgdG8gYmUgYXZhaWxhYmxlLgoKICAgICAgICAgICAgVXNlcnMgcmVxdWlyaW5nIHRoZSBvbGQgYmVoYXZpb3VyIG9mIG5vdCBhY2NlcHRpbmcgaW5maW5pdHksIGNhbiBkZWZpbmUgYSAnY2hlY2snIHR5cGVtYXAKICAgICAgICAgICAgd2hlcmV2ZXIgYSBmbG9hdCBpcyB1c2VkLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAldHlwZW1hcChjaGVjayxmcmFnbWVudD0iPGZsb2F0Lmg+IikgZmxvYXQsIGNvbnN0IGZsb2F0ICYgJXsKICAgICAgICAgICAgICAgIGlmICgkMSA8IC1GTFRfTUFYIHx8ICQxID4gRkxUX01BWCkgewogICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLCAiT3ZlcmZsb3cgaW4gdHlwZSBmbG9hdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQdWxsIEdpdCBwYXRjaCAjODE6IEluY2x1ZGUgTHVhIGVycm9yIGxvY3VzIGluIFNXSUcgZXJyb3IgbWVzc2FnZXMuICAKICAgICAgICAgICAgVGhpcyBpcyBzdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBMdWEgZXJyb3IgbWVzc2FnZXMsIGFuZCBtYWtlcyBpdCBtdWNoCiAgICAgICAgICAgIGVhc2llciB0byBmaW5kIGJ1Z3MuCgoyMDEzLTA4LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBQdWxsIEdpdCBwYXRjaCAjNzU6IEhhbmRsZSBVVEYtOCBmaWxlcyB3aXRoIEJPTSBhdCBiZWdpbm5pbmcgb2YgZmlsZS4gV2FzIGdpdmluZyBhbgogICAgICAgICAgICAnSWxsZWdhbCB0b2tlbicgc3ludGF4IGVycm9yLgoKMjAxMy0wOC0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBQdWxsIEdpdCBwYXRjaCAjNzc6IEFsbG93IGV4cG9ydGluZyBzdGQ6Om1hcCB1c2luZyBub24tZGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uLgoKMjAxMy0wOC0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gJWltcGxpY2l0Y29udiBpcyBpbXByb3ZlZCBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuIExpa2UgaW4gQysrLCB0aGUgbWV0aG9kcwogICAgICAgICAgICB3aXRoIHRoZSBhY3R1YWwgdHlwZXMgYXJlIGNvbnNpZGVyZWQgYmVmb3JlIHRyeWluZyBpbXBsaWNpdCBjb252ZXJzaW9ucy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgJWltcGxpY2l0Y29udiBBOwogICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgIEEoaW50IGkpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2xhc3MgQ0NDIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IHh4KGludCBpKSB7IHJldHVybiAxMTsgfQogICAgICAgICAgICAgICAgICBpbnQgeHgoY29uc3QgQSYgaSkgeyByZXR1cm4gMjI7IH0KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBweXRob24gY29kZToKCiAgICAgICAgICAgICAgQ0NDKCkueHgoLTEpCgogICAgICAgICAgICB3aWxsIG5vdyByZXR1cm4gMTEgaW5zdGVhZCBvZiAyMiAtIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIG5vdCBkb25lLgoKMjAxMy0wOC0yMzogb2xseQoJICAgIFtQeXRob25dIEZpeCBjbGFuZysrIHdhcm5pbmcgaW4gZ2VuZXJhdGVkIHdyYXBwZXIgY29kZS4KCjIwMTMtMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICVpbXBsaWNpdGNvbnYgd2lsbCBub3cgYWNjZXB0IE5vbmUgd2hlcmUgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gdGFrZXMgYSBDL0MrKyBwb2ludGVyLgogICAgICAgICAgICBQcm9ibGVtIGhpZ2hsaWdodGVkIGJ5IEJvIFBlbmcuIENsb3NlcyBTRiBwYXRjaCAjMjMwLgoKMjAxMy0wOC0wNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gU0YgUGF0Y2ggIzMyNiBmcm9tIEtyaXMgVGhpZWxlbWFucyAtIFJlbW92ZSBTd2lnUHlPYmplY3RfcHJpbnQgYW5kIFN3aWdQeU9iamVjdF9zdHIgYW5kCiAgICAgICAgICAgIG1ha2UgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIHVzZSB0aGUgZGVmYXVsdCBweXRob24gaW1wbGVtZW50YXRpb25zLCB3aGljaCB3aWxsIGZhbGwgYmFjayB0byByZXByCiAgICAgICAgICAgIChmb3IgLWJ1aWx0aW4gb3B0aW9uKS4KCiAgICAgICAgICAgIEFkdmFudGFnZXM6CiAgICAgICAgICAgIC0gaXQgYXZvaWRzIHRoZSBzd2lnIHVzZXIgaGF2aW5nIHRvIGp1bXAgdGhyb3VnaCBob29wcyB0byBnZXQgcHJpbnQgdG8gd29yayBhcyBleHBlY3RlZCB3aGVuCiAgICAgICAgICAgICAgcmVkZWZpbmluZyByZXByL3N0ciBzbG90cy4KICAgICAgICAgICAgLSB0eXBpbmcgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSBvbiB0aGUgcHl0aG9uIHByb21wdCBub3cgcHJpbnRzIHRoZSByZXN1bHQgb2YgYSAocG9zc2libHkgcmVkZWZpbmVkKQogICAgICAgICAgICAgIHJlcHIsIHdpdGhvdXQgdGhlIHN3aWcgdXNlciBoYXZpbmcgdG8gZG8gYW55IGV4dHJhIHdvcmsuCiAgICAgICAgICAgIC0gd2hlbiByZWRlZmluaW5nIHJlcHIsIHRoZSBzd2lnIHVzZXIgZG9lc24ndCBuZWNlc3NhcmlseSBoYXZlIHRvIHJlZGVmaW5lIHN0ciBhcyBpdCB3aWxsIGNhbGwgdGhlCiAgICAgICAgICAgICAgcmVkZWZpbmVkIHJlcHIKICAgICAgICAgICAgLSB0aGUgYmVoYXZpb3VyIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2l0aG91dCB0aGUgLWJ1aWx0aW4gb3B0aW9uIHdoaWxlIHJlcXVpcmluZyBubyBleHRyYSB3b3JrCiAgICAgICAgICAgICAgYnkgdGhlIHVzZXIgKGFzaWRlIGZyb20gYWRkaW5nIHRoZSAlZmVhdHVyZSgicHl0aG9uOnNsb3QuLi4pIHN0YXRlbWVudHMgb2YgY291cnNlKQoKICAgICAgICAgICAgRGlzYWR2YW50YWdlOgogICAgICAgICAgICAtIGRlZmF1bHQgc3RyKCkgd2lsbCBnaXZlIGRpZmZlcmVudCAoYnV0IGNsZWFyZXI/KSBvdXRwdXQgb24gc3dpZ2dlZCBjbGFzc2VzCgoyMDEzLTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5XSBGaXggIzY0ICM2NTogTWlzc2luZyBjb2RlIGluIHN0ZDo6bXVsdGltYXAgd3JhcHBlcnMuIFByZXZpb3VzbHkgYW4gaW5zdGFudGlhdGlvbgogICAgICAgICAgICBvZiBhIHN0ZDo6bWFwIHdhcyBlcnJvbmVvdXNseSByZXF1aXJlZCBpbiBhZGRpdGlvbiB0byBhbiBpbnN0YW50aWF0aW9uIG9mIHN0ZDo6bXVsdGltYXAgd2l0aCB0aGUKICAgICAgICAgICAgc2FtZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgY29tcGlsYXRpb24gZXJyb3JzIGZvciB0aGUgd3JhcHBlcnMgb2YgYSBzdGQ6Om11bHRpbWFwLgoKMjAxMy0wNy0xNDogam9lcXVhbnQKICAgICAgICAgICAgW1JdIENoYW5nZSB0eXBlcyBmaWxlIHRvIGFsbG93IGZvciBTRVhQIHJldHVybiB2YWx1ZXMKCjIwMTMtMDctMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCAlcHl0aG9uYmVnaW4gZGlyZWN0aXZlIHdoaWNoIHdvcmtzIGxpa2UgJXB5dGhvbmNvZGUsIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIGNvZGUgaXMKICAgICAgICAgICAgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2VuZXJhdGVkIC5weSBmaWxlLiBUaGlzIGlzIHByaW1hcmlseSBuZWVkZWQgZm9yIGltcG9ydGluZyBmcm9tCiAgICAgICAgICAgIF9fZnV0dXJlX18gc3RhdGVtZW50cyByZXF1aXJlZCB0byBiZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVweXRob25iZWdpbiAlewogICAgICAgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KICAgICAgICAgICAgICBwcmludCgiTG9hZGluZyIsICJXaGl6eiIsICJCYW5nIiwgc2VwPScgLi4uICcpCiAgICAgICAgICAgICAgJX0KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IFNGIHBhdGNoICMzNDAgLSBVbmluaXRpYWxpemVkIHZhcmlhYmxlIGZpeCBpbiBTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0cgogICAgICAgICAgICB3aGVuIHVzaW5nIC1idWlsdGluLgoKMjAxMy0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIEFwcGx5IFNGIHBhdGNoICMzNDEgLSBmaXggYSBjb25zdF9jYXN0IGluIGdlbmVyYXRlZCBjb2RlIHRoYXQgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgYSA8OjogZGlncmFwaCB3aGVuIHVzaW5nIHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIChnbG9iYWwgc2NvcGUpIGluIGEgdGVtcGxhdGUgdHlwZS4KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBTRiBwYXRjaCAjMzQyIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHRvIGZpeCBzb21lIGRpcmVjdG9yIGNsYXNzZXMgY3Jhc2hpbmcgb24KICAgICAgICAgICAgb2JqZWN0IGRlbGV0aW9uIHdoZW4gdXNpbmcgLWJ1aWx0aW4uIEZpeGVzIFNGIGJ1ZyAjMTMwMS4KCjIwMTMtMDYtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBTV0lHX1BZVEhPTl9JTlRFUlBSRVRFUl9OT19ERUJVRyBtYWNybyB3aGljaCBjYW4gYmUgZGVmaW5lZCB0byB1c2UgdGhlIFJlbGVhc2UgdmVyc2lvbgogICAgICAgICAgICBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyIGluIERlYnVnIGJ1aWxkcyBvZiB0aGUgd3JhcHBlcnMuIFRoZSBWaXN1YWwgU3R1ZGlvIC5kc3AgZXhhbXBsZQogICAgICAgICAgICBmaWxlcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gdXNlIHRoaXMgc28gdGhhdCBEZWJ1ZyBidWlsZHMgd2lsbCBub3cgd29yayB3aXRob3V0IGhhdmluZwogICAgICAgICAgICB0byBpbnN0YWxsIG9yIGJ1aWxkIGEgRGVidWcgYnVpbGQgb2YgdGhlIGludGVycHJldGVyLgoKMjAxMy0wNi0wNzogd3NmdWx0b24KCSAgICBbUnVieV0gR2l0IGlzc3VlICM1Mi4gRml4IHJlZ3Jlc3Npb24gd2l0aCBtaXNzaW5nIHJiX2NvbXBsZXhfbmV3IGZ1bmN0aW9uIGZvciBSdWJ5CiAgICAgICAgICAgIHZlcnNpb25zIHByaW9yIHRvIDEuOSB1c2luZyBzdGQ6OmNvbXBsZXggd3JhcHBlcnMgaWYganVzdCB1c2luZyBzdGQ6OmNvbXBsZXggYXMgYW4gb3V0cHV0IHR5cGUuCiAgICAgICAgICAgIEFsc28gZml4IHRoZSBDb21wbGV4IGhlbHBlciBmdW5jdGlvbnMgZXh0ZXJuYWwgdmlzaWJpbGl0eSAodG8gc3RhdGljIGJ5IGRlZmF1bHQpLgoKMjAxMy0wNi0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBTV0lHX1pUU19Db252ZXJ0UmVzb3VyY2VQdHIoKSBub3QgdG8gZGVyZWZlcmVuY2UgTlVMTAoJICAgIGlmIHRoZSB0eXBlIGxvb2t1cCBmYWlscy4KClZlcnNpb24gMi4wLjEwICgyNyBNYXkgMjAxMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMy0wNS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbiAzIGluY29uc2lzdGVuY3kgd2hlbiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBwYXNzZWQKICAgICAgICAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgZXhwZWN0cyBhbiB1bnNpZ25lZCBDIHR5cGUuIEFuIE92ZXJGbG93IGVycm9yIGlzCiAgICAgICAgICAgIG5vdyBjb25zaXN0ZW50bHkgdGhyb3duIGluc3RlYWQgb2YgYSBUeXBlRXJyb3IuCgoyMDEzLTA1LTI1OiBBcnRlbSBTZXJlYnJpeXNraXkKICAgICAgICAgICAgU1ZOIFBhdGNoIHRpY2tldCAjMzM4IC0gZml4ZXMgdG8gJWF0dHJpYnV0ZSBtYWNyb3MgZm9yIHRlbXBsYXRlIHVzYWdlCiAgICAgICAgICAgIHdpdGggJWFyZy4KCjIwMTMtMDUtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjY2FjaGUtc3dpZyBpbnRlcm5hbCBlcnJvciBidWcgZHVlIHRvIHByZW1hdHVyZSBmaWxlIGNsZWFudXAuCgogICAgICAgICAgICBGaXhlcyBTRiBidWcgMTMxOSB3aGljaCBzaG93cyB1cCBhcyBhIGZhaWx1cmUgaW4gdGhlIGNjYWNoZSB0ZXN0cyBvbgogICAgICAgICAgICBEZWJpYW4gNjQgYml0IFdoZWV6eSwgcG9zc2libHkgYmVjYXVzZSBFTkFCTEVfWkxJQiBpcyBkZWZpbmVkLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvcm5lciBjYXNlIHdoaWNoIHdpbGwgYmUgaGl0IHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzCiAgICAgICAgICAgIGluIHRoZSBjYWNoZSBpcyBzZXQgdG8gYmUgcXVpdGUgbG93ICgtRiBvcHRpb24pLCByZXN1bHRpbmcgaW4gYSBjYWNoZSBtaXNzLgoKMjAxMy0wNS0wOToga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBGaXggYnVncyBpbiBPY3RhdmUgbW9kdWxlIGxvYWRpbmc6CiAgICAgICAgICAgIC0gZml4IGEgbWVtb3J5IGxlYWsgaW4gc2V0dGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIC0gaW5zdGFsbCBmdW5jdGlvbnMgb25seSBvbmNlLCB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZHMKCjIwMTMtMDQtMjg6IGdqYW5zc2VucwogICAgICAgICAgICBbR3VpbGVdIFVwZGF0ZXMgaW4gZ3VpbGUgbW9kdWxlOgogICAgICAgICAgICAtIEFkZCBzdXBwb3J0IGZvciBndWlsZSAyLjAKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGd1aWxlIDEuNgogICAgICAgICAgICAtIERyb3Agc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyB3cmFwcGVycyB1c2luZyBndWlsZSdzIGdoIGludGVyZmFjZS4KICAgICAgICAgICAgICBBbGwgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpbGwgdXNlIHRoZSBzY20gaW50ZXJmYWNlIGZyb20gbm93IG9uLgogICAgICAgICAgICAtIERlcHJlY2F0ZSAtZ2ggYW5kIC1zY20gb3B0aW9ucy4gVGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KICAgICAgICAgICAgICBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgd2hlbiB0aGVzZSBvcHRpb25zIGFyZSBzdGlsbCB1c2VkLgogICAgICAgICAgICAtIEZpeCBhbGwgdGVzdHMgYW5kIGV4YW1wbGVzIHRvIGhhdmUgYSBzdWNjZXNzZnVsIHRyYXZpcyB0ZXN0CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBQYXRjaCAjMzYgZnJvbSBKZXN1cyBMb3BleiB0byBhZGQgc3VwcG9ydCBmb3IgJGRlc2NyaXB0b3IoKSBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvIGV4cGFuc2lvbiAKICAgICAgICAgICAgaW4gZnJhZ21lbnRzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lRGVzY3JpcHRvciIsICJoZWFkZXIiKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiJGRlc2NyaXB0b3IoTmFtZSkiOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICB3aGljaCB3aWxsIGdlbmVyYXRlIGludG8gdGhlIHdyYXBwZXIgaWYgdGhlIGZyYWdtZW50IGlzIHVzZWQ6CgogICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lRGVzY3JpcHRvciA9ICJTV0lHVFlQRV9OYW1lIjsKCjIwMTMtMDQtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiBCdWcgIzQyOCAtIFN5bnRheCBlcnJvciB3aGVuIHByZXByb2Nlc3NvciBtYWNyb3MgYXJlIGRlZmluZWQgaW5zaWRlIG9mIGVudW0gbGlzdHMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7CiAgICAgICAgICAgICAgICBlWmVybyA9IDAKICAgICAgICAgICAgICAjZGVmaW5lIE9ORSAxCiAgICAgICAgICAgICAgfSBFRm9vOwoKICAgICAgICAgICAgVGhlIG1hY3JvcyBhcmUgc2lsZW50bHkgaWdub3JlZC4KCjIwMTMtMDQtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHVsbCBwYXRjaCAjMzQgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBzbWFydCBwb2ludGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIGRpcmVjdG9ycy4KCjIwMTMtMDQtMTU6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gb3V0cHV0IG9mIGNsZWFudXAgY29kZS4KICAgICAgICAgICAgLSBDbGVhbnVwIGNvZGUgaXMgbm93IHdyaXR0ZW4gYWxzbyBhZnRlciB0aGUgImZhaWw6IiBsYWJlbCwgc28gaXQgd2lsbCBiZSBjYWxsZWQgaWYKICAgICAgICAgICAgICBhIFNXSUdfZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgd3JhcHBpbmcgZnVuY3Rpb24sIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBtb2R1bGVzLgogICAgICAgICAgICAtIE9jdGF2ZSBtb2R1bGUgbm93IGFsc28gcmVjb2duaXNlcyB0aGUgIiRjbGVhbnVwIiBzcGVjaWFsIHZhcmlhYmxlLCBpZiBuZWVkZWQuCgoyMDEzLTA0LTA4OiBrd3dldHRlCiAgICAgICAgICAgIEFkZCAtTVAgb3B0aW9uIHRvIFNXSUcgZm9yIGdlbmVyYXRpbmcgcGhvbnkgdGFyZ2V0cyBmb3IgYWxsIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgLSBQcmV2ZW50cyBtYWtlIGZyb20gY29tcGxhaW5pbmcgaWYgaGVhZGVyIGZpbGVzIGhhdmUgYmVlbiBkZWxldGVkIGJlZm9yZQogICAgICAgICAgICAgIHRoZSBkZXBlbmRlbmN5IGZpbGUgaGFzIGJlZW4gdXBkYXRlZC4KICAgICAgICAgICAgLSBNb2RlbGxlZCBvbiBzaW1pbGFyIG9wdGlvbiBpbiBHQ0MuCgoyMDEzLTA0LTA5OiBvbGx5CgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgZGlyZWN0b3JpbiB0eXBlbWFwIGZvciBjaGFyKiBhbmQgY2hhcltdIHdoaWNoCgkgICAgZml4ZXMgZGlyZWN0b3Jfc3RyaW5nIHRlc3RjYXNlIGZhaWx1cmUuCgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMjkyIC0gUnVudGltZSBmaXhlcyBmb3IgUHJvYyBjaGFuZ2VzIGluIHJ1YnktMS45IHdoZW4gdXNpbmcgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzIHRoYXQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJlZGljYXRlLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoTWFwKSBzdGQ6Om1hcDxzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkxBTkdVQUdFX09CSiwgc3dpZzo6QmluYXJ5UHJlZGljYXRlPD4gPjsKCjIwMTMtMDQtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTRiBCdWcgIzExNTkgLSBDb3JyZWN0bHkgY2hlY2sgcmJfcmVzcG9uZF90byBjYWxsIHJldHVybiB2YWx1ZXMgdG8gZml4IHNvbWUKICAgICAgICAgICAgZnVydGhlciAxLjkgcHJvYmxlbXMgd2l0aCBmdW5jdG9ycyBhbmQgdXNlIG9mIENvbXBsZXggd3JhcHBlcnMuCgoyMDEzLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUnVudGltZSBmaXhlcyBmb3Igc3RkOjpjb21wbGV4IHdyYXBwZXJzIGZvciBydWJ5LTEuOSAtIG5ldyBuYXRpdmUgUnVieSBjb21wbGV4IG51bWJlcnMgYXJlIHVzZWQuCgoyMDEzLTAzLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IHNlZyBmYXVsdCB3aGVuIHVzaW5nIFNUTCBjb250YWluZXJzIG9mIGdlbmVyaWMgUnVieSB0eXBlcywgR0NfVkFMVUUgb3IgTEFOR1VBR0VfT0JKRUNULAogICAgICAgICAgICBvbiBleGl0IG9mIHRoZSBSdWJ5IGludGVycHJldGVyLiBNb3JlIGZyZXF1ZW50bHkgb2JzZXJ2ZWQgaW4gcnVieS0xLjkuCgoyMDEzLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGRlbGV0ZV9pZiAocmVqZWN0ISkgZm9yIHRoZSBTVEwgY29udGFpbmVyIHdyYXBwZXJzIHdoaWNoIHByZXZpb3VzbHkgd291bGQKICAgICAgICAgICAgc29tZXRpbWVzIHNlZyBmYXVsdCBvciBub3Qgd29yay4KCjIwMTMtMDMtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIHVuZGVmaW5lZCBiZWhhdmlvdXIgZGVsZXRpbmcgc2xpY2VzIGluIHRoZSBTVEwgY29udGFpbmVycy4KCjIwMTMtMDMtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgRF0gRml4IHNlZyBmYXVsdCBpbiBTV0lHIHVzaW5nIGRpcmVjdG9ycyB3aGVuIGNsYXNzIGFuZCB2aXJ0dWFsIG1ldGhvZCBuYW1lcyBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgZXhjZXB0IGJlaW5nIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzIHdoZW4gdGhlICVuc3BhY2UgZmVhdHVyZSBpcyBub3QgYmVpbmcgdXNlZC4KCjIwMTMtMDItMTk6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGJ1ZyBpbiBTV0lHJ3MgaGFuZGxpbmcgb2YgcXVhbGlmaWVkIChlLmcuIGNvbnN0KSB2YXJpYWJsZXMgb2YgYXJyYXkgdHlwZS4gR2l2ZW4gdGhlIHR5cGVkZWYKICAgICAgICAgICAgICBhKDcpLnEodm9sYXRpbGUpLmRvdWJsZSBteWFycmF5ICAgICAvLyB0eXBlZGVmIHZvbGF0aWxlIGRvdWJsZVs3XSBteWFycmF5OwogICAgICAgICAgICB0aGUgdHlwZQogICAgICAgICAgICAgIHEoY29uc3QpLm15YXJyYXkgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IG15YXJyYXkKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgIGEoNykucShjb25zdCB2b2xhdGlsZSkuZG91YmxlICAgICAgIC8vIGNvbnN0IHZvbGF0aWxlIGRvdWJsZVs3XQogICAgICAgICAgICBQcmV2aW91c2x5LCBTd2lnVHlwZV90eXBlZGVmX3Jlc29sdmUoKSBwcm9kdWNlcyB0aGUgdHlwZQogICAgICAgICAgICAgIHEoY29uc3QpLmEoNykucSh2b2xhdGlsZSkuZG91YmxlICAgIC8vIG5vbi1zZW5zaWNhbCB0eXBlCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIG5ldmVyIG1hdGNoICV0eXBlbWFwIGRlY2xhcmF0aW9ucywgd2hvc2UgdHlwZXMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgogICAgICAgICAgICBBZGQgdHlwZW1hcF9hcnJheV9xdWFsaWZpZXJzLmkgdG8gdGhlIHRlc3Qgc3VpdGUgd2hpY2ggY2hlY2tzIGZvciB0aGUgY29ycmVjdCBiZWhhdmlvdXIuCgoyMDEzLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgdHlwZWRlZiBuYW1lcyB1c2VkIGFzIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG5hbWVzIGluICVleHRlbmQuIFRoZSByZWFsCiAgICAgICAgICAgIGNsYXNzL3N0cnVjdCBuYW1lIHNob3VsZCBiZSB1c2VkLgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdFU3RydWN0IHsKICAgICAgICAgICAgICAgIGludCBpdmFyOwogICAgICAgICAgICAgIH0gRVN0cnVjdDsKCiAgICAgICAgICAgICAgJWV4dGVuZCB0YWdFU3RydWN0IHsKICAgICAgICAgICAgICAgIEVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB0YWdFU3RydWN0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgRVN0cnVjdCAqcyA9IG5ldyBFU3RydWN0KCk7CiAgICAgICAgICAgICAgICAgIHMtPml2YXIgPSBpdmFyMDsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB+RVN0cnVjdCgpIC8vIGlsbGVnYWwgbmFtZSwgc2hvdWxkIGJlIH50YWdFU3RydWN0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVsZXRlICRzZWxmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBub3cgdGhlc2UgdHJpZ2dlciBhIHdhcm5pbmc6CgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTA3OiBXYXJuaW5nIDUyMjogVXNlIG9mIGFuIGlsbGVnYWwgY29uc3RydWN0b3IgbmFtZSAnRVN0cnVjdCcgaW4KICAgICAgICAgICAgICAlZXh0ZW5kIGlzIGRlcHJlY2F0ZWQsIHRoZSBjb25zdHJ1Y3RvciBuYW1lIHNob3VsZCBiZSAndGFnRVN0cnVjdCcuCiAgICAgICAgICAgICAgZXh0ZW5kX2NvbnN0cnVjdG9yX2Rlc3RydWN0b3IuaToxMTE6IFdhcm5pbmcgNTIzOiBVc2Ugb2YgYW4gaWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgZGVzdHJ1Y3RvciBuYW1lIHNob3VsZCBiZSAndGFnRVN0cnVjdCcuCgogICAgICAgICAgICBUaGVzZSAlZXh0ZW5kIGRlc3RydWN0b3IgYW5kIGNvbnN0cnVjdG9yIG5hbWVzIHdlcmUgdmFsaWQgdXAgdG8gc3dpZy0yLjAuNCwgaG93ZXZlciBzd2lnLTIuMC41IGlnbm9yZWQKICAgICAgICAgICAgdGhlbSBhbHRvZ2V0aGVyIGZvciBDIGNvZGUgYXMgcmVwb3J0ZWQgaW4gU0YgYnVnICMxMzA2LiBUaGUgb2xkIGJlaGF2aW91ciBvZiB1c2luZyB0aGVtIGhhcyBiZWVuCiAgICAgICAgICAgIHJlc3RvcmVkIGZvciBub3csIGJ1dCBpcyBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gYW5vbnltb3VzbHkgZGVmaW5lZCB0eXBlZGVmCiAgICAgICAgICAgIGNsYXNzZXMvc3RydWN0cyBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7Li4ufSBYOwoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBXaGVuIGdlbmVyYXRpbmcgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5ICVleHRlbmQsIHVzZSAiKHZvaWQpIiBmb3Igbm8tYXJndW1lbnQgZnVuY3Rpb25zCiAgICAgICAgICAgIGluc3RlYWQgb2YgIigpIi4gVGhpcyBwcmV2ZW50cyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoICJnY2MgLVdzdHJpY3QtcHJvdG90eXBlcyIuCgoyMDEzLTAyLTE3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIE1pbm9yIGZpeCB0byBhdXRvZG9jIGdlbmVyYXRpb246IGdldCB0aGUgcmlnaHQgdHlwZSBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBzdHJ1Y3RzLgoKMjAxMy0wMi0xNTogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBpbiAlZXh0ZW5kIHRoYXQgYXJlIG5vdCB0aGUgcmVhbCBjbGFzcy9zdHJ1Y3QgbmFtZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IFN0cnVjdEJOYW1lIHsKICAgICAgICAgICAgICAgIGludCBteWludDsKICAgICAgICAgICAgICB9IFN0cnVjdEI7CgogICAgICAgICAgICAgICVleHRlbmQgU3RydWN0QiB7CiAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBub3cgdHJpZ2dlciBhIHdhcm5pbmc6CgogICAgICAgICAgICAgIHN3aWdfZXh0ZW5kLmk6MTk6IFdhcm5pbmcgMzI2OiBEZXByZWNhdGVkICVleHRlbmQgbmFtZSB1c2VkIC0gdGhlIHN0cnVjdCBuYW1lIFN0cnVjdEJOYW1lCiAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIFN0cnVjdEIuCgogICAgICAgICAgICBUaGlzIGlzIG9ubHkgcGFydGlhbGx5IHdvcmtpbmcgYW55d2F5ICh0aGUgJWV4dGVuZCBvbmx5IHdvcmtlZCBpZiBwbGFjZWQgYWZ0ZXIgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb24pLiAKCjIwMTMtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBBcHBseSBwYXRjaCAjMjIgLSBGaXggbWlzc2luZyBwYWNrYWdlIGJlZm9yZSAmYm9keQoKMjAxMy0wMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEVuc3VyZSAnamF2YXBhY2thZ2UnIHR5cGVtYXAgaXMgdXNlZCBhcyBpdCBzdG9wcGVkIHdvcmtpbmcgZnJvbSB2ZXJzaW9uIDIuMC41LgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggU0YgIzMzNCAtIEZpeCBkZWZhdWx0IHZhbHVlIGNvbnZlcnNpb25zICJUUlVFIi0+VHJ1ZSwgIkZBTFNFIi0+RmFsc2UuCgoyMDEzLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggU0YgIzMzNSAtIFRydWx5IGlnbm9yZSBjb25zdHJ1Y3RvcnMgaW4gZGlyZWN0b3JzIHdpdGggJWlnbm9yZS4KCjIwMTMtMDEtMTg6IEJyYW50IEt5c2VyCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTUgLSBBbGxvdyB0aGUgdXNlIG9mIHRoZSBuc3BhY2UgZmVhdHVyZSB3aXRob3V0IHRoZSAtcGFja2FnZSBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIFRoaXMgd29ya3MgYXMgbG9uZyBhbmQgdGhlIG5ldyBqbmljbGFzc3BhY2thZ2UgcHJhZ21hIGlzIHVzZWQgdG8gcGxhY2UgdGhlIEpOSSBpbnRlcm1lZGlhdGUgY2xhc3MKICAgICAgICAgICAgaW50byBhIHBhY2thZ2UgYW5kIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyB1c2VkIHRvIHBsYWNlIGFsbCBleHBvc2VkIHR5cGVzIGludG8gYSBwYWNrYWdlLgoKMjAxMy0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFZpc3VhbCBTdHVkaW8gZXhhbXBsZXMgdG8gd29yayB3aGVuIFNXSUcgaXMgdW56aXBwZWQgaW50byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHNwYWNlcy4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGNzdHlwZSB0eXBlbWFwIGxvb2t1cCBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzbyB0aGF0IGEgZnVsbHkgcXVhbGlmaWVkIHZhcmlhYmxlIG5hbWUKICAgICAgICAgICAgbWF0Y2hlcy4gRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBib29sIE1WYXI6Om12YXIgIk15Qm9vbCIKICAgICAgICAgICAgICBzdHJ1Y3QgTVZhciB7CiAgICAgICAgICAgICAgICBib29sIG12YXI7CiAgICAgICAgICAgICAgfTsKCjIwMTMtMDEtMTE6IEJyYW50IEt5c2VyCgkgICAgW0phdmEsIEMjLCBEXSBTRiBCdWcgIzEyOTkgLSBGaXggZ2VuZXJhdGVkIG5hbWVzIGZvciB3aGVuICVuc3BhY2UgaXMgdXNlZCBvbgogICAgICAgICAgICBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0d28gZGlmZmVyZW50IG5hbWVzcGFjZXMuCgoyMDEzLTAxLTExOiBWbGFkaW1pciBLYWxpbmluCgkgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgY3NkaXJlY3RvcmluICdwcmUnLCAncG9zdCcgYW5kICd0ZXJtaW5hdG9yJyBhdHRyaWJ1dGVzLgoKMjAxMy0wMS0wODogb2xseQoJICAgIFtQSFBdIEZpeCB0byB3b3JrIHdpdGggYSBaVFMgYnVpbGQgb2YgUEhQIChicm9rZW4gaW4gMi4wLjcpLgoKMjAxMy0wMS0wNzogb2xseQoJICAgIEZpeCBiYXNoaXNtIGluIGNvbmZpZ3VyZSwgaW50cm9kdWNlZCBpbiAyLjAuOS4KCjIwMTMtMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFB1bGwgcGF0Y2ggIzQgZnJvbSBwdG9tdWxpayB0byBmaXggU0YgQnVnICMxMjk2IC0gRml4IGluY29ycmVjdCB3YXJuaW5nIGZvciB2aXJ0dWFsIGRlc3RydWN0b3JzCiAgICAgICAgICAgIGluIHRlbXBsYXRlcywgc3VjaCBhczoKICAgICAgICAgICAgIFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSBCPCBBID46On5CKCkuIElnbm9yZWQuCgoyMDEzLTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQdWxsIHBhdGNoICMzIGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NSAtIHN0YW5kYXJkIGV4Y2VwdGlvbnMgYXMKICAgICAgICAgICAgY2xhc3NlcyB1c2luZyB0aGUgU1dJR19TVERfRVhDRVBUSU9OU19BU19DTEFTU0VTIG1hY3JvLgoKMjAxMy0wMS0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFB1bGwgcGF0Y2ggIzIgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBTRiBCdWcgIzEyODMgLSBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVjdGlvbgogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjIwMTMtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMxIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjc4IC0gZml4IGRpcmVjdG9ycyBhbmQgbnNwYWNlIGZlYXR1cmUgd2hlbgogICAgICAgICAgICBtdWx0aWxldmVsIG5hbWVzcGFjZXMgYXJlIHVzZWQuCgpWZXJzaW9uIDIuMC45ICgxNiBEZWNlbWJlciAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0xMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdhcmJhZ2UgbGluZSBudW1iZXIgLyBlbXB0eSBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1pc3NpbmcKICAgICAgICAgICAgJ30nIG9yICcpJyBlcnJvciBtZXNzYWdlcy4KCjIwMTItMTItMTU6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIDM1MzA0NDQsIENsYXNzI21ldGhvZHMgYW5kIENsYXNzI2NvbnN0YW50cyByZXR1cm5zIGFycmF5IG9mCiAgICAgICAgICAgIHN5bWJvbHMgaW4gUnVieSAxLjkrCgoyMDEyLTEyLTE0OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDM5IGFuZCBmaW5hbGx5IHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBTVFIyQ1NUUigpIG1hY3JvCiAgICAgICAgICAgIHdpdGggU3RyaW5nVmFsdWVQdHIoKS4gU1RSMkNTVFIgd2FzIGRlcHJlY2F0ZWQgc2luY2UgeWVhcnMgYW5kIGdvdCByZW1vdmVkIGluIFJ1YnkgMS45CgoyMDEyLTEyLTE0OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBsaWVkIHBhdGNoZXMgIzM1MzA0NDIgYW5kIDM1MzA0NDMgdG8gYWRhcHQgY29tcGlsZSBhbmQgcnVudGltZSBpbmNsdWRlCiAgICAgICAgICAgIHBhdGhzIHRvIG1hdGNoIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzE2MTYxNCAtIFNvbWUgc3RyaW5nIGNvbnN0YW50cyBhcmUgaW5jb3JyZWN0CgoyMDEyLTEyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gRml4ICMzNTI5NjkwIC0gRml4IGluY29ycmVjdCBjb25zdGFudCBuYW1lcy4KCjIwMTItMTItMTI6IGRyam9lCgkgICAgW1JdIGFkZCBmaXggdG8gZmluYWxpemVyIHRoYXQgd2FzIG1pc3NlZCBlYXJsaWVyCgoyMDEyLTEyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMzU5MDUyMiAtIGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIHBhdGhzIGZvciBQeXRob24gMyBldmVuIGlmIGEgbW9kdWxlIGlzIGluIHRoZQogICAgICAgICAgICBzYW1lIHBhY2thZ2UuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBCdWcgIzM1NjM2NDcgLSBQeUludF9Gcm9tU2l6ZV90IHVuYXZhaWxhYmxlIHByaW9yIHRvIFB5dGhvbiAyLjUgZm9yIHVuc2lnbmVkIGludCB0eXBlcy4KCjIwMTItMTItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggYnVnICMzNTcxMzYxIC0gQysrIGNvbW1lbnQgaW4gQyB3cmFwcGVycy4KCjIwMTItMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggIzM1NzEwMjkgd2hpY2ggYWRkcyBtaXNzaW5nIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmLgoKMjAxMi0xMS0yODoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBTaW1wbGlmaWVkIG1vZHVsZSBsb2FkaW5nOiBub3cganVzdCB0aGUgc3ludGF4CiAgICAgICAgICAgICQgZXhhbXBsZTsKICAgICAgICAgICAgaXMgYWNjZXB0ZWQsIHdoaWNoIGxvYWRzIGZ1bmN0aW9ucyBnbG9iYWxseSBidXQgY29uc3RhbnRzIGFuZCB2YXJpYWJsZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCiAgICAgICAgICAgIFRoaXMgbWFrZSBtb2R1bGUgbG9hZGluZyBiZWhhdmlvdXIgcmVsaWFibHkgY29uc2lzdGVudCwgYW5kIHJlZHVjZXMgcHJvYmxlbXMgd2hlbiBsb2FkaW5nIG1vZHVsZXMgd2hpY2gKICAgICAgICAgICAgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gcHJldmlvdXNseSBsb2FkZWQuCgoyMDEyLTExLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2ZmaV0gRml4IGp1bmsgb3V0cHV0IHdoZW4gd3JhcHBpbmcgc2luZ2xlIGNoYXJhY3RlciBsaXRlcmFsIGNvbnN0YW50cy4KCjIwMTItMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2wsIE1vZHVsYTNdIEFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIC1vdXRkaXIuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnZmF1bHRzIHdoZW4gdXNpbmcgZmlsZW5hbWUgcGF0aHMgZ3JlYXRlciB0aGFuIDEwMjQgY2hhcmFjdGVycyBpbiBsZW5ndGguCgoyMDEyLTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2NhY2hlLXN3aWddIEFwcGx5IHBhdGNoICMzNTg2MzkyIGZyb20gRnJlZGVyaWsgRGV3ZWVyZHQgdG8gZml4IHNvbWUgZXJyb3IgY2FzZXMgLSBpbmNvcnJlY3RseSB1c2luZwogICAgICAgICAgICBtZW1vcnkgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVsZXRlZC4KCjIwMTItMTEtMDk6IHZ6ZWl0bGluCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBvdmVyZmxvdyB3aGVuIHBhc3NpbmcgdmFsdWVzIGdyZWF0ZXIgdGhhbiBMT05HX01BWCBmcm9tIFB5dGhvbiAzIGZvciBwYXJhbWV0ZXJzIHdpdGggdW5zaWduZWQgbG9uZyBDIHR5cGUuCgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBmZWF0dXJlIG1hdGNoaW5nIGlzc3VlcyBmb3IgaW1wbGljaXQgZGVzdHJ1Y3RvcnMgYW5kIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgaW1wbGljaXQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcnMgYWRkZWQgd2l0aCAlY29weWN0b3IuIFByZXZpb3VzbHkgYSBmZWF0dXJlIGZvciB0aGVzZSBoYWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIG1hdGNoLiBOb3cgdGhlIGZvbGxvd2luZyB3aWxsIGFsc28gbWF0Y2g6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJ4eXoiKSB+WFhYKCk7CiAgICAgICAgICAgICAgc3RydWN0IFhYWCB7fTsKCjIwMTItMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1cnRoZXIgY29uc2lzdGVuY3kgaW4gbmFtZWQgb3V0cHV0IHR5cGVtYXAgbG9va3VwcyBmb3IgaW1wbGljaXQgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQKICAgICAgICAgICAgaW1wbGljaXQgY29weSBjb25zdHJ1Y3RvcnMgYWRkZWQgd2l0aCAlY29weWN0b3IuIFByZXZpb3VzbHkgb25seSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIGJlaW5nCiAgICAgICAgICAgIHVzZWQsIG5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSB3aWxsIGFsc28gYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHk6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZAoKICAgICAgICAgICAgTm93IHRoZSB1bnF1YWxpZmllZCBuYW1lIGlzIGFsc28gdXNlZDoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM4OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIH5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZAoKMjAxMi0xMS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgc3VidGxlIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cCBtaXNzZXMsIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3YXMgbm90IGFsd2F5cyBiZWluZwogICAgICAgICAgICB1c2VkIGZvciB2YXJpYWJsZXMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgR2xvYiB7CiAgICAgICAgICAgICAgICBpbnQgTXlWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHNlYXJjaCBydWxlcyAoYXMgc2hvd24gYnkgLWRlYnVnLXRtc2VhcmNoKSBmb3IgdGhlIGdldHRlciB3cmFwcGVyIHdlcmU6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTo0NDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQKCiAgICAgICAgICAgIE5vdyB0aGUgc2NvcGUgaXMgbmFtZWQgY29ycmVjdGx5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IEdsb2I6Ok15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IEdsb2I6Ok15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgoyMDEyLTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3IgdHlwZW1hcCBzZWFyY2hpbmcgc28gdGhhdCBhIHR5cGVtYXAgc3BlY2lmaWVkIHdpdGggYSBuYW1lIHdpbGwgYmUgY29ycmVjdGx5IG1hdGNoZWQuIFByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG5hbWUgd2FzIGlnbm9yZWQgZHVyaW5nIHRoZSB0eXBlbWFwIHNlYXJjaC4gQXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGxpc3Qgb2YgdHlwZW1hcHM6IAogICAgICAgICAgICBkaXJlY3Rvcm91dCwgY3NkaXJlY3Rvcm91dCwgY3N0eXBlLCBpbXR5cGUsIGN0eXBlLCBkZGlyZWN0b3JvdXQsIGR0eXBlLCBnb3R5cGUsIGp0eXBlLCBqbmksIGphdmFkaXJlY3Rvcm91dC4KCjIwMTItMTAtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vc3Qgb2YgdGhlIHNwZWNpYWwgdmFyaWFibGVzIGF2YWlsYWJsZSBmb3IgdXNlIGluICVleGNlcHRpb24gYXJlIG5vdyBhbHNvIGF2YWlsYWJsZSBmb3IgZXhwYW5zaW9uIGluCiAgICAgICAgICAgICVleHRlbmQgYmxvY2tzLiBUaGVzZSBhcmU6ICRuYW1lICRzeW1uYW1lICRvdmVybmFtZSAkZGVjbCAkZnVsbGRlY2wgJHBhcmVudGNsYXNzbmFtZSAkcGFyZW50Y2xhc3NzeW1uYW1lLCBzZWUgZG9jcwogICAgICAgICAgICBvbiAiQ2xhc3MgZXh0ZW5zaW9uIiBpbiBTV0lHUGx1cy5odG1sLiBQYXRjaCBiYXNlZCBvbiBzdWJtaXNzaW9uIGZyb20gS3JpcyBUaGllbGVtYW5zLgoKMjAxMi0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkaXRpb25hbCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJWV4Y2VwdGlvbiBhcmUgZXhwYW5kZWQgYXMgZm9sbG93czoKICAgICAgICAgICAgICAkcGFyZW50Y2xhc3NuYW1lIC0gVGhlIHBhcmVudCBjbGFzcyBuYW1lIChpZiBhbnkpIGZvciBhIG1ldGhvZC4KICAgICAgICAgICAgICAkcGFyZW50Y2xhc3NzeW1uYW1lIC0gVGhlIHRhcmdldCBsYW5ndWFnZSBwYXJlbnQgY2xhc3MgbmFtZSAoaWYgYW55KSBmb3IgYSBtZXRob2QuCgoyMDEyLTEwLTA4OiBpYW50CgkgICAgW0dvXSBHZW5lcmF0aW5nIEdvIGNvZGUgbm93IHJlcXVpcmVzIHVzaW5nIHRoZSAtaW50Z29zaXplIG9wdGlvbiB0bwoJICAgIGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSAnaW50JyB0eXBlIGluIEdvLiAgVGhpcyBpcyBiZWNhdXNlIHRoZQoJICAgIHNpemUgb2YgdGhlIHR5cGUgaXMgY2hhbmdpbmcgZnJvbSBHbyAxLjAgdG8gR28gMS4xIGZvciB4ODZfNjQuIAoKMjAxMi0wOS0xNDogd3NmdWx0b24KCSAgICBBZGQgbmV3IHdhcm5pbmcgaWYgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQmFzZSB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoKSBCYXNlPGludD47CiAgICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlPGludD4ge307CgogICAgICAgICAgICBnaXZlcyB0aGUgZm9sbG93aW5nIHdhcm5pbmcgaW5zdGVhZCBvZiBzaWxlbnRseSBpZ25vcmluZyB0aGUgYmFzZToKCiAgICAgICAgICAgIGNwcF9pbmhlcml0Lmk6NTI6IFdhcm5pbmcgNDAxOiBCYXNlIGNsYXNzICdCYXNlPCBpbnQgPicgaGFzIG5vIG5hbWUgYXMgaXQgaXMgYW4gZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGVkIHdpdGggJyV0ZW1wbGF0ZSgpJy4gSWdub3JlZC4KICAgICAgICAgICAgY3BwX2luaGVyaXQuaTo1MTogV2FybmluZyA0MDE6IFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgd3JpdHRlbiBiZWZvcmUgJ0Jhc2U8IGludCA+JyBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBhbmQgYmUgZGVjbGFyZWQgd2l0aCBhIG5hbWUuCgoKMjAxMi0wOS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMzNTM1MzA0IC0gRGlyZWN0IHVzZSBvZiBhIHdlYWsgZ2xvYmFsIHJlZmVyZW5jZSBpbiBkaXJlY3RvcnMKICAgICAgICAgICAgc29tZXRpbWVzIGNhdXNpbmcgc2VnIGZhdWx0cyBlc3BlY2lhbGx5IG9uIEFuZHJvaWQuCgoyMDEyLTA5LTA2OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMgdG8gYWNjZXB0IE5VTEwgc3RyaW5nLgoKMjAxMi0wOC0yNjogZHJqb2UKCSAgICBbUl0gbWFrZSBFeHRlcm5hbFJlZmVyZW5jZSBzbG90IHJlZiB0byBjb250YWluIHJlZmVyZW5jZQoKMjAxMi0wOC0yNjogZHJqb2UKCSAgICBbUl0gZml4IEV4YW1wbGVzL01ha2VmaWxlIHRvIHVzZSBDIGluICQoQ0MpIHJhdGhlciB0aGFuICQoQ1hYKQoKVmVyc2lvbiAyLjAuOCAoMjAgQXVndXN0IDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFkZCBzaXplX3R5cGUsIHZhbHVlX3R5cGUsIGNvbnN0X3JlZmVyZW5jZSB0byB0aGUgU1RMIGNvbnRhaW5lcnMuCgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgZGlzY2FyZCBhbmQgYWRkIG1ldGhvZHMgdG8gc3RkOjpzZXQgd3JhcHBlcnMgc28gdGhhdCBweWFiYy5pIGNhbiBiZSB1c2VkIGVuc3VyaW5nCiAgICAgICAgICAgIE11dGFibGVTZXQgaXMgYSB2YWxpZCBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzdGQ6OnNldC4gQXMgcmVwb3J0ZWQgYnkgQWxleGV5IFNva29sb3YuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3Igc3RkOjptdWx0aXNldC4KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMzU0MTc0NCAtIE1pc3NpbmcgUHlJbnRfRnJvbVNpemVfdCBjYWxscyBmb3IgUHl0aG9uIDMuCgoyMDEyLTA4LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBEYXZpZCBCYXVtIHRvIGFkZCB0aGUgYXNzdW1lb3ZlcnJpZGUgZmVhdHVyZSBmb3IgSmF2YSBkaXJlY3RvcnMgdG8KICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIGFsbCBvdmVycmlkZGVuIG1ldGhvZHMgY2FuIGJlIGFzc3VtZWQgdG8gYmUgb3ZlcnJpZGRlbi4KCjIwMTItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMzNTMwMDIxIEZpeCB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KCjIwMTItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICMzNTM2MzYwIC0gSW52YWxpZCBjb2RlIHNvbWV0aW1lcyBiZWluZyBnZW5lcmF0ZWQgZm9yIGRpcmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgd2l0aCBtYW55IGFyZ3VtZW50cy4KCjIwMTItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSAjMzU0NTg3NyAtIERvbid0IHVuZGVmaW5lIGJvb2wgaWYgZGVmaW5lZCBieSBDOTkgc3RkYm9vbC5oIC0gcHJvYmxlbSB1c2luZyAKICAgICAgICAgICAgUGVybCA1LjE2IGFuZCBsYXRlci4KCjIwMTItMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBpbmNvcnJlY3Qgd2FybmluZyAoMzE0KSBhYm91dCB0YXJnZXQgbGFuZ3VhZ2Uga2V5d29yZHMgd2hpY2ggd2VyZSB0cmlnZ2VyZWQKICAgICAgICAgICAgYnkgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCB1c2luZyBkaXJlY3RpdmVzLiBGb3IgZXhhbXBsZSAnc3RyaW5nJyBpcyBhIGtleXdvcmQgaW4gQyM6CiAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7IGNsYXNzIHN0cmluZzsgfQogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6c3RyaW5nOwoKMjAxMi0wNy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpc3BsYXkgb2YgcG9pbnRlcnMgaW4gdmFyaW91cyBwbGFjZXMgb24gNjQgYml0IHN5c3RlbXMgLSBvbmx5IDMyIGJpdHMgd2VyZSBiZWluZyBzaG93bi4KCjIwMTItMDctMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZGIgZGVidWdnZXIgZnVuY3Rpb25zICdzd2lncHJpbnQnIGFuZCAnbG9jc3dpZ3ByaW50JyB0byBkaXNwbGF5IHRvIHRoZSBnZGIgb3V0cHV0IHdpbmRvdwogICAgICAgICAgICByYXRoZXIgdGhhbiBzdGRvdXQuIFRoaXMgZml4ZXMgZGlzcGxheSBwcm9ibGVtcyBpbiBnZGJ0dWkgYW5kIHRoZSBlbnN1cmVzIHRoZSBvdXRwdXQKICAgICAgICAgICAgYXBwZWFycyB3aGVyZSBleHBlY3RlZCBpbiBvdGhlciBnZGIgYmFzZWQgZGVidWdnZXJzIHN1Y2ggYXMgRWNsaXBzZSBDRFQuCgoyMDEyLTA3LTIwOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHNlZ2ZhdWx0LW9uLWV4aXQgcHJldmVudGlvbiBoYWNrIG5vdyBwcmVzZXJ2ZXMgZXhpdCBzdGF0dXMsIGFuZCB1c2VzIEM5OSBfRXhpdCgpLgoKMjAxMi0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IERlYmlhbiBidWcgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy82NzIwMzUsIHR5cGVtYXAgY29weSBmYWlsdXJlIC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIAogICAgICAgICAgICBpbiBzd2lnLTIuMC41OgogICAgICAgICAgICAgICVpbmNsdWRlPHN0bC5pPgogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6cGFpcjsKICAgICAgICAgICAgICAldGVtcGxhdGUoU3RyUGFpcikgcGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OwoKMjAxMi0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzaW5nIGRlY2xhcmF0aW9ucyBjb21iaW5lZCB3aXRoIHVzaW5nIGRpcmVjdGl2ZXMgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBzbyB0aGF0CiAgICAgICAgICAgIHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUgZm9yIHRlbXBsYXRlcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGhpbmcyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOwogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAvLyBTVElMTCBCUk9LRU4gdm9pZCB1c2VpdDIoVGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmEoT3V0ZXIyOjpTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJiKDo6T3V0ZXIyOjpTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJjKFNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNlaXQyZChTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldGVtcGxhdGUoVGhpbmcySW50KSBUaGluZzI8aW50PjsKCgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdGVtcGxhdGUgbmFtZXNwYWNlIHByb2JsZW1zIGZvciBzeW1ib2xzIGRlY2xhcmVkIHdpdGggYSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFlZWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTcGFjZTI6OllZWSB7CiAgICAgICAgICAgICAgICAgIFQgeXl5KFQgaCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTEoU3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMihTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMyg6OlNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShZWVlJbnQpIFNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PjsKCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBuYW1lc3BhY2UgcHJvYmxlbXMgZm9yIHN5bWJvbHMgZGVjbGFyZWQgd2l0aCBhIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgWFhYOwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgWVlZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN0cnVjdCBTcGFjZTI6OllZWSB7fTsKICAgICAgICAgICAgICAgIHN0cnVjdCBTcGFjZTE6OlNwYWNlMjo6WFhYIHt9OwoKICAgICAgICAgICAgICAgIHZvaWQgdGVzdFhYWDIoU3BhY2UyOjpYWFggeHgpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkyKFNwYWNlMjo6WVlZIHl5KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoZXJlIHh4IGFuZCB5eSB3ZXJlIG5vdCByZWNvZ25pc2VkIGFzIHRoZSBwcm94eSBjbGFzc2VzIFhYWCBhbmQgWVlZLgoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzaW5nIGRlY2xhcmF0aW9ucyBjb21iaW5lZCB3aXRoIHVzaW5nIGRpcmVjdGl2ZXMgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBzbyB0aGF0CiAgICAgICAgICAgIHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUuIAoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICBjbGFzcyBUaGluZzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7CiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7CiAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgIC8vIE5vbmUgb2YgdGhlIG1ldGhvZHMgYmVsb3cgY29ycmVjdGx5IHVzZWQgdGhlIFRoaW5nMiBwcm94eSBjbGFzcwogICAgICAgICAgICAgIHZvaWQgdXNlaXQyKFRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYShPdXRlcjI6OlNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJiKDo6T3V0ZXIyOjpTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYyhTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgdm9pZCB1c2VpdDJkKFNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgfQoKMjAxMi0wNi0yNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzaW5nIGRlY2xhcmF0aW9ucyBjb21iaW5lZCB3aXRoIHVzaW5nIGRpcmVjdGl2ZXMgc28gdGhhdCB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlLgogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7IC8vIHVzaW5nIGRpcmVjdGl2ZQogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOyAvLyB1c2luZyBkZWNsYXJhdGlvbgogICAgICAgICAgICAgIHZvaWQgdXNlaXQyKFRoaW5nMiB0KSB7fQoKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciB0ZW1wbGF0ZWQgY2xhc3Nlcy4KCjIwMTItMDUtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzUyOTYwMSAtIHNlZyBmYXVsdCB3aGVuIGEgcHJvdGVjdGVkIG1ldGhvZCBoYXMgdGhlICJkaXJlY3RvciIKICAgICAgICAgICAgZmVhdHVyZSBidXQgdGhlIHBhcmVudCBjbGFzcyBkb2VzIG5vdC4gQWxzbyBmaXggc2ltaWxhciBwcm9ibGVtcyB3aXRoCiAgICAgICAgICAgIHRoZSBhbGxwcm90ZWN0ZWQgZmVhdHVyZS4KCjIwMTItMDUtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgd2hlbiBhdHRlbXB0aW5nIHRvIHdhcm4gYWJvdXQgYW4gaWxsZWdhbCBkZXN0cnVjdG9yIC0gIzM1MzAwNTUsIDM1MzAwNzggYW5kICMzNTMwMTE4LgoKVmVyc2lvbiAyLjAuNyAoMjYgTWF5IDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoyMDEyLTA1LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlbWFwIG1vZGlmaWNhdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCB3aXRoICVhcHBseSBmb3Igb3RoZXIgc3RyaW5nCiAgICAgICAgICAgIGNsYXNzZXMuCgoyMDEyLTA1LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXhlcyBmb3IgLWV4dGVybmFsLXJ1bnRpbWUgdG8gd29yayBhZ2Fpbi4KCjIwMTItMDUtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIERpc2FtYmlndWF0ZSBTV0lHX0Zyb21fdW5zaWduZWRfU1NfaW50IGFuZCBTV0lHX0Zyb21fdW5zaWduZWRfU1NfbG9uZy4KCjIwMTItMDUtMTg6IG9sbHkKCSAgICBbUEhQXSBGaXggZ2V0dGVycyBmb3IgdGVtcGxhdGUgbWVtYmVycy4gKFNGIzM0Mjg4MzMsIFNGIzM1MjgwMzUpCgoyMDEyLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBsYW5ndWFnZSdzIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIHJlY29nbmlzZSBkaWZmZXJlbmNlX3R5cGUsIHNpemVfdHlwZSwga2V5X3R5cGUKICAgICAgICAgICAgYW5kIG1hcHBlZF90eXBlLgoKMjAxMi0wNS0xNDoga3d3ZXR0ZSAoc2lnbmVkIG9mZiBieSB4YXZpZXI5OCkKICAgICAgICAgICAgW09jdGF2ZV0gUHJldmVudCBPY3RhdmUgZnJvbSBzZWctZmF1bHRpbmcgYXQgZXhpdCB3aGVuIFNXSUcKICAgICAgICAgICAgbW9kdWxlcyBhcmUgbG9hZGVkLCBkdWUgdG8gYnVncyBpbiBPY3RhdmUncyBjbGVhbnVwIGNvZGU6CiAgICAgICAgICAgICogV3JhcHBpbmcgZnVuY3Rpb25zIG5vdyBkZWNsYXJlZCB3aXRoIE9jdGF2ZSBERUZVTl9ETEQgbWFjcm8sCiAgICAgICAgICAgICAgYW5kIGxvYWRlZCB0aHJvdWdoIE9jdGF2ZSdzIGR5bmFtaWMgbW9kdWxlIGxvYWRlcgogICAgICAgICAgICAqIEdsb2JhbCB2YXJpYWJsZXMgb2Ygc3dpZ3JlZiB0eXBlIGFyZSBub3cgYXNzaWduZWQgYSBuZXcoKQogICAgICAgICAgICAgIGNvcHkgb2YgdGhlIHN3aWdyZWYgY2xhc3MsIHRvIHByZXZlbnQgZG91YmxlLWZyZWUgZXJyb3JzCiAgICAgICAgICAgICogU1dJRyBtb2R1bGUgYXQtZXhpdCBjbGVhbnVwIGZ1bmN0aW9uIG5vdyBjcmVhdGVkIGluIE9jdGF2ZQogICAgICAgICAgICAgIHRocm91Z2ggZXZhbCgpLCBzbyBub3QgZGVwZW5kZW50IG9uIGxvYWRlZCAub2N0IGxpYnJhcnkKICAgICAgICAgICAgKiBGb3IgT2N0YXZlIHZlcnNpb25zIDMuMS4qIHRvIDMuMy4qLCByZWdpc3RlciBDLWxldmVsIGF0LWV4aXQKICAgICAgICAgICAgICBmdW5jdGlvbiB3aGljaCB0ZXJtaW5hdGVzIE9jdGF2ZSBpbW1lZGlhdGVseSAod2l0aCBjb3JyZWN0CiAgICAgICAgICAgICAgc3RhdHVzIGNvZGUpIHdpdGhvdXQgcGVyZm9ybWluZyBtZW1vcnkgY2xlYW51cC4gVGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgIGNhbiBiZSBjb250cm9sbGVkIHdpdGggbWFjcm9zIGluIExpYi9vY3RhdmUvb2N0cnVudGltZS5zd2cKCiAgICAgICAgICAgIFtPY3RhdmVdIE5ldyBzeW50YXggZm9yIGRldGVybWluZyB3aGV0aGVyIFNXSUcgbW9kdWxlIHNob3VsZCBiZQogICAgICAgICAgICBsb2FkZWQgZ2xvYmFsbHkgb3Igbm9uLWdsb2JhbGx5LiBUbyBsb2FkIG1vZHVsZSAiZXhhbXBsZSIgZ2xvYmFsbHksCiAgICAgICAgICAgIHR5cGUgdGhlIG1vZHVsZSBuYW1lCiAgICAgICAgICAgICQgZXhhbXBsZTsKICAgICAgICAgICAgYXMgYmVmb3JlOyB0byBsb2FkIG1vZHVsZSBub24tZ2xvYmFsbHksIGFzc2lnbiBpdCB0byBhIHZhcmlhYmxlOgogICAgICAgICAgICAkIGV4YW1wbGUgPSBleGFtcGxlOwogICAgICAgICAgICBvcgogICAgICAgICAgICAkIGV4ID0gZXhhbXBsZTsKICAgICAgICAgICAgZm9yIGEgc2hvcnRlciAobG9jYWwpIG1vZHVsZSBuYW1lLiAtZ2xvYmFsLy1ub2dsb2JhbCBjb21tYW5kLWxpbmUKICAgICAgICAgICAgb3B0aW9ucyBhbmQgbW9kdWxlIGNvbW1hbmQgbGluZSBhcmUgZGVwcmVjYXRlZC4gQWRkZWQgdXNhZ2UgaW5mbwogICAgICAgICAgICB0byBtb2R1bGUsIHNvIHR5cGluZwogICAgICAgICAgICAkIGhlbHAgZXhhbXBsZQogICAgICAgICAgICBvciBpbmNvcnJlY3QgdXNhZ2Ugc2hvdWxkIGRpc3BsYXkgcHJvcGVyIHVzYWdlLCB3aXRoIGV4YW1wbGVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMi0wNS0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgYSBjYWxsYmFjay4gIFBhdGNoIGZyb20KCSAgICBTRiBidWcgIzM1MTA4MDYuCgoyMDEyLTA1LTEyOiBvbGx5CgkgICAgW1BIUF0gQXZvaWQgdXNpbmcgemVuZF9lcnJvcl9ub3JldHVybigpIGFzIGl0IGRvZXNuJ3Qgd29yayB3aXRoIGFsbAoJICAgIGJ1aWxkcyBvZiBQSFAgKFNGIGJ1ZyAjMzE2NjQyMykuICBJbnN0ZWFkIHdlIG5vdyB3cmFwIGl0IGluIGEKCSAgICBTV0lHX0ZBSUwoKSBmdW5jdGlvbiB3aGljaCB3ZSBhbm5vdGF0ZSBhcyAibm9yZXR1cm4iIGZvciBHQ0MgdG8KCSAgICBhdm9pZHMgd2FybmluZ3MuICBUaGlzIGFsc28gcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29tcGlsZWQKCSAgICB3cmFwcGVyIChlLmcuIHRoZSBzdHJpcHBlZCBzaXplIGlzIHJlZHVjZWQgYnkgNiUgZm9yIFhhcGlhbidzIFBIUAoJICAgIGJpbmRpbmdzKS4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjg1NSBGaXggdW5pbnRlbmRlZCB1bmluaXRpYWxpc2VkIG1lbW9yeSBhY2Nlc3MgaW4gT1VUUFVUIHR5cGVtYXBzLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyNjc0IEZpeCBwb3NzaWJsZSB1bmluaXRpYWxpc2VkIG1lbW9yeSBhY2Nlc3MgaW4gY2hhciAqKlNUUklOR19PVVQKICAgICAgICAgICAgdHlwZW1hcC4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjYxMSBGaXggdW5pbml0aWFsaXNlZCBzaXplIHJlZ3Jlc3Npb24gaW4gY2hhciAqKlNUUklOR19BUlJBWQogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjYuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBTRiBidWcgIzM1MjUwNTAgLSBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjUgd2hlcmVieSBkZWZpbmluZyBvbmUgdHlwZW1hcAogICAgICAgICAgICBtZXRob2Qgc3VjaCBhcyBhbiAnb3V0JyB0eXBlbWFwIG1heSBoaWRlIGFub3RoZXIgdHlwZW1hcCBtZXRob2Qgc3VjaCBhcyBhbiAnaW4nIHR5cGVtYXAgLQogICAgICAgICAgICBvbmx5IG9jY3VycyB3aGVuIHRoZSB0eXBlIGlzIGEgdGVtcGxhdGUgdHlwZSB3aGVyZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUKICAgICAgICAgICAgdmlhIGEgdHlwZWRlZi4KCjIwMTItMDUtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggdGhlIGNvbnN0YW50IHR5cGVtYXBzIGZvciBTV0lHVFlQRSwgZXRjIC0gcHJldmlvdXNseQoJICAgIHRoZXNlIHVzZWQgdGhlIHdyb25nIG5hbWUgZm9yIHJlbmFtZWQgY29uc3RhbnRzLiAgQWRkCgkgICAgYXV0b2RvY19ydW5tZS5waHAgdG8gdGhlIHRlc3RzdWl0ZSBhcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhpcy4KCjIwMTItMDUtMDI6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBSZW1vdmUgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGZvciBnY2NnbyA0LjYuICBVc2luZwoJICAgIFNXSUcgd2l0aCBnY2NnbyB3aWxsIG5vdyByZXF1aXJlIGdjY2dvIDQuNy4gIFVzaW5nIFNXSUcKCSAgICB3aXRoIHRoZSBtb3JlIGNvbW1vbmx5IHVzZWQgZ2MgY29tcGlsZXIgaXMgdW5hZmZlY3RlZC4KCjIwMTItMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgQyBmb3J3YXJkIGVudW0gZGVjbGFyYXRpb25zIGluIHNvbWUgbGFuZ3VhZ2VzLgoKVmVyc2lvbiAyLjAuNiAoMzAgQXByaWwgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDQtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIGluIFNXSUdUWVBFICoqT1VUUFVUIHR5cGVtYXBzIGFzIHJlcG9ydGVkIGJ5IEppbSBBbmRlcnNvbi4KCjIwMTItMDQtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBjb21waWxhdGlvbiBlcnJvcnMgd2hlbiB3cmFwcGluZyBTVEwgY29udGFpbmVycyBvbiBNYWMgT1MgWCBhbmQgcG9zc2libHkgb3RoZXIgc3lzdGVtcy4KCjIwMTItMDQtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAzNTIxODExIGZyb20gTGVvIERhdmlzIC0gY2hhciAqKlNUUklOR19BUlJBWSB0eXBlbWFwcyBmaXhlZCB0byBoYW5kbGUKICAgICAgICAgICAgbnVsbCBwb2ludGVycy4KClZlcnNpb24gMi4wLjUgKDE5IEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSBwYXRjaCAjMzUxNzQzNSBmcm9tIE1pbGVzIEJhZGVyIC0gcHJlZmVyIHRvIHVzZSBMdWFfcHVzaGdsb2JhbHRhYmxlCgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzM1MTc3NjkgZnJvbSBSb2JpbiBTdG9ja2VyIHRvIGZpeCBjb21waWxlIGVycm9yIG9uIE1hY1J1YnkgdXNpbmcgUlNUUklOR19QVFIuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUxMTAwOSBmcm9tIExlaWYgTWlkZGVsc2NodWx0ZSBmb3Igc2xpZ2h0bHkgb3B0aW1pc2VkIGNoYXIgKiB2YXJpYWJsZSB3cmFwcGVycy4KCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5ICMzMjE5Njc2IGZyb20gU2hhbmUgTGllc2VnYW5nIHdoaWNoIGFkZHM6CiAgICAgICAgICAgIC0gc3VwcG9ydCBmb3IgJWZhY3RvcnkKICAgICAgICAgICAgLSBhIF9fdG9zdHJpbmcgbWV0aG9kCiAgICAgICAgICAgIC0gYSBfX2Rpc293biBtZXRob2QKCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEFwcGx5ICMzNTEzNTY5IHdoaWNoIGFkZHMgYSBjYXRjaGxpc3QgdG8gdGhlIHhtbCBvdXRwdXQuCgoyMDEyLTA0LTA1OiBvbGx5CgkgICAgW0x1YV0gQWRkIHN1cHBvcnQgZm9yIEx1YSA1LjIgKHBhdGNoIFNGIzM1MTQ1OTMgZnJvbSBNaWxlcyBCYWRlcikKCjIwMTItMDMtMjY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjU5OTMgZnJvbSBqZ2lsbGlzOiBhZGQgZXh0cmEgbG9naWMgdG8gdGhlIG9jdGF2ZV9zd2lnX3R5cGU6OmRpbXModm9pZCkgbWV0aG9kOiBpdCBjaGVja3MgaWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBfX2RpbXNfXyBtZXRob2QgYW5kIHVzZXMgdGhpcyBpbiBzdGVhZCBvZiByZXR1cm5pbmcgKDEsMSkKCSAgICBbb2N0YXZlXSBBcHBseSBwYXRjaCAjMzQyNDgzMyBmcm9tIGpnaWxsaXM6IG1ha2UgaXNfb2JqZWN0IHJldHVybiB0cnVlIGZvciBzd2lnIHR5cGVzCgoyMDEyLTAzLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbRF0gQXBwbHkgIzM1MDI0MzEgdG8gZml4IGR1cGxpY2F0ZSBzeW1ib2xzIGluIG11bHRpcGxlIG1vZHVsZXMuCgoyMDEyLTAzLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0OTQ3OTEgLSAlJGlzZ2xvYmFsIGZvciAlcmVuYW1lIG1hdGNoaW5nLgoKMjAxMi0wMy0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDg3NzA2IGFuZCAjMzM5MTkwNiAtIG1pc3Npbmcgc3RkZGVmLmggaW5jbHVkZSBmb3IgcHRyZGlmZl90IHdoZW4gdXNpbmcgJWltcG9ydAogICAgICAgICAgICBmb3IgU1RMIGNvbnRhaW5lcnMgYW5kIGNvbXBpbGluZyB3aXRoIGcrKy00LjYuIEFuIGluY2x1ZGUgb2Ygc3RkZGVmLmggaXMgbm93IG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gU1dJRyBnZW5lcmF0ZXMgU1RMIGhlbHBlciB0ZW1wbGF0ZXMgd2hpY2ggcmVxdWlyZSBwdHJkaWZmX3QuIElmIHlvdSAKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IHJlbHlpbmcgb24gIiNpbmNsdWRlIDxzdGRkZWYuaD4iIGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgd2hlbiB1c2luZyBhCiAgICAgICAgICAgICVpbmNsdWRlIG9mIGFuIFNUTCBoZWFkZXIsIHlvdSBtYXkgbm93IG5lZWQgdG8gYWRkIHRoaXMgaW4gbWFudWFsbHkuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzM5MjI2NCBmcm9tIFNlYmFzdGllbiBCaW5lIHRvIHBhcnNlICh1bnNpZ25lZCkgbG9uZyBsb25nIHR5cGVzIGluIGVudW0gdmFsdWUgYXNzaWdubWVudC4KCjIwMTItMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNTA1NTMwIGZyb20gS2FybCBXZXR0ZSB0byBhbGxvdyBjdXN0b20gYWxsb2NhdG9ycyBpbiBTVEwgc3RyaW5nIGNsYXNzZXMgZm9yIHRoZSBVVEwgbGFuZ3VhZ2VzLgoKMjAxMi0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM0NjgzNjIgZnJvbSBLYXJsIFdldHRlIHRvIGZpeCAlaW5jbHVkZSBpbnNpZGUgJWRlZmluZS4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jdGF2ZSwgUl0gRml4ICMzNDc1NDkyIC0gaXRlcmF0aW5nIHRocm91Z2ggc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb2YgZW51bWVyYXRpb25zLgoKMjAxMi0wMi0yNzogeGF2aWVyOTggKHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlKQoJICAgIFtPY3RhdmVdIFVzZSAtZ2xvYmFscyAuIHRvIGxvYWQgZ2xvYmFsIHZhcmlhYmxlcyBpbiBtb2R1bGUgbmFtZXNwYWNlCgkgICAgW09jdGF2ZV0gQ29tbWVudCBkZWNsYXJhdGlvbiBvZiB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHN3aWdfcmVnaXN0ZXJfZGlyZWN0b3IKCSAgICBbT2N0YXZlXSBGaXggT0NUQVZFX1BBVEggaW4gb2N0YXZlIE1ha2VmaWxlcwoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgLSBmaXggbGlfc3RkX2NvbnRhaW5lcnNfaW50IHRlc3QKCSAgICBbT2N0YXZlXSBGaXggaW1wb3J0cyB0ZXN0CgoyMDEyLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTWFrZSBnZW5lcmF0ZWQgc3VwcG9ydCBmdW5jdGlvbnMgaW4gYXJyYXlzX2phdmEuaSBzdGF0aWMgc28gdGhhdCBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBmcm9tIG11bHRpcGxlIGluc3RhbmNlcyBvZiBTV0lHIGNhbiBiZSBjb21waWxlZCBhbmQgbGlua2VkIHRvZ2V0aGVyIC0gcHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBFdmFuIEtyYXVzZS4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjcmFzaCB3aXRoIGJhZCByZWdleCAtIGJ1ZyAjMzQ3NDI1MC4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBQeXRob24gc3RlcHBlZCBzbGljaW5nIHN1cHBvcnQgdG8gdGhlIFNUTCB3cmFwcGVycyAoc3RkOjp2ZWN0b3IsIHN0ZDo6bGlzdCkuCiAgICAgICAgICAgIEFzc2lnbmluZyB0byBhIHNsaWNlLCByZWFkaW5nIGEgc2xpY2UgYW5kIGRlbGV0aW5nIGEgc2xpY2Ugd2l0aCBzdGVwcyBub3cgd29yay4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgdmkgPSB2ZWN0b3JfaShyYW5nZSgxMCkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICB2aVsxOjQ6Ml0gPSBbMTExLCAzMzNdCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICBkZWwgdmlbMzoxMDozXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aVs6Oi0xXSkKCiAgICAgICAgICAgIGdpdmVzIChzYW1lIGJlaGF2aW91ciBhcyBuYXRpdmUgUHl0aG9uIHNlcXVlbmNlcyBzdWNoIGFzIGxpc3QpOgoKICAgICAgICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgICAgICAgICBbMCwgMTExLCAyLCAzMzMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgNCwgNSwgNywgOF0KICAgICAgICAgICAgICBbOCwgNywgNSwgNCwgMiwgMTExLCAwXQoKMjAxMi0wMS0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIENvcnJlY3RseSBhbm5vdGF0ZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIEMgbGlua2FnZS4KICAgICAgICAgICAgW0RdIEV4Y2VwdGlvbiBhbmQgRXJyb3IgaGF2ZSBiZWNvbWUgYmxlc3NlZCBuYW1lczsgcmVtb3ZlZCBkX2V4Y2VwdGlvbl9uYW1lIHRlc3QgY2FzZS4KCjIwMTItMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIGluZGV4aW5nIGJ1Z3MgaW4gUHl0aG9uIFNUTCB3cmFwcGVycyB3aGVuIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSwgZWc6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgaXY9dmVjdG9yX2koWzAsMSwyLDMsNCw1XSkKICAgICAgICAgICAgICBpdlstNzpdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNV0gaW5zdGVhZCBvZiBbNV0uCgogICAgICAgICAgICAgIHZ2Wzc6OV0gPSBbMjIsMzNdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNSwgMjIsIDMzXSBpbnN0ZWFkIG9mICJpbmRleCBvdXQgcmFuZ2UiIGVycm9yLgoKICAgICAgICAgICAgQWxzbyBmaXggc29tZSBzZWdmYXVsdHMgd2hlbiByZXBsYWNpbmcgcmFuZ2VzLCBlZyB3aGVuIGlsIGlzIGEgc3RkOjpsaXN0IHdyYXBwZXI6CgogICAgICAgICAgICAgIGlsWzA6Ml0gPSBbMTFdCgoyMDEyLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9uIHdpdGhpbiBhIGNsYXNzIHdoZW4gdXNlZCBhcyBhIGJhc2UuCgoyMDEyLTAxLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciAlbnNwYWNlIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxMi0wMS0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMzNDUyNTYwIGZyb20gQnJhbnQgS3lzZXIgLSBhZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTEtMTItMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSAnZGlyZWN0b3JpbicgdHlwZW1hcCBub3cgYWNjZXB0cyAkMSwgJDIgZXRjIGV4cGFuc2lvbnMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdXNlIHdvcmthcm91bmRzIC0KICAgICAgICAgICAgJDFfbmFtZSwgJDJfbmFtZSBldGMuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIGRpcmVjdG9yIHR5cGVtYXBzLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBHbywgSmF2YSwgRF0gQWRkIHN1cHBvcnQgZm9yIHRoZSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXAuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWwsIE9jdGF2ZSwgUEhQLCBQeXRob24sIFJ1YnldIENvcnJlY3Qgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGJyZWFrIGFueSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXBzIHlvdSBtYXkgaGF2ZSB3cml0dGVuLiBQbGVhc2UgY2hhbmdlOgogICAgICAgICAgICAgICRyZXN1bHQgdG8gJDEKICAgICAgICAgICAgICAkaW5wdXQgdG8gJHJlc3VsdAoKICAgICAgICAgICAgQWxzbyBmaXggdGhlIG5hbWVkICdkaXJlY3RvcmFyZ291dCcgRElSRUNUT1JPVVQgdHlwZW1hcHMgZm9yIHRoZXNlIGxhbmd1YWdlcyB3aGljaCBkaWRuJ3QKICAgICAgICAgICAgcHJldmlvdXNseSBjb21waWxlIGFuZCBhZGQgaW4gJDEsICQyIGV0YyBleHBhbnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTEyLTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNXSUdfZXJyb3IoKSBub3cgZ2V0cyBkZWNvcmF0ZWQgd2l0aCBwZXJsIHNvdXJjZSBmaWxlL2xpbmUgbnVtYmVyLgogICAgICAgICAgICBbcGVybDVdIGVycm9yIGhhbmRsaW5nIG5vdyBjb25mb3JtcyB0byBwdWJsaWMgWFMgYXBpIChmaXhlcyBwZXJsIHY1LjE0IGlzc3VlKS4KCjIwMTEtMTItMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtBbmRyb2lkL0phdmFdIEZpeCBkaXJlY3RvcnMgdG8gY29tcGlsZSBvbiBBbmRyb2lkLgoKICAgICAgICAgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgZm9yIEFuZHJvaWQuCgoyMDExLTEyLTA4OiB2YWR6CgkgICAgQnVnIGZpeDogSGFuZGxlIG1ldGhvZHMgcmVuYW1lZCBvciBpZ25vcmVkIGluIHRoZSBiYXNlIGNsYXNzIGNvcnJlY3RseSBpbiB0aGUgZGVyaXZlZCBjbGFzc2VzCgkgICAgKHRoZXkgY291bGQgYmUgc29tZXRpbWVzIG15c3RlcmlvdXNseSBub3QgcmVuYW1lZCBvciBpZ25vcmVkIHRoZXJlIGJlZm9yZSkuCgoyMDExLTEyLTAzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4IGV4Y2VwdGlvbiBnbHVlIGNvZGUgZm9yIG5ld2VyIERNRCAyIHZlcnNpb25zLgogICAgICAgICAgICBbRF0gRG8gbm90IGRlZmF1bHQgdG8gMzIgYml0IGdsdWUgY29kZSBmb3IgRE1EIGFueW1vcmUuCiAgICAgICAgICAgIFtEXSBVc2Ugc3RkYy5jb25maWcuY19sb25nL2NfdWxvbmcgdG8gcmVwcmVzZW50IEMgbG9uZyB0eXBlcy4KCjIwMTEtMTItMDE6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIGJ1ZyAzNDQ3NDI2OiBtZW1vcnkgbGVhayBpbiB2ZWN0b3IuX19nZXRpdGVtX18uCgoyMDExLTExLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUmVtb3ZlIEMrKyBjb21tZW50cyBmcm9tIGdlbmVyYXRlZCBDIGNvZGUuCgoyMDExLTExLTI3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHNvbWUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGgKCSAgICBjZXJ0YWluIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzY1MDI0NikuCgoyMDExLTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0MzM1NDEgJXR5cGVtYXAoaW4sIG51bWlucHV0cz0wKSB3aXRoIDEwKyBhcmd1bWVudHMuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BlcmxdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlcnMgd2l0aCBjZXJ0YWluCgkgICAgR0NDIHdhcm5pbmcgb3B0aW9ucyAoRGViaWFuIGJ1ZyAjNDM2NzExKS4KCjIwMTEtMTEtMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUga2V5d29yZCBsaXN0IHRvIGluY2x1ZGUga2V5d29yZHMgYWRkZWQgaW4gUEhQIHJlbGVhc2VzIHVwIHRvIDUuMy4KCjIwMTEtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHJvdmlkZSBhbiBlYXN5IHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciB0aGUgcHJveHkgY2xhc3MgcG9pbnRlcgogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGdldENQdHIoKSBtZXRob2QuIFRoZSB2aXNpYmlsaXR5IGlzICdpbnRlcm5hbCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBhc3NlbWJsaWVzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgYXNzZW1ibHkuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19DU0JPRFlfUFJPWFkocHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgW0phdmFdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAncHJvdGVjdGVkJyBieSBkZWZhdWx0IGFuZCBpZiBtdWx0aXBsZQogICAgICAgICAgICBTV0lHIG1vZHVsZXMgYXJlIGJlaW5nIHVzZWQgYW5kIGNvbXBpbGVkIGludG8gZGlmZmVyZW50IHBhY2thZ2VzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZS4KICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0aWVzIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgZm9yIEphdmEgaGFzIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJvdGVjdGVkIGZvciB0aGUgcHJveHkgY2xhc3Nlcy4gVXNlIHRoZQogICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZIG1hY3JvIGFib3ZlIHRvIHJlc3RvcmUgdG8gdGhlIHByZXZpb3VzIHZpc2liaWxpdGllcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTEtMTEtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEJ1ZyAzNDQwMDQ0OiAjaWZkZWYgb3V0IFNXSUdfUHl0aG9uX05vbkR5bmFtaWNTZXRBdHRyIGlmIC1idWlsdGluCgkgICAgaXNuJ3QgYmVpbmcgdXNlZCwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmluYXJ5IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4KCSAgICBweXRob24gaW5zdGFsbGF0aW9ucy4KCjIwMTEtMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyBmaXg6IFJlbW92ZSByb290IGRpcmVjdG9yeSBmcm9tIGRpcmVjdG9yeSBzZWFyY2ggbGlzdCBpbiBXaW5kb3dzLgoKMjAxMS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNDIxODc2IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggIzM0MTY4MTggLSBzYW1lIGNsYXNzIG5hbWUgaW4gCiAgICAgICAgICAgIGRpZmZlcmVudCBuYW1lc3BhY2VzIGNvbmZ1c2lvbiB3aGVuIHVzaW5nIG11bHRpcGxlIG1vZHVsZXMuCgoyMDExLTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGNyZS1idWlsZC5zaCB0byB3b3JrIHdpdGggbm9uLWNvbXByZXNzZWQgdGFyYmFsbHMgLSBwcm9ibGVtIHJlcG9ydGVkIGJ5IEFkcmlhbiBCbGFrZWx5LgoKMjAxMS0xMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRXhwYW5kIHNwZWNpYWwgdmFyaWFibGVzIGluIHR5cGVtYXAgd2FybmluZ3MsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbiwgd2FybmluZz0iMTAwMDpUZXN0IHdhcm5pbmcgZm9yICdpbicgdHlwZW1hcCBmb3IgJDFfdHlwZSAkMV9uYW1lIikgaW50ICIuLi4iCgoyMDExLTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZWQgb3V0cHV0IHR5cGVtYXBzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIHN5bWJvbCB1c2VzIGEgcXVhbGlmaWVyIGFuZCBjb250YWlucwogICAgICAgICAgICBhIG51bWJlciwgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgZG91YmxlIEFCQzo6bTEgIi4uLiIKCjIwMTEtMTAtMjQ6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU0YgYnVnICMzNDIzMTE5IC0gb3ZlcmxvYWQgZGlzcGF0Y2ggc3RhY2sgY29ycnVwdGlvbiBmaXguICBCZXR0ZXIsIGJ1dCBtb3JlIHJlc2VhcmNoCiAgICAgICAgICAgIGlzIG5lZWRlZCBvbiBhIHN0YWJsZSBwYXRoIGZvciB0YWlsIGNhbGxzIGluIFhTLgoKICAgICAgICAgICAgQWxzbywgZml4IGZvciBsYXJnZSBsb25nIGxvbmdzIGluIDMyIGJpdCBwZXJsLgoKMjAxMS0xMC0xMzogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBBbGxvdyBPY3RhdmUgbW9kdWxlcyB0byBiZSByZS1sb2FkZWQgYWZ0ZXIgYSAiY2xlYXIgYWxsIi4KCjIwMTEtMDktMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMSByZXBvcnRlZCBieSBUZWVtdSBJa29ub25lIGxlYWRpbmcgdG8gdW5jb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyB0eXBlZGVmIGFuZCBmdW5jdGlvbiBwb2ludGVyIHJlZmVyZW5jZXMsIGZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgRk4oY29uc3QgaW50ICZhLCBpbnQgYik7CiAgICAgICAgICAgICAgdm9pZCAqdHlwZWRlZl9jYWxsMShGTiAqJiBwcmVjYWxsYmFjaywgRk4gKiBwb3N0Y2FsbGJhY2spOwoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzM0MDgwMTIgZnJvbSBSYW1hbiBHb3BhbGFuIC0gYWRkIHN1cHBvcnQgZm9yIGVtYmVkZGVkIEx1YSAoZUx1YSkKICAgICAgICAgICAgaW5jbHVkaW5nIG9wdGlvbnMgZm9yIHRhcmdldGluZyBMdWEgVGlueSBSQU0gKExUUikuCgoyMDExLTA5LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBib29zdF9pbnRydXNpdmVfcHRyLmkgbGlicmFyeSBjb250cmlidXRpb24gZnJvbSBwYXRjaCAjMzQwMTU3MS4KCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB3YXJuaW5ncyBmb3IgYmFkbHkgbmFtZWQgZGVzdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgS1N0cnVjdCB7CiAgICAgICAgICAgICAgICB+Tk9UX0tTdHJ1Y3QoKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBjcHBfZXh0ZW5kX2Rlc3RydWN0b3JzLmk6OTI6IFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSB+Tk9UX0tTdHJ1Y3QuIElnbm9yZWQuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlcy4gVGhlIGRlc3RydWN0b3IgaW4gJWV4dGVuZCB3YXMgbm90IGFsd2F5cyB3cmFwcGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4dGVuZCBGb29UIHsKICAgICAgICAgICAgICAgIH5Gb29UKCkgeyBkZWxldGUgJHNlbGY7IH0gLy8gd2FzIG5vdCB3cmFwcGVkIGFzIGV4cGVjdGVkCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb29UIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29UaSkgRm9vVDxpbnQ+OwoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNwZWNpYWwgdmFyaWFibGVzIHN1Y2ggYXMgIiRkZWNsIiBhbmQgIiRmdWxsZGVjbCIgaW4gZGVzdHJ1Y3RvcnMgdG8gaW5jbHVkZSB0aGUgfiBjaGFyYWN0ZXIuCgoyMDExLTA5LTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMTQ4MTk1OCAtIEltcHJvdmUgcmFuZ2UgY2hlY2tpbmcgZm9yIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIEVuaGFuY2UgbGlfdHlwZW1hcHNfcnVubWUucGwKCjIwMTEtMDktMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZXh0ZW5kIG9uIHR5cGVkZWYgY2xhc3NlcyBpbiBhIG5hbWVzcGFjZSB1c2luZyB0aGUgdHlwZWRlZiBuYW1lLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAlZXh0ZW5kIENTdHJ1Y3QgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0NTdHJ1Y3QgeyAuLi4gfSBDU3RydWN0OwogICAgICAgICAgICB9CgoyMDExLTA4LTMxOiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlOiBpbXByb3ZlbWVudHMgdG8gbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3I7CgkgICAgYWRkZWQgZXhhbXBsZSBvZiBmcmllbmQgb3BlcmF0b3IgdG8gb3BlcmF0b3IgZXhhbXBsZTsgZml4ZWQgb2N0YXZlIHBhbmljL2NyYXNoIGluIDMuMC41OwoJICAgIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCgoyMDExLTA4LTMwOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQwMDQ4NiwgZml4IGVycm9yIHNpZ25hbGxpbmcgZm9yIGJ1aWx0LWluIGNvbnN0cnVjdG9ycy4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGZpbGUvbGluZSBudW1iZXIgZGlzcGxheSBmb3IgImdvdHlwZSIgd2hlbiB1c2luZyB0eXBlbWFwIGRlYnVnZ2luZyBvcHRpb25zCiAgICAgICAgICAgIC10bXNlYXJjaCBhbmQgLXRtdXNlZC4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRF0gRml4ICVjYWxsYmFjayB3aGljaCB3YXMgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZS4KCjIwMTEtMDgtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjb25zdHJ1Y3RvcnMgaW4gbmFtZWQgdHlwZWRlZiBjbGFzcyBkZWNsYXJhdGlvbnMgYXMgcmVwb3J0ZWQgYnkgR3JlZ29yeSBCcm9ubmVyOgoKICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgQSgpe30gLy8gQ29uc3RydWN0b3Igd2hpY2ggd2FzIG5vdCBhY2NlcHRlZCBieSBTV0lHCiAgICAgICAgICAgICAgQigpe30gLy8gTk9UIGEgY29uc3RydWN0b3IgLS1pbGxlZ2FsLCBidXQgd2FzIGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgfSBCOwoKICAgICAgICAgICAgRm9yIEMgY29kZSwgdGhlIGZpeCBub3cgcmVzdWx0cyBpbiB0aGUgdXNlIG9mICdzdHJ1Y3QgQSAqJyBpbnN0ZWFkIG9mIGp1c3QgJ0IgKicgaW4KICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIHdoZW4gd3JhcHBpbmcgbWVtYmVycyBpbiBBLCBidXQgdWx0aW1hdGVseSB0aGlzIGRvZXMgbm90IG1hdHRlciwgYXMKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgdGhpbmcuCgoyMDExLTA4LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJW5ld29iamVjdCB3aGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAlZmVhdHVyZSgicmVmIikgYXMgcmVwb3J0ZWQgYnkgSmFuIEJlY2tlci4gVGhlCiAgICAgICAgICAgIGNvZGUgZnJvbSB0aGUgInJlZiIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgZm9yIHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgJW5ld29iamVjdC4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBmb3IgInJlZiIgYW5kICJ1bnJlZiIgbW92ZWQgZnJvbSBQeXRob24gdG8gdGhlIEMrKyBjaGFwdGVyLgoKMjAxMS0wOC0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgbWVtb3J5IGxlYWsgd2l0aCAtLWJ1aWx0aW4gb3B0aW9uIChidWcgMzM4NTA4OSkuCgoyMDExLTA4LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTRiBwYXRjaCAjMzM5NDMzOSBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiAtIG5ldyBvcHRpb24gLW5vbW9kdWxlZ2xvYmFsIHRvIGRpc2FibGUgaW5zdGFsbGluZyAKICAgICAgICAgICAgdGhlIG1vZHVsZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBSZXF1aXJlIGNhbGwgYWxzbyByZXR1cm5zIHRoZSBtb2R1bGUgdGFibGUgaW5zdGVhZCAKICAgICAgICAgICAgb2YgYSBzdHJpbmcuCgoyMDExLTA4LTA5OiB4YXZpZXI5OAogICAgICAgICAgICBGaXggYnVnIDMzODczOTQ7IE9jdGF2ZSBwYXRjaGVzIGZvciAzLjQuMCBjb21wYXRpYmlsaXR5LCBldGMuIChmcm9tIEthcmwgV2V0dGUpCgoyMDExLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gJHN5bW5hbWUgZXhwYW5zaW9uIGZvciBkaXJlY3RvciBtZXRob2RzLgoKMjAxMS0wNy0yOTogb2xseQoJICAgIFtQSFBdIERvbid0IGdlbmVyYXRlICJyZXR1cm4gJHI7IiBpbiBjYXNlcyB3aGVyZSAkciBoYXNuJ3QgYmVlbiBzZXQuCgkgICAgVGhpcyB3YXMgYmFzaWNhbGx5IGhhcm1sZXNzLCBleGNlcHQgaXQgZ2VuZXJhdGVkIGEgUEhQIEVfTk9USUNFIGlmCgkgICAgdGhlIGNhbGxpbmcgY29kZSBoYWQgZW5hYmxlZCB0aGVtLgoKMjAxMS0wNy0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNjb3Bpbmcgb2YgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgbmVzdGVkIHdpdGhpbiBhIGNsYXNzIChmb3IgQysrKS4gUHJldmlvdXNseSB0aGUgc3ltYm9sCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBwdXQgaW50byB0aGUgb3V0ZXIgbmFtZXNwYWNlLCBlZwoKICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPiBzdHJ1Y3QgbWFwIHsKICAgICAgICAgICAgICAgIGNsYXNzIGl0ZXJhdG9yOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZXJhdG9yIHdhcyBzY29wZWQgYXMgc3RkOjppdGVyYXRvciwgYnV0IG5vdyBpdCBpcyBjb3JyZWN0bHkgc3RkOjptYXA8S2V5LCBUPjo6aXRlcmF0b3I7CgogICAgICAgICAgICBBbHNvIGZpeGVkIGlzICV0ZW1wbGF0ZSBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyB0aGF0IGFyZSBhIHR5cGVkZWYgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbnMKICAgICAgICAgICAgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBlZzoKCiAgICAgICAgICAgIG5hbWVzcGFjZSBTdGQgewogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQyA9IGludD4gc3RydWN0IE1hcCB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEtleSBrZXlfdHlwZTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBtYXBwZWRfdHlwZTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERPVUJMRTsKICAgICAgICAgICAgJXRlbXBsYXRlKE1NKSBTdGQ6Ok1hcDxpbnQsIERPVUJMRT47CgogICAgICAgICAgICBBbGwgc3ltYm9scyB3aXRoaW4gTWFwIHdpbGwgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LCBlZyBrZXlfdHlwZSBhbmQgbWFwcGVkX3R5cGUgbm8gbWF0dGVyIGlmIHRoZQogICAgICAgICAgICB3cmFwcGVkIGNvZGUgdXNlcyBTdGQ6Ok1hcDxpbnQsIGRvdWJsZT4gb3Igc3RkOjpNYXA8aW50LCBET1VCTEU+IG9yIFN0ZDo6TWFwPGludCwgZG91YmxlLCBpbnQ+CgogICAgICAgICAgICBBbHNvIGZpeGVzIGJ1ZyAjMzM3ODE0NSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAyLjAuNCAtICV0ZW1wbGF0ZSB1c2luZyB0cmFpdHMuCgoyMDExLTA3LTIwICBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXggY2xvc3VyZSBmb3IgdHBfY2FsbCBzbG90LgoKMjAxMS0wNy0xNjogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBGaXggZGlyZWN0b3IgdHlwZW1hcCB1c2luZyBQeU9iamVjdCAqLgoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gU0YgcGF0Y2ggIzMzNjU5MDggLSBBZGQgYWxsIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gbWFwIHN1cHBvcnQgY29kZSBpbiBzdGRfbWFwLmkKCjIwMTEtMDctMTM6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBmb3IgYnVnIDMzMjQ3NTM6ICVyZW5hbWUgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIC1idWlsdGluLgoKMjAxMS0wNy0wMTogd3NmdWx0b24KCSAgICBGaXggc29tZSBzY29wZSBhbmQgc3ltYm9sIGxvb2t1cCBwcm9ibGVtcyB3aGVuIHRlbXBsYXRlIGRlZmF1bHQgcGFyYW1ldGVycyBhcmUgYmVpbmcKICAgICAgICAgICAgdXNlZCB3aXRoIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgWFgsIHR5cGVuYW1lIFRUID0gU29tZVR5cGU+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgIHR5cGVkZWYgWFggWDsKICAgICAgICAgICAgICB0eXBlZGVmIFRUIFQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRUPiBzdHJ1Y3QgVXNlc0ZvbyB7CiAgICAgICAgICAgICAgdm9pZCB4KHR5cGVuYW1lIEZvbzxUVD46OlQsIHR5cGVuYW1lIEZvbzxUVD46OlgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBmaXhlcyB1c2Ugb2Ygc3RkOjp2ZWN0b3I8aW50Pjo6c2l6ZV90eXBlIGZvciBQeXRob24gYXMgcmVwb3J0ZWQgYnkgQXVicmV5IEJhcm5hcmQuCgoyMDExLTA2LTIzOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9yIGNvZGUgdG8gd29yayB3aGVuIFBIUCBpcyBidWlsdCB3aXRoIFpUUyBlbmFibGVkLAoJICAgIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9uIE1pY3Jvc29mdCBXaW5kb3dzLgoKMjAxMS0wNi0yMTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gdmFyaW91cyBzbWFsbCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcy4KCSAgICAtIEF2b2lkIG5hbWUgY29uZmxpY3RzIGJldHdlZW4gc21hcnQgcG9pbnRlciB3cmFwcGVycyBhbmQgdGhlIHdyYXBwZXJzIGZvcgoJICAgIHRoZSBhY3R1YWwgY2xhc3MuCgkgICAgLSBGaXggZGVmYXVsdCB0eXBlbWFwcyBmb3IgQyBiaW5kaW5ncywgd2hpY2ggd2VyZSBpbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvCgkgICAgY2FsbCBub24tZXhpc3RlbnQgZGVzdHJ1Y3RvcnMgb24gdXNlci1kZWZpbmVkIHR5cGVzLgoJICAgIC0gTmV3IGZlYXR1cmUsIGZlYXR1cmU6YWNsbWl4aW5zLCBmb3IgYWRkaW5nIHN1cGVyY2xhc3MgdG8gdGhlIGZvcmVpZ24gY2xhc3MKCSAgICB3cmFwcGVycy4KCSAgICAtIEltcHJvdmUgbG9uZ2xvbmcgdHlwZW1hcHMuCgoyMDExLTA2LTE5OiB3c2Z1bHRvbgoJICAgIEZpeCBpbmNvcnJlY3QgdHlwZW1hcHMgYmVpbmcgdXNlZCBmb3IgYSBzeW1ib2wgd2l0aGluIGEgdGVtcGxhdGVkIHR5cGUsIGVnOgogICAgICAgICAgICBBPGludD46OnZhbHVlX3R5cGUgd291bGQgaW5jb3JyZWN0bHkgdXNlIGEgdHlwZW1hcCBmb3IgdHlwZSBBLgoKMjAxMS0wNi0xODogb2xseQoJICAgIFtUY2xdIEZpeCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaW4gbWlkZGxlIG9mIGJsb2NrcyB3aGljaCBpc24ndAoJICAgIHBlcm1pdHRlZCBpbiBDOTAgKGlzc3VlIHByb2JhYmx5IGludHJvZHVjZWQgaW4gMi4wLjMgYnkgcGF0Y2ggIzMyMjQ2NjMpLgoJICAgIFJlcG9ydGVkIGJ5IFBhdWwgT2Jlcm1laWVyIGluIFNGIzMyODg1ODYuCgoyMDExLTA2LTE3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBTRiAjMzMxMjUwNSAtIHNsaWdodGx5IGVhc2llciB0byB3cmFwIGNoYXJbXSBvciBjaGFyW0FOWV0gd2l0aCBhIEphdmEgYnl0ZVtdCiAgICAgICAgICAgIHVzaW5nIGFycmF5c19qYXZhLmkuCgoyMDExLTA2LTEzOiB3c2Z1bHRvbgoJICAgIFtSdWJ5LCBPY3RhdmVdIFNGICMzMzEwNTI4IEF1dG9kb2MgZml4ZXMgc2ltaWxhciB0byB0aG9zZSBkZXNjcmliZWQgYmVsb3cgZm9yIFB5dGhvbi4KCjIwMTEtMDYtMTA6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRmV3IHN1YnRsZSBidWdmaXhlcyBpbiBhdXRvZG9jIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiwKICAgICAgICAgICAgLSBVbm5hbWVkIGFyZ3VtZW50IG5hbWVzIGZpeCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAwLgogICAgICAgICAgICAtIERpc3BsYXkgb2YgdGVtcGxhdGUgdHlwZXMgZml4ZWQgZm9yIGF1dG9kb2MgbGV2ZWxzID4gMS4KICAgICAgICAgICAgLSBGaXggU0YgIzMzMTA1MjggLSBkaXNwbGF5IG9mIHR5cGVkZWYgc3RydWN0cyBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEFkZCBtaXNzaW5nIHR5cGUgZm9yIHNlbGYgZm9yIGF1dG9kb2MgbGV2ZWxzIDEgYW5kIDMuCiAgICAgICAgICAgIC0gYXV0b2RvYyBsZXZlbHMgMiBhbmQgMyBkb2N1bWVudGVkLgogICAgICAgICAgICAtIE1pbm9yIHR3ZWFrcyB0byBhdXRvZG9jIHN0eWxlIHRvIGNvbmZvcm0gd2l0aCBQRVA4LgoKMjAxMS0wNS0zMDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBkaXJlY3RvcnMgd2hlbiAtcHJlZml4IGlzIHVzZWQuCgoyMDExLTA1LTI0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG1ldGhvZHMgb2YgY2xhc3NlcyB3aXRoIGEgdmlydHVhbCBiYXNlIGNsYXNzIChTRiMzMTI0NjY1KS4KClZlcnNpb24gMi4wLjQgKDIxIE1heSAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW0d1aWxlXSBQYXRjaCAjMzE5MTYyNSBmaXhpbmcgb3ZlcmxvYWRpbmcgb2YgaW50ZWdlciB0eXBlcy4KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW1BlcmxdIFBhdGNoICMzMjYwMjY1IGZpeGluZyBvdmVybG9hZGluZyBvZiBub24tcHJpbWl0aXZlIHR5cGVzIGFuZCBpbnRlZ2VycyBpbiAKICAgICAgICAgICAgUGVybCA1LjEyIGFuZCBsYXRlci4KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW1J1YnldIEZpeCAlaW1wb3J0IHdoZXJlIG9uZSBvZiB0aGUgaW1wb3J0ZWQgZmlsZXMgJWluY2x1ZGUgb25lIG9mIHRoZSBTVEwgaW5jbHVkZQogICAgICAgICAgICBmaWxlcyBzdWNoIGFzIHN0ZF92ZWN0b3IuaS4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFwcGx5ICMzMjg5ODUxIGZyb20gQWxhbiBIYXJkZXIgdG8gZml4IG1lbW9yeSBsZWFrIGluIGRpcmVjdG9ycyB3aGVuIGNoZWNraW5nCiAgICAgICAgICAgIGZvciBwZW5kaW5nIGV4Y2VwdGlvbnMuCgoyMDExLTA1LTE3OiB3c2Z1bHRvbgoJICAgIFtUY2xdIEFwcGx5ICMzMzAwMDcyIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHRvIGZpeCBtdWx0aXBsZSBtb2R1bGUgbG9hZGluZyBub3QKICAgICAgICAgICAgYWx3YXlzIHNoYXJpbmcgdmFyaWFibGVzIGFjcm9zcyBtb2R1bGVzLgoKMjAxMS0wNS0xNjogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBGaXggYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggbmV2ZXIgdmVyc2lvbnMgb2YgT2N0YXZlLiBDYXNlIG9uIE9jdGF2ZQoJICAgIEFQSSA+PSA0MCB0byBoYW5kbGUgcmVuYW1lIG9mIE9jdGF2ZV9tYXAgdG8gb2N0YXZlX21hcC4KCSAgICBbb2N0YXZlXSBBZGQgc3VwcG9ydCBmb3IgeS5fX3JvcF9fKHgpIG9wZXJhdG9ycyB3aGVuIHguX19vcF9fKHkpIGRvZXNuJ3QgZXhpc3QuCgkgICAgW29jdGF2ZV0gQWxsb3cgZ2xvYmFsIG9wZXJhdG9ycyB0byBiZSBkZWZpbmVkIGJ5IFNXSUctd3JhcHBlZCBmdW5jdGlvbnMuCgkgICAgW29jdGF2ZV0gRml4IHNldmVyYWwgYnVncyBhcm91bmQgbW9kdWxlIG5hbWVzcGFjZXM7IGFkZCAtZ2xvYmFsLCAtbm9nbG9iYWwsCgkgICAgLWdsb2JhbHMgPG5hbWU+IGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHRoZSBtb2R1bGUuCgoyMDExLTA1LTE0OiB3c2Z1bHRvbgoJICAgICV2YXJhcmdzIHdoZW4gdXNlZCB3aXRoIGEgbnVtZXJpYyBhcmd1bWVudCB1c2VkIHRvIGNyZWF0ZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IAogICAgICAgICAgICB3aGljaCB3YXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZWQgc2VudGluZWwgdmFsdWUuIFRoaXMgbmV2ZXIgd29ya2VkIGFuZCBub3cKICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQgaXMgbm90IGdlbmVyYXRlZC4KCjIwMTEtMDUtMTM6IHdzZnVsdG9uCgkgICAgW3B5dGhvbl0gQWRkaXRpb25hbCBmaXhlcyBmb3IgcHl0aG9uMy4yIHN1cHBvcnQuCgoyMDExLTA1LTA3OiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBQeUdldFNldERlc2NyIGZvciBweXRob24zLjIuCgoyMDExLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhLCBQeXRob24sIFRjbF0gQy9DKysgcHJvdG90eXBlcyBzaG93biBpbiBlcnJvciBtZXNzYWdlIHdoZW4gY2FsbGluZyBhbiBvdmVybG9hZGVkCiAgICAgICAgICAgIG1ldGhvZCB3aXRoIGluY29ycmVjdCBhcmd1bWVudHMgaW1wcm92ZWQgdG8gc2hvdyBhbHdheXMgc2hvdyBmdWxseSBxdWFsaWZpZWQgbmFtZQogICAgICAgICAgICBhbmQgaWYgYSBjb25zdCBtZXRob2QuIAoKICAgICAgICAgICAgQWxzbyBmaXhlZCBvdGhlciBMdWEgZXJyb3IgbWVzc2FnZXMgaW4gZ2VuZXJhdGVkIGNvZGUgd2hpY2ggd2VyZW4ndCBjb25zaXN0ZW50bHkKICAgICAgICAgICAgdXNpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBDKysgbmFtZSAtIHJlcXVlc3RlZCBieSBHZWRhbGlhIFBhc3Rlcm5hay4KCjIwMTEtMDQtMjk6IHN6YWdlcgoJICAgIEJ1ZyAyNjM1OTE5OiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCBzdGQ6Om1hcCB0byBhIHB5dGhvbiBkaWN0LgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDI4MTE1NDk6IHJldHVybiBub24tY29uc3QgaXRlcmF0b3JzIGZyb20gU1RMCgkgICAgbWV0aG9kcyBiZWdpbigpLCBlbmQoKSwgcmJlZ2luKCksIHJlbmQoKS4KCjIwMTEtMDQtMjU6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIGJ1ZyAxNDk4OTI5OiBBY2Nlc3MgdG8gbWVtYmVyIGZpZWxkcyBpbiBtYXAgZWxlbWVudHMKCjIwMTEtMDQtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBuc3BhY2U6IENvcnJlY3RseSBnZW5lcmF0ZSBpZGVudGlmaWVycyBmb3IgYmFzZSBjbGFzc2VzIHdoZW4KICAgICAgICAgICAgbm90IGluIHNwbGl0IHByb3h5IG1vZGUuCgoyMDExLTA0LTEzOiBzemFnZXIKCSAgICBGaXhlZCBidWcgMzI4NjMzMzogaW5maW5pdGUgcmVjdXJzaW9uIHdpdGggbXV0dWFsICd1c2luZyBuYW1lc3BhY2UnIGNsYXVzZXMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgMTE2MzQ0MDogdmFyYXJnIHR5cGVtYXBzLgoKMjAxMS0wNC0xMjogc3phZ2VyCgkgICAgRml4ZWQgYnVnICMzMjg1Mzg2OiBwYXJzZSBlcnJvciBmcm9tICdvcGVyYXRvciBUKiYoKScuICBBZGRlZCBvcGVyYXRvcl9wb2ludGVyX3JlZgoJICAgIHRlc3QgY2FzZSB0byBkZW1vbnN0cmF0ZS4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjg0MzI2IGZyb20gQ29saW4gTWNEb25hbGQgdG8gZml4IHNvbWUgY29tcGlsZXIgd2FybmluZ3MuCgoyMDExLTA0LTExOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBQeVZhck9iamVjdF9IRUFEX0lOSVQgdG8gZWxpbWluYXRlIFZDKysgY29tcGlsZXIgZXJyb3JzIGFib3V0CgkgICAgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdCBtZW1iZXJzIHdpdGggcG9pbnRlcnMuCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4ZWQgd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgZW51bSB7IFggPSAnWCc7IH0gKHRoaXMgd2FzIGFscmVhZHkgaW4gMi4wLjMgZm9yIEMjIGFuZCBKYXZhKQoKMjAxMS0wNC0xMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogRml4ZWQgcmVmZXJlbmNpbmcgdHlwZXMgaW4gdGhlIHJvb3QgbmFtZXNwYWNlIHdoZW4KICAgICAgICAgICAgbm90IGluIHNwbGl0IHByb3h5IG1vZGUuCgoyMDExLTA0LTA5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoICMxOTMyNDg0OiBtaWdyYXRlIFB5Q09iamVjdCB0byBQeUNhcHN1bGUuCgoyMDExLTA0LTA5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBBZGRlZCBwcmVwcm9jZXNzb3IgZ3VhcmRzIGZvciBweXRob24gZnVuY3Rpb25zIFB5VW5pY29kZV9Bc1dpZGVDaGFyIGFuZAoJICAgIFB5U2xpY2VfR2V0SW5kaWNlcywgd2hpY2ggY2hhbmdlZCBzaWduYXR1cmVzIGluIHB5dGhvbjMuMi4KCjIwMTEtMDQtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjb25zdCBhcnJheSB0eXBlZGVmcyB3aGljaCB3ZXJlIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUgYXMKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgS2FybCBXZXR0ZS4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIHRoZSBiZWhhdmlvciBvZiAlcHl0aG9ubm9uZHluYW1pYyB0byBjb25mb3JtIHRvIHRoZSBzcGVjIGluIExpYi9weXVzZXJkaXIuc3dnLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gTWVyZ2VkIGluIHRoZSBzemFnZXItcHl0aG9uLWJ1aWx0aW4gYnJhbmNoLCBhZGRpbmcgdGhlIC1idWlsdGluIGZlYXR1cmUKCSAgICBmb3IgcHl0aG9uLiAgVGhlIC1idWlsdGluIG9wdGlvbiBtYXkgcHJvdmlkZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW4KCSAgICBpbiBweXRob24gd3JhcHBlcnMuICBGb3IgZnVsbCBkZXRhaWxzIGFuZCBsaW1pdGF0aW9ucywgcmVmZXIgdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbC4KCSAgICBBIHNtYWxsIHRlc3Qgc3VpdGUgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgdGhlIHBlcmZvcm1hbmNlIGdhaW4gaXMgaW4KCSAgICBFeGFtcGxlcy9weXRob24vcGVyZm9ybWFuY2UuCgoyMDExLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gbWlzc2luZyB3cmFwcGVycyBmb3IgZnJpZW5kIGZ1bmN0aW9ucyBmb3Igc29tZSB0YXJnZXQgbGFuZ3VhZ2VzLCBtb3N0bHkKICAgICAgICAgICAgdGhlIG5vbi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSmF2YSBhbmQgQyMuCgpWZXJzaW9uIDIuMC4zICgyOSBNYXJjaCAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFwcGx5IHBhdGNoICMzMjM5MDc2IGZyb20gTWFyaWUgV2hpdGUgZml4aW5nIHN0cmluZ3MgZm9yIFIgPj0gMi43LjAKCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjQ4MjgwIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHdoaWNoIGFkZHMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIHdoZW4KICAgICAgICAgICAgdGhlIGluY29ycmVjdCBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBvdmVybG9hZGVkIG1ldGhvZHMuCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzIyNDY2MyBmcm9tIENocmlzdGlhbiBEZWxiYWVyZS4KICAgICAgICAgICAgMS4gRml4IHdoZW4gZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgdmFsdWUsIGEgIk5VTEwiIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgYW5kIGNhbGxpbmcgdGhpcyBjb21tYW5kIHdpbGwgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQuIAoKICAgICAgICAgICAgMi4gUHJldmlvdXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIGNsYXNzIG1ldGhvZHMgdXNpbmcgYSBsaW5lYXIgc2VhcmNoIGNhdXNpbmcgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICAgICAgICAgIGluIHdyYXBwZXJzIGZvciBjbGFzc2VzIHdpdGggbWFueSBtZW1iZXIgZnVuY3Rpb25zLiBUaGUgcGF0Y2ggYWRkcyBhIG1ldGhvZCBoYXNoIHRhYmxlIHRvIGNsYXNzZXMgYW5kCiAgICAgICAgICAgIGNoYW5nZXMgbWV0aG9kIG5hbWUgbG9va3VwIHRvIHVzZSB0aGUgaGFzaCB0YWJsZSBpbnN0ZWFkIG9mIGRvaW5nIGEgbGluZWFyIHNlYXJjaC4KCjIwMTEtMDMtMjY6IHdzZnVsdG9uCgkgICAgW0MjLCBKYXZhXSBTRiBidWcgIzMxOTUxMTIgLSBmaXggd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfQoKMjAxMS0wMy0yMTogdmFkegoJICAgIEFsbG93IHNldHRpbmcgUENSRV9DRkxBR1MgYW5kIFBDUkVfTElCUyBkdXJpbmcgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CgkgICAgcGNyZS1jb25maWcsIGUuZy4gdG8gYWxsb3cgdXNpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQQ1JFIGxpYnJhcnkuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIFtVVExdIEFkZCBtaXNzaW5nIGhlYWRlcnMgaW4gZ2VuZXJhdGVkIFNUTCB3cmFwcGVycyB0byBmaXggY29tcGlsYXRpb24gd2l0aCBnY2MtNC42LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjIgd2hlcmUgZmlsZW5hbWVzIHdpdGggc3BhY2VzIHdlcmUgbm90IGZvdW5kCgkgICAgd2hlbiB1c2VkIHdpdGggJWluY2x1ZGUgYW5kICVpbXBvcnQuIFJlcG9ydGVkIGJ5IFNoYW5lIExpZXNlZ2FuZy4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4IG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgY29uc3QgY2hhcltdLCBwcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIE1heHdlbGwuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgY2hhcltBTlldIGFuZCBjb25zdCBjaGFyW0FOWV0uCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtDI10gQXBwbHkgcGF0Y2ggIzMyMTI2MjQgZml4aW5nIHN0ZDo6bWFwIEtleXMgcHJvcGVydHkuCgoyMDExLTAzLTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcy9mdW5jdGlvbnMgd2hlcmUgc29tZQoJICAgIHJldHVybiB2b2lkIGFuZCBvdGhlcnMgZG9uJ3QgLSB3aGV0aGVyIHRoaXMgd29ya2VkIG9yIG5vdCBkZXBlbmRlZAoJICAgIG9uIHRoZSBvcmRlciB0aGV5IHdlcmUgZW5jb3VudGVyZWQgaW4gKFNGIzMyMDgyOTkpLgoJCjIwMTEtMDMtMTM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBFeHRlbmRlZCBzdXBwb3J0IGZvciBDKysgbmFtZXNwYWNlcyAobnNwYWNlIGZlYXR1cmUpLgoKMjAxMS0wMy0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzaGFyaW5nIG9mIHR5cGUgaW5mb3JtYXRpb24gYmV0d2VlbiBtdWx0aXBsZSBTV0lHLXdyYXBwZWQKCSAgICBtb2R1bGVzIChTRiMzMjAyNDYzKS4KCjIwMTEtMDMtMDk6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IFNGICMzMTk0Mjk0IC0gY29ybmVyIGNhc2UgYnVnIHdoZW4gJ05VTEwnIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgZm9yIGEgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVyIGluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgoKMjAxMS0wMy0wNzogb2xseQoJICAgIFtQSFBdIERvbid0IHVzZSB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgZm9yIGNhc2VzIHdoZXJlIHRoZSBmdW5jdGlvbgoJICAgIHJldHVybnMgdm9pZCAtIG5vdyB0aGlzIGlzc3VlIGNhbiBvbmx5IG1hdHRlciBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCgkgICAgb3IgbWV0aG9kIHdoaWNoIGlzIGRpcmVjdGVkIGFuZCByZXR1cm5zIG5vbi12b2lkLgoKMjAxMS0wMy0wNjogb2xseQoJICAgIFtQSFBdIEFkZCBjYXN0cyB0byB0aGUgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZwoJICAgIGxvbmcgdG8gYXZvaWQgaXNzdWVzIHdoZW4gdGhleSBhcmUgdXNlZCB3aXRoIHNob3J0ZXIgdHlwZXMgdmlhCgkgICAgJWFwcGx5LgoKMjAxMS0wMy0wMjogd3NmdWx0b24KCSAgICBUZW1wbGF0ZWQgc21hcnQgcG9pbnRlcnMgb3ZlcmxvYWRlZCB3aXRoIGJvdGggY29uc3QgYW5kIG5vbiBjb25zdCBvcGVyYXRvci0+IGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKCSAgICBjb2RlIHdoZW4gdGhlIHBvaW50ZWUgd2FzIGEgY2xhc3Mgd2l0aCBlaXRoZXIgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgb3Igc3RhdGljIG1ldGhvZHMuCgkgICAgUmVncmVzc2lvbiBpbiAyLjAueCByZXBvcnRlZCBhcyB3b3JraW5nIGluIDEuMy40MCBieSB4YW50YXJlcyBvbiBzd2lnLXVzZXIgbWFpbGluZyBsaXN0LgoKVmVyc2lvbiAyLjAuMiAoMjAgRmVicnVhcnkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDItMTk6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdGhlIHR5cGVtYXBzLmkgbGlicmFyeQogICAgICAgICAgICBmb3IgcHJpbWl0aXZlIHJlZmVyZW5jZSB0eXBlcyBhcyB3ZWxsIGFzIHNpZ25lZCBjaGFyICogYW5kIGJvb2wgKi4KCjIwMTEtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBBZGRyZXNzIGJ1ZyBpbiBQSFAgb24gc29tZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyB3aGljaAoJICAgIHJlc3VsdHMgaW4gemVuZF9lcnJvcl9ub3JldHVybigpIG5vdCBiZWluZyBhdmFpbGFibGUgdXNpbmcKCSAgICBTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk4gd2hpY2ggZGVmYXVsdHMgdG8gemVuZF9lcnJvcl9ub3JldHVybiBidXQKCSAgICBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGJ1aWxkaW5nIHRoZSBtb2R1bGUgYnkgcGFzc2luZwoJICAgIC1EU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOPXplbmRfZXJyb3IgdG8gdGhlIGNvbXBpbGVyLiAgVGhpcyBtYXkKCSAgICByZXN1bHQgaW4gY29tcGlsZXIgd2FybmluZ3MsIGJ1dCBzaG91bGQgYXQgbGVhc3QgYWxsb3cgYSBtb2R1bGUKCSAgICB0byBiZSBidWlsdCBvbiB0aG9zZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyAoU0YjMzE2NjQyMykuCgoyMDExLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxODQ1NDkgLSB2YXJhcmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBvdmVybG9hZGluZyB3aGVuIHVzaW5nIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbi4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBBbiBvdmVybG9hZGVkIG1ldGhvZCB3aGljaCBjYW4gcmV0dXJuIGFuIG9iamVjdCBvciBhCgkgICAgcHJpbWl0aXZlIHR5cGUgbm8gbG9uZ2VyIGNhdXNlcyBTV0lHIHRvIHNlZ2ZhdWx0LiAgUmVwb3J0ZWQgYnkgUGF1bAoJICAgIENvbGJ5IGluIFNGIzMxNjg1MzEuCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGludmFsaWQgZXJhc2UgZHVyaW5nIGl0ZXJhdGlvbiBvZiBzdGQ6Om1hcCBpbiBnZW5lcmF0ZWQKCSAgICBkaXJlY3RvciBjb2RlLiAgUmVwb3J0ZWQgYnkgQ29yeSBCZW5uZXR0IGluIFNGIzMxNzU4MjAuCgoyMDExLTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBQcmVwcm9jZXNzaW5nIG5vdyB3YXJucyBpZiBleHRyYSB0b2tlbnMgYXBwZWFyIGFmdGVyICNlbHNlIGFuZCAjZW5kLgoKMjAxMS0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNjUzMDkyIFByZXByb2Nlc3NvciBkb2VzIG5vdCBlcnJvciBvdXQgd2hlbiAjZWxpZiBpcyBtaXNzaW5nIGFuIGV4cHJlc3Npb24uCiAgICAgICAgICAgIFRoaXMgYW5kIG90aGVyIGNhc2VzIG9mIG1pc3NpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gYW4gZXJyb3IuCgoyMDExLTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWxdIEFwcGx5IHBhdGNoICMzMTUxNzg4IGZyb20gSm9lbCBSZXltb250LiBCcmluZ3MgT2NhbWwgc3VwcG9ydCB1cCB0byBkYXRlIAogICAgICAgICAgICAodmVyIDMuMTEgYW5kIDMuMTIpLCBpbmNsdWRpbmcgc3RkOjpzdHJpbmcuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzMxNzYyNzQgZnJvbSBKYW1lcyBNYXN0ZXJzIC0gdHlwZWNoZWNrIHR5cGVtYXAgZm9yIHRpbWVfdC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMTcxNzkzIGZyb20gc3phZ2VyIC0gcHJvdGVjdGVkIGRpcmVjdG9yIG1ldGhvZHMgZmFpbGluZyB3aGVuIC1mdmlydHVhbCBpcyB1c2VkLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTI3ODUyIC0gI2luY2x1ZGUgZGlyZWN0aXZlcyBkb24ndCBwcmVwcm9jZXNzIHRoZSBmaWxlIHBhc3NlZCB0byBpdC4gVGhlIGZpeCBpcyBmb3IKICAgICAgICAgICAgI2luY2x1ZGUgd2l0aCAtaW1wb3J0YWxsIG9yIC1pbmNsdWRlYWxsLCAlaW5jbHVkZSBhbmQgJWltcG9ydCwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSBGSUxFTkFNRSAiYWJjLmgiCiAgICAgICAgICAgICAgJWluY2x1ZGUgRklMRU5BTUUKCjIwMTEtMDItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk0MDUzNiwgb3ZlcmFjdGl2ZSBwcmVwcm9jZXNzb3Igd2hpY2ggd2FzIGV4cGFuZGluZyBkZWZpbmVkKC4uLikgb3V0c2lkZSBvZiAjaWYgYW5kICNlbGlmCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBTRiAjMjk0Mjg5OSBBZGQgdXNlciBzdXBwbGllZCBkb2N1bWVudGF0aW9uIHRvIGhlbHAgZ2V0dGluZyBzdGFydGVkIHdpdGggTXpTY2hlbWUuCiAgICAgICAgICAgIFVwZGF0ZSBjaGFwdGVyIG5hbWUgdG8gTXpTY2hlbWUvUmFja2V0IGFjY291bnRpbmcgZm9yIHRoZSByZW5hbWUgb2YgTXpTY2hlbWUgdG8gUmFja2V0LgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTRiAjMzA4NTkwNiAtIFBvc3NpYmxlIGZpeCBydW5uaW5nIHRlc3Qtc3VpdGUgb24gTWFjIE9TIFguCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMzE3MzM2NyBCZXR0ZXIgaW5mb3JtYXRpb24gZHVyaW5nIGNvbmZpZ3VyZSBhYm91dCBCb29zdCBwcmVyZXF1aXNpdGUgZm9yIHJ1bm5pbmcKICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGUuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMzEyNzYzMyBGaXggaW5maW5pdGUgbG9vcCBpbiByZWN1cnNpdmUgdHlwZWRlZiByZXNvbHV0aW9uLgoKMjAxMS0wMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFNGICMzMTY4Njc2IEZpeCAlcmVuYW1lIG5vdCB3b3JraW5nIGZvciBtZW1iZXIgdmFyaWFibGVzIGFuZCBtZXRob2RzLgoKMjAxMS0wMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW2NsaXNwXSBTRiAjMzE0ODIwMCBGaXggc2VnZmF1bHQgcGFyc2luZyBuZXN0ZWQgdW5pb25zLgoKMjAxMS0wMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBEaXJlY3RvcnMgLSBhIGNhbGwgdG8gYSBtZXRob2QgYmVpbmcgZGVmaW5lZCBpbiB0aGUgYmFzZSBjbGFzcywgbm90CiAgICAgICAgICAgIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcywgYnV0IGFnYWluIG92ZXJyaWRkZW4gaW4gYSBjbGFzcyBkZXJpdmVkIGZyb20KICAgICAgICAgICAgdGhlIGZpcnN0IHN1YmNsYXNzIHdhcyBub3QgYmVpbmcgZGlzcGF0Y2hlZCBjb3JyZWN0bHkgdG8gdGhlIG1vc3QgZGVyaXZlZCBjbGFzcy4KICAgICAgICAgICAgU2VlIGRpcmVjdG9yX2FsdGVybmF0aW5nLmkgZm9yIGFuIGV4YW1wbGUuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFueSAndXNpbmcnIHN0YXRlbWVudHMgaW4gdGhlIHByb3RlY3RlZCBzZWN0aW9uIG9mIGEgY2xhc3Mgd2VyZSBwcmV2aW91c2x5CiAgICAgICAgICAgIGlnbm9yZWQgd2l0aCBkaXJlY3RvciBwcm90ZWN0ZWQgKGRpcnByb3QpIG1vZGUuCgoyMDExLTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3ZlcmxvYWRpbmcgd2l0aCBjb25zdCBwb2ludGVyIHJlZmVyZW5jZSAoU1dJR1RZUEUgKmNvbnN0JikgcGFyYW1ldGVycyBmb3IgYQogICAgICAgICAgICBudW1iZXIgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlcy4KCjIwMTEtMDEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyB3YXJuaW5nIGZvciBzbWFydCBwb2ludGVycyBpZiBvbmx5IHNvbWUgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGNoYWluIGFyZSBtYXJrZWQgYXMgc21hcnQgcG9pbnRlciwgZWcsICVzaGFyZWRfcHRyIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHNvIHRoaXMgbmV3IHdhcm5pbmcgaGlnaGxpZ2h0cyBjb2RlIHdoZXJlIHRoaXMgaXMKICAgICAgICAgICAgbm90IHRoZSBjYXNlLgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MTI6IFdhcm5pbmcgNTIwOiBCYXNlIGNsYXNzICdBJyBvZiAnQicgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyLgogICAgICAgICAgICAgIGV4YW1wbGUuaToxNjogV2FybmluZyA1MjA6IERlcml2ZWQgY2xhc3MgJ0MnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCgoyMDExLTAxLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzb21lIG1pc3NpbmcgbXVsdGktYXJndW1lbnQgdHlwZW1hcHM6IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIGFuZCAKICAgICAgICAgICAgKGNoYXIgKlNUUklORywgaW50IExFTkdUSCkuIERvY3VtZW50YXRpb24gZm9yIHRoaXMgdXBkYXRlZC4gSmF2YSBwYXRjaCBmcm9tCiAgICAgICAgICAgIFZvbGtlciBHcmFic2NoLgoKMjAxMS0wMS0xMTogaWFudAoJICAgIFJlcXVpcmUgR28gdmVyc2lvbiA3MDc3IG9yIGxhdGVyLgoKMjAxMC0xMi0zMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0MjLCBELCBKYXZhXSBDaGVjayBmb3IgY29sbGlzaW9uIG9mIHBhcmFtZXRlciBuYW1lcyB3aXRoIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSBrZXl3b3JkcyB3aGVuIGdlbmVyYXRpbmcgdGhlIGRpcmVjdG9yIGdsdWUgY29kZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBzaXR1YXRpb24gaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBjb3VsZCB3b3VsZCBwcmV2aW91c2x5IGJlCiAgICAgICAgICAgIGludmFsaWQgaXMgaWxsdXN0cmF0ZWQgaW4gdGhlIG5ldyAnZGlyZWN0b3Jfa2V5d29yZHMnIHRlc3QgY2FzZS4KCjIwMTAtMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgbm90IGJlaW5nIGV4cGFuZGVkIGZvciBjc3ZhcmluIHR5cGVtYXBzCiAgICAgICAgICAgIHdoZW4gdXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KCjIwMTAtMTItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkYmFzZW1hbmdsZSBleHBhbnNpb24gaW4gYXJyYXkgdHlwZW1hcHMuIEZvciBleGFtcGxlIGlmIHR5cGUgaXMgaW50ICpbM10sCiAgICAgICAgICAgICRiYXNlbWFuZ2xlIGV4cGFuZHMgdG8gX3BfaW50LgoKMjAxMC0xMi0wNzogaWFudAoJICAgIENoZWNrIHRoYXQgd2UgYXJlIHVzaW5nIGEgc3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uIG9mIHRoZQoJICAgIDZnIG9yIDhnIEdvIGNvbXBpbGVyIGR1cmluZyBjb25maWd1cmUgdGltZS4gSWYgbm90LCBkaXNhYmxlIEdvLgogICAgICAgICAgICBNaW5pbXVtIHZlcnNpb24gaXMgbm93IDY3MDcuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0xMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMTI3Mzk0IC0gdXNlIG9mIG5ldHdvcmsgcGF0aHMgb24gV2luZG93cy9NU3lzLgoKMjAxMC0xMS0xODoga2xpY2t2ZXJib3QKCSAgICBbRF0gQWRkZWQgdGhlIEQgbGFuZ3VhZ2UgbW9kdWxlLgoKMjAxMC0xMS0xMjogdmFkegoJICAgIEZpeCBoYW5kbGluZyBvZiBtdWx0aXBsZSByZWdleC11c2luZyAlcmVuYW1lcyBhdHRhY2hlZCB0byB0aGUgc2FtZQoJICAgIGRlY2xhcmF0aW9uLiBGb3IgZXhhbXBsZSwgbm93CgoJICAgICAgJXJlbmFtZSgiJShyZWdleDovXlNldCguKikvcHV0XFwxLylzIikgIiI7CgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4Oi9eR2V0KC4qKS9nZXRcXDEvKXMiKSAiIjsKCgkgICAgd29ya3MgYXMgZXhwZWN0ZWQgd2hlcmVhcyBiZWZvcmUgb25seSB0aGUgbGFzdCBhbm9ueW1vdXMgcmVuYW1lIHdhcwoJICAgIHRha2VuIGludG8gYWNjb3VudC4KCjIwMTAtMTAtMTc6IGRyam9lCgkgICAgW1JdIEZpeCBmYWlsdXJlIGluIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdoaWNoIHdhcyBicmVha2luZwoJICAgIFF1YW50TGliLVNXSUcKCjIwMTAtMTAtMTQ6IG9sbHkKCSAgICBbUEhQXSBBbGxvdyBjb21waWxhdGlvbiBvbiBub24tY29uZm9ybWluZyBNaWNyb3NvZnQgQysrIGNvbXBpbGVycwoJICAgIHdoaWNoIGRvbid0IGFjY2VwdDogcmV0dXJuIGZ1bmN0aW9uX3JldHVybmluZ192b2lkKCk7CgkgICAgUmVwb3J0ZWQgYnkgRnJhbmsgVmFuZGVuIEJlcmdoZW4gb24gdGhlIFNXSUcgbWFpbGluZyBsaXN0LgoKMjAxMC0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgKGdsb2JhbCBzY29wZSkgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC4wLCByZXBvcnRlZCBieQogICAgICAgICAgICBCZW4gV2Fsa2VyLiBUaGUgbWFuZ2xlZCBzeW1ib2wgbmFtZXMgd2VyZSBpbmNvcnJlY3QsIHNvbWV0aW1lcyByZXN1bHRpbmcgaW4gdHlwZXMgYmVpbmcKICAgICAgICAgICAgaW5jb3JyZWN0bHkgdHJlYXRlZCBhcyBvcGFxdWUgdHlwZXMuCgogICAgICAgICAgICBBbHNvIGZpeGVzICMyOTU4NzgxIGFuZCBzb21lIG90aGVyIHR5cGUgcHJvYmxlbXMgZHVlIHRvIGJldHRlciB0eXBlZGVmIHJlc29sdXRpb24sIGVnIAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUICo+Ojp2YWx1ZV90eXBlIGRpZG4ndCByZXNvbHZlIHRvIFQgKiB3aGVuIGl0IHNob3VsZCBoYXZlLiBUaGUgbWFuZ2xlZCB0eXBlCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBTV0lHVFlQRV9zdGRfX3ZlY3RvclRfVGVzdF9wX3N0ZF9fYWxsb2NhdG9yVF9UZXN0X3BfdF90X192YWx1ZV90eXBlIGFuZCBub3cKICAgICAgICAgICAgaXQgaXMgY29ycmVjdGx5IFNXSUdUWVBFX3BfVGVzdC4KClZlcnNpb24gMi4wLjEgKDQgT2N0b2JlciAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMTAtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMDY2OTU4IGZyb20gTWlrYWVsIEpvaGFuc3NvbiB0byBmaXggZGVmYXVsdCBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIGhhbmRsaW5nIHdoZW4gdGhlIHNtYXJ0IHBvaW50ZXIgY29udGFpbnMgYm90aCBhIGNvbnN0IGFuZCBub24tY29uc3Qgb3BlcmF0b3ItPi4KCjIwMTAtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtcGNyZXZlcnNpb24gb3B0aW9uIHRvIGRpc3BsYXkgUENSRSB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKMjAxMC0xMC0wMTogb2xseQoJICAgIFtSdWJ5XSBBdm9pZCBzZWdmYXVsdCB3aGVuIGEgbWV0aG9kIG5vZGUgaGFzIG5vIHBhcmVudE5vZGUKCSAgICAoU0YjMzAzNDA1NCkuCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1B5dGhvbl0gQWxsb3cgcmVpbml0aWFsaXNhdGlvbiB0byB3b3JrIHdpdGggYW4gZW1iZWRkZWQgUHl0aG9uCgkgICAgaW50ZXJwcmV0ZXIgKHBhdGNoIGZyb20gSmltIENhcnJvbGwgaW4gU0YjMzA3NTE3OCkuCgoyMDEwLTA5LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoIGZyb20gVG9tYXMgRGlydmFuYXVza2FzIGZvciBzdGQ6Om1hcCB3cmFwcGVycyB0byBhdm9pZAogICAgICAgICAgICB0aHJvd2luZyBleGNlcHRpb25zIHdpdGggbm9ybWFsIHVzYWdlIG9mIGl0ZXJhdG9ycy4KCjIwMTAtMDktMjc6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gd2hlbiBhIHBhcmFtZXRlciBvZiB0aGUgd3JvbmcKCSAgICB0eXBlIGlzIHBhc3NlZCB0byBhbiBvdmVybG9hZGVkIG1ldGhvZCAoU0YjMzAyNzM1NSkuCgoyMDEwLTA5LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBTRiBwYXRjaCAjMzA3NTE1MCAtIEphdmEgZGlyZWN0b3JzIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMgaW4KICAgICAgICAgICAgbmFtZWQgbmFtZXNwYWNlLgoKMjAxMC0wOS0yNDogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIHdoZXJlIFNXSUcgbWFjcm9zCiAgICAgICAgICAgIGFyZSB1c2VkIHdpdGhpbiB7fSBicmFjZXMgKHdoZXJlIHRoZSBwcmVwcm9jZXNzb3IgZXhwYW5kcyBtYWNyb3MpLAogICAgICAgICAgICBmb3IgZXhhbXBsZSBtYWNyb3Mgd2l0aGluICVpbmxpbmUgey4uLn0gYW5kICVmcmFnbWVudCguLi4pIHsuLi59CiAgICAgICAgICAgIGFuZCBuZXN0ZWQgc3RydWN0cy4KCjIwMTAtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZmlsZSBhbmQgbGluZSBlcnJvci93YXJuaW5nIHJlcG9ydGluZyBmaXhlcyBmb3IgdmFyaW91cyBpbmhlcml0ZWQKICAgICAgICAgICAgY2xhc3MgcHJvYmxlbXMuCgoyMDEwLTA5LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBBIG11Y2ggaW1wcm92ZWQgZGVidWdnaW5nIG9mIFNXSUcgc291cmNlIGV4cGVyaWVuY2UgaXMgbm93IGF2YWlsYWJsZSBhbmQKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiB0aGUgIkRlYnVnZ2luZyBTV0lHIiBzZWN0aW9uIGluIHRoZSBEb2MvRGV2ZWwvaW50ZXJuYWxzLmh0bWwKICAgICAgICAgICAgZmlsZSwgaW5jbHVkaW5nIGEgc3dpZy5kYmcgc3VwcG9ydCBmaWxlIGZvciB0aGUgZ2RiIGRlYnVnZ2VyLgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIHdoZW4gYSBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9uIGVuZHMgd2l0aCAnLycgYW5kIGl0IGlzIG5vdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIGFmdGVyIHBhcnNpbmcKICAgICAgICAgICAgbWFjcm8gaW52b2NhdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIG92ZXIgbW9yZSB0aGFuIG9uZSBsaW5lLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgbGluZSBpbiBwcmVwcm9jZXNzZWQgb3V0cHV0IGFmdGVyIGluY2x1ZGluZyBmaWxlcwogICAgICAgICAgICB3aGljaCB3b3VsZCBzb21ldGltZXMgbGVhZCB0byBlcnJvci93YXJuaW5nIG1lc3NhZ2VzIHR3byBsaW5lcyBhZnRlciB0aGUKICAgICAgICAgICAgZW5kIG9mIHRoZSBmaWxlLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMTQ5NTIzIC0gSW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMgYWZ0ZXIgcGFyc2luZyBtYWNyb3MKICAgICAgICAgICAgY29udGFpbmluZyBDKysgY29tbWVudHMuCgoyMDEwLTA5LTA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIE9VVFBVVCB0eXBlbWFwcyAoUGF0Y2ggZnJvbSBSeWFuIGluIFNGIzMwNTgzOTQpLgoKMjAxMC0wOS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGVycm9uZW91cyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgZm9yIG1hY3JvIGV4cGFuc2lvbnMsIGZvciBleGFtcGxlLAogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSBub3cgcG9pbnRzIHRvIGluc3RhbnRpYXRpb24gb2YgdGhlIG1hY3JvLCBpZSB0aGUgbGFzdCBsaW5lIGhlcmU6CgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8yKGEsIGIpIAoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPMShOQU1FKSBNQUNSTzIoTkFNRSwyLDMpIAoKICAgICAgICAgICAgICBNQUNSTzEoYWJjKQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBmb3IgcHJlcHJvY2Vzc29yIG1lc3NhZ2VzIHdpdGhpbgogICAgICAgICAgICAlaW5saW5lLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSIDEKICAgICAgICAgICAgICAjZGVmaW5lIEZPT0JBUiAiaGkiCiAgICAgICAgICAgICAgJX0KCjIwMTAtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgd2hpY2ggd2VyZSBjdW11bGF0aXZlbHkgb25lCiAgICAgICAgICAgIGxlc3MgdGhhbiB0aGV5IHNob3VsZCBoYXZlIGJlZW4gYWZ0ZXIgcGFyc2luZyBlYWNoICVpbmNsdWRlLyVpbXBvcnQgLSBidWcKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTEuMy4zMi4gQWxzbyBmaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgIHdoZW4gbmV3IGxpbmUgY2hhcmFjdGVycyBhcHBlYXIgYmV0d2VlbiB0aGUgJWluY2x1ZGUgLyAlaW1wb3J0IHN0YXRlbWVudCBhbmQKICAgICAgICAgICAgdGhlIGZpbGVuYW1lLgoKMjAxMC0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1hY3JvIHByZXByb2Nlc3NvciB3YXJuaW5ncy4KICAgICAgICAgICAgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBtYWNybyBhcmd1bWVudCBoYXMgYmVlbiBjb3JyZWN0ZWQgYW5kIHRoZSBsaW5lIG51bWJlcgogICAgICAgICAgICBvZiB0aGUgc3RhcnQgb2YgdGhlIG1hY3JvIGluc3RlYWQgb2Ygb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgbWFjcm8gaXMgdXNlZC4KICAgICAgICAgICAgU29tZSBleGFtcGxlczoKICAgICAgICAgICAgICBmaWxlLmg6MTE6IEVycm9yOiBJbGxlZ2FsIG1hY3JvIGFyZ3VtZW50IG5hbWUgJy4uJwogICAgICAgICAgICAgIGZpbGUuaDoxOTogRXJyb3I6IE1hY3JvICdEVVBMSUNBVEUnIHJlZGVmaW5lZCwKICAgICAgICAgICAgICBmaWxlLmg6MTU6IEVycm9yOiBwcmV2aW91cyBkZWZpbml0aW9uIG9mICdEVVBMSUNBVEUnLgogICAgICAgICAgICAgIGZpbGUuaDoyNTogRXJyb3I6IFZhcmlhYmxlLWxlbmd0aCBtYWNybyBhcmd1bWVudCBtdXN0IGJlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICAgZmlsZS5oOjMyOiBFcnJvcjogSWxsZWdhbCBjaGFyYWN0ZXIgaW4gbWFjcm8gYXJndW1lbnQgbmFtZQogICAgICAgICAgICAgIGZpbGUuaTozNzogRXJyb3I6IE1hY3JvICdTSVQnIGV4cGVjdHMgMiBhcmd1bWVudHMKCjIwMTAtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBfX0xJTkVfXyBhbmQgX19GSUxFX18gZXhwYW5zaW9uIHJlcG9ydGVkIGJ5IENhbWlsbGUgR2lsbG90LiBNb3N0bHkgdGhpcwogICAgICAgICAgICBkaWQgbm90IHdvcmsgYXQgYWxsLiBBbHNvIGZpeGVzIFNGICMyODIyODIyLgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBjb3JuZXIgY2FzZSBtYXJzaGFsbGluZyBvZiBkb3VibGVzIC0gZXJybm8gd2FzIG5vdCBiZWluZyBjb3JyZWN0bHkKICAgICAgICAgICAgc2V0IGJlZm9yZSBjYWxsaW5nIHN0cnRvZCAtIHBhdGNoIGZyb20gSnVzdGluIFZhbGxvbiAtIFNGIEJ1ZyAjMzAzODkzNi4KCjIwMTAtMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtYWtlIGRpc3RjbGVhbiB3aGVuIHNvbWUgb2YgdGhlIG1vcmUgb2JzY3VyZSBsYW5ndWFnZXMgYXJlIGRldGVjdGVkIGJ5CiAgICAgICAgICAgIGNvbmZpZ3VyZSAtIGZpeGVzIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0yODogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZSBjb25maWd1cmluZyBvdXQgb2Ygc291cmNlIGZvciB0aGUgdGVzdC1zdWl0ZSBzaW5jZSBpdCBicm9rZSBpbiAxLjMuMzcuCiAgICAgICAgICAgIEFzIHByZXZpb3VzbHksIGlmIHJ1bm5pbmcgJ21ha2UgY2hlY2stdGVzdC1zdWl0ZScgb3V0IG9mIHNvdXJjZSwgaXQgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBieSBpbnZva2luZyBjb25maWd1cmUgd2l0aCBhIHJlbGF0aXZlIHBhdGguIEludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGFuCiAgICAgICAgICAgIGFic29sdXRlIHBhdGggd2lsbCBub3Qgd29yay4gUnVubmluZyB0aGUgZnVsbCAnbWFrZSBjaGVjaycgc3RpbGwgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBpbiB0aGUgc291cmNlIHRyZWUuCgoyMDEwLTA3LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgICAgICByZXR1cm5zIGJ5IHJlZmVyZW5jZS4KCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgb2xkIGV4cGVyaW1lbnRhbCAicnhzcGVuY2VyIiBlbmNvZGVyIGFuZAogICAgICAgICAgICAiW25vdF1yeHNtYXRjaCIgaW4gJXJlbmFtZSAoc2VlIHRoZSAwMS8xNi8yMDA2IGVudHJ5KS4gVGhlIG5ldyBhbmQKICAgICAgICAgICAgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgInJlZ2V4IiBlbmNvZGVyIGFuZCAiW25vdF1yZWdleG1hdGNoIiBjaGVja3MKICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCAoc2VlIHRoZSB0d28gcHJldmlvdXMgZW50cmllcykuIFBsZWFzZQogICAgICAgICAgICByZXBsYWNlICIlKHJ4c3BlbmNlcjpbcGF0XVtzdWJzdF0pcyIgd2l0aCAiJShyZWdleDovcGF0L3N1YnN0LylzIgogICAgICAgICAgICB3aGVuIHVwZ3JhZGluZy4gTm90aWNlIHRoYXQgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHJlcGxhY2UgdGhlIGJhY2stCiAgICAgICAgICAgIHJlZmVyZW5jZXMgb2YgZm9ybSAiQDEiIHdpdGggdGhlIG1vcmUgc3RhbmRhcmQgIlxcMSIgYW5kIG1heSBuZWVkIHRvCiAgICAgICAgICAgIGFkanVzdCB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3ludGF4IGFzIHRoZSBuZXcgcmVnZXggZW5jb2RlciB1c2VzCiAgICAgICAgICAgIFBlcmwtY29tcGF0aWJsZSBzeW50YXggYW5kIG5vdCAoZXh0ZW5kZWQpIFBPU0lYIHN5bnRheCBhcyB0aGUgb2xkIG9uZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgInJlZ2V4bWF0Y2giLCAicmVnZXh0YXJnZXQiIGFuZCAibm90cmVnZXhtYXRjaCIgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgJXJlbmFtZSBkaXJlY3RpdmVzIHRvIHRoZSBkZWNsYXJhdGlvbnMgbWF0Y2hpbmcgdGhlCiAgICAgICAgICAgIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gb25seS4gVGhlIGZpcnN0IHR3byBjYW4gYmUgdXNlZAogICAgICAgICAgICBpbnRlcmNoYW5nZWFibHksIGJvdGggb2YgdGhlICVyZW5hbWVzIGJlbG93IGRvIHRoZSBzYW1lIHRoaW5nOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleG1hdGNoJG5hbWU9Ik9sZCQiKSAiIjsKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleHRhcmdldD0xKSAiT2xkJCI7CgogICAgICAgICAgICAobmFtZWx5IGlnbm9yZSB0aGUgZGVjbGFyYXRpb25zIGhhdmluZyAiT2xkIiBzdWZmaXgpLgoKICAgICAgICAgICAgIm5vdHJlZ2V4bWF0Y2giIHJlc3RyaWN0cyB0aGUgbWF0Y2ggdG8gb25seSB0aGUgZGVjbGFyYXRpb25zIHdoaWNoCiAgICAgICAgICAgIGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uLCBlLmcuIGhlcmUgaXMgaG93IHRvIHJlbmFtZSB0bwogICAgICAgICAgICBsb3dlciBjYXNlIHZlcnNpb25zIGFsbCBkZWNsYXJhdGlvbnMgZXhjZXB0IHRob3NlIGNvbnNpc3RpbmcgZnJvbQogICAgICAgICAgICBjYXBpdGFsIGxldHRlcnMgb25seToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkKGxvd2VyY2FzZSlzIiwgbm90cmVnZXhtYXRjaCRuYW1lPSJeW0EtWl0rJCIpICIiOwoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgdGhlIG5ldyAicmVnZXgiIGVuY29kZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiAlcmVuYW1lLCBlLmcuCgogICAgICAgICAgICAgICAgJXJlbmFtZSgicmVnZXg6LyhcXHcrKV8oLiopL1xcMi8iKSAiIjsKCiAgICAgICAgICAgIHRvIHJlbW92ZSBhbnkgYWxwaGFiZXRpY2FsIHByZWZpeCBmcm9tIGFsbCBpZGVudGlmaWVycy4gVGhlIHN5bnRheAogICAgICAgICAgICBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpcyBQZXJsLWxpa2UgYW5kIFBDUkUgbGlicmFyeQogICAgICAgICAgICAoaHR0cDovL3d3dy5wY3JlLm9yZy8pIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgZmVhdHVyZSBidXQgbm90aWNlCiAgICAgICAgICAgIHRoYXQgYmFja3NsYXNoZXMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHVzdWFsIGluc2lkZSBDIHN0cmluZ3MuCgogICAgICAgICAgICBPcmlnaW5hbCBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMTAtMDctMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzAyNDg3NSAtIHNoYXJlZF9wdHIgb2YgY2xhc3NlcyB3aXRoIG5vbi1wdWJsaWMgZGVzdHJ1Y3RvcnMuIFRoaXMgYWxzbyBmaXhlcwogICAgICAgICAgICB0aGUgInVucmVmIiBmZWF0dXJlIHdoZW4gdXNlZCBvbiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4KCjIwMTAtMDYtMTc6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gQWRkIHRoZSBHbyBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTA2LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggU1dJR19sdWFfaXNuaWxzdHJpbmcgbXVsdGlwbHkgZGVmaW5lZCB3aGVuIHVzaW5nIG11bHRpcGxlCiAgICAgICAgICAgIG1vZHVsZXMgYW5kIHdyYXBwaW5nIHN0cmluZ3MuIFBhdGNoIGZyb20gJ051bWJlciBDcnVuY2hlcicuCgoyMDEwLTA2LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9ycyB0byBjb3JyZWN0bHkgY2FsbCBhIG1ldGhvZCB3aXRoIGhhcyBhCgkgICAgZGlmZmVyZW50IG5hbWUgaW4gUEhQIHRvIEMrKyAod2Ugd2VyZSBhbHdheXMgdXNpbmcgdGhlIEMrKyBuYW1lCgkgICAgaW4gdGhpcyBjYXNlKS4KCjIwMTAtMDYtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1bmNvbXBpbGFibGUgY29kZSB3aGVuICVyZW5hbWUgcmVzdWx0cyBpbiB0d28gZW51bSBpdGVtcwogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgpWZXJzaW9uIDIuMC4wICgyIEp1bmUgMjAxMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEwLTA2LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQgbWFjcm8gdXNlZCBpbiBzdGQ6OnZlY3RvciB0byB3b3JrIHdpdGgKICAgICAgICAgICAgdHlwZXMgY29udGFpbmluZyBjb21tYXMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQoc3RkOjpwYWlyPCBkb3VibGUsIHN0ZDo6c3RyaW5nID4pCgoyMDEwLTA2LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gc3RkX3NoYXJlZF9wdHIuaSBmb3Igd3JhcHBpbmcgc3RkOjpzaGFyZWRfcHRyLiBSZXF1aXJlcyB0aGUgJXNoYXJlZF9wdHIKICAgICAgICAgICAgbWFjcm8gbGlrZSBpbiB0aGUgYm9vc3Rfc2hhcmVkX3B0ci5pIGxpYnJhcnkuIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlCiAgICAgICAgICAgIHdyYXBwZWQgaWYgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZWZpbmVkOgoKICAgICAgICAgICAgICAjZGVmaW5lIFNXSUdfU0hBUkVEX1BUUl9TVUJOQU1FU1BBQ0UgdHIxCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9zaGFyZWRfcHRyLmk+CgogICAgICAgICAgICBzaGFyZWRfcHRyIGlzIGFsc28gZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwgbm93LgoKMjAxMC0wNS0yNzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IGZvciAkdHlwZW1hcCBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcyB0byBjYWxsIG90aGVyICR0eXBlbWFwCiAgICAgICAgICAgIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBDQyAiQ0MiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBCQiAiJHR5cGVtYXAoY3N0eXBlLCBDQykiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBBQSAiJHR5cGVtYXAoY3N0eXBlLCBCQikiCiAgICAgICAgICAgICAgdm9pZCBoYWgoQUEgYWEpOwoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIEMjIHN0ZDo6dmVjdG9yIGNvbnRhaW5lcnMgb2Ygc2hhcmVkX3B0ciBhbmQgJXNoYXJlZF9wdHIuCgogICAgICAgICAgICBBbHNvIGFkZGVkIGRpYWdub3N0aWNzIGZvciAkdHlwZW1hcCB3aXRoIC1kZWJ1Zy10bXNlYXJjaCwgZm9yIGV4YW1wbGUsIHRoZQogICAgICAgICAgICBhYm92ZSBkaXNwbGF5cyBhZGRpdGlvbmFsIGRpYWdub3N0aWMgbGluZXMgc3RhcnRpbmcgIkNvbnRhaW5pbmc6ICI6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozNDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEFBCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIEJCKQogICAgICAgICAgICAgIGV4YW1wbGUuaTozMTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBCQgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEJCCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBCQgogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBDQykKICAgICAgICAgICAgICBleGFtcGxlLmk6Mjk6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQ0MKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBDQwogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQ0MKCjIwMTAtMDUtMjY6IG9sbHkKCSAgICBGaXggJWF0dHJpYnV0ZTJyZWYgbm90IHRvIHByb2R1Y2UgYSBzeW50YXggZXJyb3IgaWYgdGhlIGxhc3QKCSAgICBhcmd1bWVudCAoQWNjZXNzb3JNZXRob2QpIGlzIG9taXR0ZWQuICBQYXRjaCBmcm9tIERhdmlkIFBpZXBncmFzCgkgICAgaW4gU0YjMjIzNTc1Ni4KCjIwMTAtMDUtMjY6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHVzaW5nICV0aHJvd3Mgb3IgJWNhdGNoZXMsIFNXSUctZ2VuZXJhdGVkIFBIUDUgd3JhcHBlcnMKCSAgICBub3cgdGhyb3cgUEhQIEV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgZ2l2aW5nIGEgUEhQIGVycm9yIG9mCgkgICAgdHlwZSBFX0VSUk9SLgoKCSAgICBUaGlzIGNoYW5nZSBzaG91bGRuJ3QgY2F1c2UgaW5jb21wYXRpYmlsaXR5IGlzc3Vlcywgc2luY2UgeW91IGNhbid0CgkgICAgc2V0IGFuIGVycm9yIGhhbmRsZXIgZm9yIEVfRVJST1IsIHNvIHByZXZpb3VzbHkgUEhQIHdvdWxkIGp1c3QgZXhpdAoJICAgIHdoaWNoIGFsc28gaGFwcGVucyBmb3IgdW5oYW5kbGVkIGV4Y2VwdGlvbnMuICBUaGUgYmVuZWZpdCBpcyB5b3UgY2FuCgkgICAgbm93IGNhdGNoIHRoZW0gaWYgeW91IHdhbnQgdG8uCgoJICAgIEZpeGVzIFNGIzI1NDU1NzggYW5kIFNGIzI5NTU1MjIuCgoyMDEwLTA1LTI1OiBvbGx5CgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgZGlyZWN0b3JpbiB0eXBlbWFwIGZvciBjb25zdCBzdGQ6OnN0cmluZyAmLgoJICAgIEZpeGVzIFNGIzMwMDY0MDQgcmVwb3J0ZWQgYnkgdC1MZWdpYXcuCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMjk1NzM3NSAtIFNXSUdTdHJpbmdIZWxwZXIgYW5kIFNXSUdFeGNlcHRpb25IZWxwZXIgbm90IGFsd2F5cyBiZWluZwogICAgICAgICAgICBpbml0aWFsaXplZCBiZWZvcmUgdXNlIGluIC5ORVQgNCBhcyB0aGUgY2xhc3NlcyB3ZXJlIG5vdCBtYXJrZWQgYmVmb3JlZmllbGRpbml0LgogICAgICAgICAgICBBIHN0YXRpYyBjb25zdHJ1Y3RvciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXByYWdtYShjc2hhcnApIGltY2xhc3Njb2RlPSV7CiAgICAgICAgICAgICAgICBzdGF0aWMgJGltY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBJZiB5b3UgaGFkIGFkZGVkIHlvdXIgb3duIGN1c3RvbSBzdGF0aWMgY29uc3RydWN0b3IgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBpbgogICAgICAgICAgICB0aGUgc2FtZSB3YXkgYXMgYWJvdmUsIHlvdSB3aWxsIGhhdmUgdG8gbW9kaWZ5IHlvdXIgYXBwcm9hY2ggdG8gdXNlIHN0YXRpYyB2YXJpYWJsZQogICAgICAgICAgICBpbml0aWFsaXphdGlvbiBvciBkZWZpbmUgU1dJR19DU0hBUlBfTk9fSU1DTEFTU19TVEFUSUNfQ09OU1RSVUNUT1IgLSBTZWUgY3NoYXJwaGVhZC5zd2cuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDA4MjMyLiBJbXByb3ZlIHNoYXJlZF9wdHIgYW5kIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMgZm9yIGNsYXNzZXMgaW4gYW4KICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBObyBzcGVjaWFsIHRyZWF0bWVudCBpcyBuZWVkZWQgZm9yIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgVGhlIHByb3h5IGNsYXNzIGFsc28gbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgaXQgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgICBkZWR1Y2VkLiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJXNoYXJlZF9wdHIoVFlQRSkKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBpbnRydXNpdmVfcHRyIHdyYXBwZXJzLCB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19JTlRSVVNJVkVfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19JTlRSVVNJVkVfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVpbnRydXNpdmVfcHRyKFRZUEUpCgoyMDEwLTA1LTIxOiBvbGx5CgkgICAgW1BIUF0gU3RvcCBnZW5lcmF0aW5nIGEgYm9ndXMgbGluZSBvZiBjb2RlIGluIGNlcnRhaW4gY29uc3RydWN0b3JzLgoJICAgIFRoaXMgd2FzIG1vc3RseSBoYXJtbGVzcywgYnV0IGNhdXNlZCBhIFBIUCBub3RpY2UgdG8gYmUgaXNzdWVkLCBpZgoJICAgIGVuYWJsZWQgKFNGIzI5ODU2ODQpLgoKMjAxMC0wNS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjIwMTAtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBDKysgZW51bSBib29sZWFuIHZhbHVlcyByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmY6CiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtIHsgUExBWSA9IHRydWUsIFNUT1AgPSBmYWxzZSB9IHBsYXlfc3RhdGU7CgoyMDEwLTA1LTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggd2FzIHByb2R1Y2luZwoJICAgIHVuY29tcGlsYWJsZSBjb2RlIGluIHNvbWUgY2FzZXMuCgoyMDEwLTA1LTEyOiBkcmpvZQoJICAgIFtSXSBBZGQgdHdvIG1vcmUgY2hhbmdlcyBmcm9tIFdpbCBOb2xhbi4gIEdldCBnYXJiYWdlCgkgICAgY29sbGVjdGlvbiB0byB3b3JrLiAgSW1wbGVtZW50IG5ld2ZyZWUKCjIwMTAtMDUtMDk6IGRyam9lCiAgICAgICAgICAgIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsIE5vbGFuIGNoYW5nZSBjcmVhdGlvbiBvZiBzdHJpbmcgc28KICAgICAgICAgICAgdGhhdCBSIDIuNy4wKyBjYW4gdXNlIGNoYXIgaGFzaGVzCgoyMDEwLTA1LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMjk1NTE0NiBmcm9tIFNlcmdleSBTYXRza2l5IHRvIGZpeCBleHByZXNzaW9ucyBjb250YWluaW5nIGRpdmlkZSBieQogICAgICAgICAgICBvcGVyYXRvciBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0cy4KCjIwMTAtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBNZW1vcnkgbGVhayBmaXggaGFuZGxpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBpbnB1dHMsIHJlcG9ydGVkIGJ5IFdpbGwgTm9sYW4uCgoyMDEwLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIG1hdGNoaW5nIGVuaGFuY2VtZW50IGZvciBub24tZGVmYXVsdCB0eXBlbWFwcy4gUHJldmlvdXNseSBhbGwKICAgICAgICAgICAgcXVhbGlmaWVycyB3ZXJlIHN0cmlwcGVkIGluIG9uZSBzdGVwLCBub3cgdGhleSBhcmUgc3RyaXBwZWQgb25lIGF0IGEgdGltZQogICAgICAgICAgICBzdGFydGluZyB3aXRoIHRoZSBsZWZ0IG1vc3QgcXVhbGlmaWVyLiBGb3IgZXhhbXBsZSwgaW50IGNvbnN0KmNvbnN0IAogICAgICAgICAgICBpcyBmaXJzdCBzdHJpcHBlZCB0byBpbnQgKmNvbnN0IHRoZW4gaW50ICouCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNC0yNTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk4NTY1NSAtIGJyb2tlbiBjb25zdHJ1Y3RvciByZW5hbWluZy4KCjIwMTAtMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgZnJhZ21lbnRzIGFyZSBub3cgb2ZmaWNpYWwgYW5kIGRvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzIwNDgwNjQgYW5kICMyNDA4MDIwLgogICAgICAgICAgICBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IFJ1YnkgYW5kIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHdpdGggLW1pbmhlcml0LgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvNTIyODc0CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpzY2hlbWVdIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggc3RkOjptYXAgd3JhcHBlcnM6CiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy8yMDM4NzYKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMyOTUyMzc0IC0gZml4IGRpcmVjdG9ycyBhbmQgdGhlIC1ub3J0dGkgb3B0aW9uLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ICMyODg3MjU0IGFuZCAjMjk0NjAzMiAtIFNXSUdfTHVhX3R5cGVuYW1lIHVzaW5nIHdyb25nIHN0YWNrIGluZGV4LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIHdpdGggdGhlIC10aHJlYWRzIG9wdGlvbiBiYXNlZCBvbiBwYXRjaCBmcm9tIEFydG8gVnVvcmkuCiAgICAgICAgICAgIEZpeGVzIGJ1ZyAjMjgxODQ5OS4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBNYWtlZmlsZSB0YXJnZXRzOiBkaXN0Y2xlYW4gYW5kIG1haW50YWluZXItY2xlYW4KCjIwMTAtMDQtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBjaGFyIHBvaW50ZXJzLCB3Y2hhcl90IHBvaW50ZXJzIGFuZCBjaGFyIGFycmF5cyBzbyB0aGF0IG5pbCBjYW4gYmUgcGFzc2VkIGFzIGEKICAgICAgICAgICAgdmFsaWQgdmFsdWUuIEJ1ZyByZXBvcnRlZCBieSBHZWRhbGlhIFBhc3Rlcm5hay4KCjIwMTAtMDQtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIE51bWVyb3VzIHN1YnRsZSB0eXBlbWFwIG1hdGNoaW5nIHJ1bGUgZml4ZXMgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCB0eXBlLiBUaGUgdHlwZW1hcAogICAgICAgICAgICBtYXRjaGluZyBydWxlcyBhcmUgdG8gdGFrZSBhIHR5cGUgYW5kIGZpbmQgdGhlIGJlc3QgZGVmYXVsdCB0eXBlbWFwIChTV0lHVFlQRSwgU1dJR1RZUEUqIGV0YyksCiAgICAgICAgICAgIHRoZW4gbG9vayBmb3IgdGhlIG5leHQgYmVzdCBtYXRjaCBieSByZWR1Y2luZyB0aGUgY2hvc2VuIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIG5vdyBmb2xsb3dzIEMrKyBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG1hdGNoaW5nIHJ1bGVzLgoKICAgICAgICAgICAgQmVsb3cgYXJlIHRoZSBzZXQgb2YgY2hhbmdlcyBtYWRlIHNob3dpbmcgdGhlIGRlZmF1bHQgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgYWxvbmcgd2l0aCB0aGUgb2xkIHJlZHVjZWQgdHlwZSBhbmQgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSByZWR1Y2VkIHR5cGU6CgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgJltBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgmKVtBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0ICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QgJgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKiYKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgKgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgKgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKioKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKiYKCiAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYSBjb25zdCBTV0lHVFlQRSBsb29rdXAgaXMgdXNlZCBub3cgZm9yIGFueSBjb25zdGFudCB0eXBlLiBTb21lIGV4YW1wbGVzLCB3aGVyZQogICAgICAgICAgICBUIGlzIHNvbWUgcmVkdWNlZCB0eXBlLCBlZyBpbnQsIHN0cnVjdCBGb286CgogICAgICAgICAgICAgICAgICAgVCBjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAqY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3RbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3RbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEVbXQoKICAgICAgICAgICAgICAgICAgIGVudW0gVCBjb25zdAogICAgICAgICAgICAgIG5ldzogZW51bSBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogZW51bSBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKCpjb25zdCApW10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoKilbXQoKICAgICAgICAgICAgUmVtaW5kZXI6IHRoZSB0eXBlbWFwIG1hdGNoaW5nIHJ1bGVzIGNhbiBub3cgYmUgc2VlbiBmb3IgYW55IHR5cGVzIGJlaW5nIHdyYXBwZWQgYnkgdXNpbmcKICAgICAgICAgICAgZWl0aGVyIHRoZSAtZGVidWctdG1zZWFyY2ggb3IgLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKICAgICAgICAgICAgSW4gcHJhY3RpY2UgdGhpcyBsZWFkcyB0byBzb21lIHN1YnRsZSBtYXRjaGluZyBydWxlIGNoYW5nZXMgYW5kIHRoZSBtYWpvcml0eSBvZiB1c2VycwogICAgICAgICAgICB3b24ndCBub3RpY2UgYW55IGNoYW5nZXMsIGV4Y2VwdCBpbiB0aGUgcHJpbWUgYXJlYSBvZiBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZTogSW1wcm92ZQogICAgICAgICAgICBTVEwgY29udGFpbmVycyBvZiBjb25zdCBwb2ludGVycyBhbmQgcGFzc2luZyBjb25zdCBwb2ludGVycyBieSByZWZlcmVuY2UuIFRoaXMgaXMgZml4ZWQKICAgICAgICAgICAgYmVjYXVzZSBtYW55IG9mIHRoZSBTVEwgY29udGFpbmVycyB1c2UgYSB0eXBlICdUIGNvbnN0JicgYXMgcGFyYW1ldGVycyBhbmQgd2hlbiBUIGlzIAogICAgICAgICAgICBhIGNvbnN0IHBvaW50ZXIsIGZvciBleGFtcGxlLCAnSyBjb25zdConLCB0aGVuIHRoZSBmdWxsIHR5cGUgaXMgJ0sgY29uc3QqY29uc3QmJy4gVGhpcwogICAgICAgICAgICBtZWFucyB0aGF0IHRoZSAnU1dJR1RZUEUgKmNvbnN0JicgdHlwZW1hcHMgbm93IG1hdGNoIHdoZW4gVCBpcyBlaXRoZXIgYSBub24tY29uc3Qgb3IKICAgICAgICAgICAgY29uc3QgcG9pbnRlci4gRnVydGhlcm1vcmUsIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyBpbmNvcnJlY3RseSBoYWQgJ1NXSUdUWVBFIComJyB0eXBlbWFwcwogICAgICAgICAgICB3aGVuIHRoZXNlIHNob3VsZCBoYXZlIGJlZW4gJ1NXSUdUWVBFICpjb25zdCYnLiBUaGVzZSBoYXZlIGJlZW4gY29ycmVjdGVkIChKYXZhLCBDIywgTHVhLCBQSFApLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTb21lIHZlcnkgb2xkIGRlcHJlY2F0ZWQgcHJhZ21hIHdhcm5pbmdzIGFyZSBub3cgZXJyb3JzLgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgSW1wcm92ZSBoYW5kbGluZyBvZiBmaWxlIG5hbWVzIGFuZCBkaXJlY3RvcmllcyBjb250YWluaW5nIGRvdWJsZS9tdWx0aXBsZSBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAzLTEwOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gVXNlIGZ1bGx5IHF1YWxpZmllZCBzeW1ib2wgbmFtZSBvZiBjbDo6aWRlbnRpdHkgaW4gZW1pdF9kZWZ1bigpLgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFRoZSBpbnRlcm1lZGlhcnkgSk5JIGNsYXNzIG1vZGlmaWVycyBhcmUgbm93IHB1YmxpYyBieSBkZWZhdWx0IG1lYW5pbmcgdGhlc2UKICAgICAgICAgICAgaW50ZXJtZWRpYXJ5IGxvdyBsZXZlbCBmdW5jdGlvbnMgYXJlIG5vdyBhY2Nlc3NpYmxlIGJ5IGRlZmF1bHQgZnJvbSBvdXRzaWRlIGFueSBwYWNrYWdlCiAgICAgICAgICAgIHVzZWQuIFRoZSBwcm94eSBjbGFzcyBwb2ludGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYWxzbyBub3cgcHVibGljLgogICAgICAgICAgICBUaGVzZSBhcmUgbmVlZGVkIGluIG9yZGVyIGZvciB0aGUgbnNwYWNlIG9wdGlvbiB0byB3b3JrIHdpdGhvdXQgYW55IG90aGVyIG1vZHMuCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBkZWZhdWx0IG9mIHByb3RlY3RlZCBhY2Nlc3MgY2FuIGJlIHJlc3RvcmVkIHVzaW5nOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX01FVEhPRFMocHJvdGVjdGVkLCBwcm90ZWN0ZWQsIFNXSUdUWVBFKQogICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycyA9ICJjbGFzcyIKCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlIGZvciBDIy4gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIG5zcGFjZSBmZWF0dXJlIGlzIG5vdyBhdmFpbGFibGUuCgoyMDEwLTAzLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUuIFRoaXMgYWRkcyBzb21lIGltcHJvdmVkIG5hbWVzcGFjZSBzdXBwb3J0LiBDdXJyZW50bHkgb25seSBKYXZhCiAgICAgICAgICAgIGlzIHN1cHBvcnRlZCBmb3IgdGFyZ2V0IGxhbmd1YWdlcywgd2hlcmUgQysrIG5hbWVzcGFjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCBpbnRvCiAgICAgICAgICAgIEphdmEgcGFja2FnZXMuIFRoZSBmZWF0dXJlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzLHN0cnVjdCx1bmlvbnMgYW5kIGVudW1zIGRlY2xhcmVkIHdpdGhpbgogICAgICAgICAgICBhIG5hbWVzcGFjZS4gTWV0aG9kcyBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIGluIG5hbWVzcGFjZXMgc3RpbGwgZWZmZWN0aXZlbHkgaGF2ZSB0aGVpcgogICAgICAgICAgICBuYW1lc3BhY2VzIGZsYXR0ZW5lZC4gRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIxOjpDb2xvcjsKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjI6OkNvbG9yOwoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMSB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3IgSmF2YSwgdGhlIC1wYWNrYWdlIG9wdGlvbiBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIG5zcGFjZSBmZWF0dXJlLiBTYXkKICAgICAgICAgICAgd2UgdXNlIC1wYWNrYWdlIGNvbS5teWNvLCB0aGUgdHdvIGNsYXNzZXMgY2FuIHRoZW4gYmUgYWNjZXNzZWQgYXMgZm9sbG93cyBmcm9tIEphdmE6CgogICAgICAgICAgICAgIGNvbS5teWNvLk91dGVyLklubmVyMS5Db2xvciBhbmQgY29tLm15Y28uT3V0ZXIuSW5uZXIyLkNvbG9yLgoKMjAxMC0wMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIC1kaXJ2dGFibGUgZnJvbSB0aGUgb3B0aW1pemF0aW9ucyBpbmNsdWRlZCBieSAtTyBhcyBpdCB0aGlzIG9wdGlvbgogICAgICAgICAgICBjdXJyZW50bHkgbGVhZHMgdG8gbWVtb3J5IGxlYWtzIGFzIHJlcG9ydGVkIGJ5IEpvaGFuIEJsYWtlLgoKMjAxMC0wMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgTGljZW5zZSBjb2RlIGNoYW5nZXM6IFNXSUcgU291cmNlIGlzIEdQTC12MyBhbmQgbGlicmFyeSBjb2RlIGxpY2Vuc2UgaXMgbm93IGNsZWFyZXIKICAgICAgICAgICAgYW5kIGlzIHByb3ZpZGVkIHVuZGVyIGEgdmVyeSBwZXJtaXNzaXZlIGxpY2Vuc2UuIFNlZSBodHRwOi8vd3d3LnN3aWcub3JnL2xlZ2FsLmh0bWwuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQSBmZXcgZml4ZXMgZm9yIGNvbXBpbGluZyB1bmRlciBydWJ5LTEuOS54IGluY2x1ZGluZyBwYXRjaCBmcm9tICdOaWJibGUnLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIGZyb20gUGF0cmljayBCZW5uZXR0IHRvIGZpeCBSQVJSQVlfTEVOIGFuZCBSQVJSQVlfUFRSIHVzYWdlIGZvciBSdWJ5IDEuOS54CiAgICAgICAgICAgIHVzZWQgaW4gdmFyaW91cyBTVEwgd3JhcHBlcnMuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBpbmNvcnJlY3QgbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2wgbmFtZSBlcnJvciB3aGVuIGFuIGVudW0gaXRlbQogICAgICAgICAgICBhbmQgY2xhc3MgbmFtZSBoYXZlIHRoZSBzYW1lIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IE5hdGhhbiBLcmllZ2VyLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBWZWN0b3Ige307CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFRleHQgewogICAgICAgICAgICAgICAgZW51bSBQcmVmZXJlbmNlIHsgVmVjdG9yIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIG90aGVyIGluY29ycmVjdCBjb3JuZXIgY2FzZSB0YXJnZXQgbGFuZ3VhZ2Ugc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMTAtMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgLWRlYnVnLWxzeW1ib2xzIG9wdGlvbiBmb3IgZGlzcGxheWluZyB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxheWVyIHN5bWJvbHMuCgoyMDEwLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLU1NIGFuZCAtTU1EIG9wdGlvbnMgb24gV2luZG93cy4gVGhleSB3ZXJlIG5vdCBvbWl0dGluZyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5IGFzCiAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlLgoKMjAxMC0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxODA3MzI5IC0gV2hlbiBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCB1c2luZyB0aGUgLU0gZmFtaWx5IG9mIG9wdGlvbnMKICAgICAgICAgICAgb24gV2luZG93cywgdGhlIGZpbGUgcGF0aHMgaGF2ZSBiZWVuIGNvcnJlY3RlZCB0byB1c2Ugc2luZ2xlIGJhY2tzbGFzaGVzIHJhdGhlciB0aGFuIGRvdWJsZQogICAgICAgICAgICBiYWNrc2xhc2hlcyBhcyBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MTg5MDIgLSBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIGNvcnJlY3QgZGlyZWN0b3J5IG9uCiAgICAgICAgICAgIFdpbmRvd3Mgd2hlbiB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIC1vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWMrKyAtbyBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlX3dyYXAuY3BwIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2UuaQoKMjAxMC0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODk0NDA1IC0gYXNzZXJ0aW9uIHdoZW4gdXNpbmcgLXhtbG91dC4KCjIwMTAtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlbWFwIG1hdGNoaW5nIGJ1ZyB3aGVuIGEgdGVtcGxhdGVkIHR5cGUgaGFzIGEgdHlwZW1hcCBib3RoIHNwZWNpYWxpemVkIGFuZCBub3QKICAgICAgICAgICAgc3BlY2lhbGl6ZWQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWFggeyAuLi4gfTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFggJiAiLi4uIgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWDwgaW50ID4gJiAiLi4uIgoKICAgICAgICAgICAgcmVzdWx0ZWQgaW4gdGhlIDJuZCB0eXBlbWFwIGJlaW5nIGFwcGxpZWQgZm9yIGFsbCBUIGluIFhYPCBUID4uCgoyMDEwLTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MzMxMjkgLSB0eXBlbWFwcyBub3QgYmVpbmcgZm91bmQgd2hlbiB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBpcyB1c2VkIHRvIGRlbm90ZQogICAgICAgICAgICBnbG9iYWwgc2NvcGUsIHRoZSB0eXBlbWFwIGlzIG5vdyB1c2VkIGluIHNpdHVhdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IDo6WCAmKTsKCiAgICAgICAgICAgIGFuZCB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgOjpYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgWCAmKTsKCjIwMTAtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlIHByb2JsZW1zIGluIHRoZSB0eXBlcyBnZW5lcmF0ZWQKICAgICAgICAgICAgaW50byB0aGUgQysrIGxheWVyLiBQcmV2aW91c2x5IHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciB3YXMgZHJvcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgaWYgdGhlIHR5cGUgaGFkIGFueSBzb3J0IG9mIHF1YWxpZmllciwgZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBwb2ludGVycywgcmVmZXJlbmNlcywgbGlrZQogICAgICAgICAgICA6OmZvbyosIDo6Zm9vJiwgYmFyPCA6OmZvbyogPi4KCjIwMTAtMDEtMTM6IG9sbHkKCSAgICBbUEhQXSBBZGQgZGF0ZXRpbWUgdG8gdGhlIGxpc3Qgb2YgUEhQIHByZWRlZmluZWQgY2xhc3NlcyAocGF0Y2gKCSAgICBmcm9tIERhdmlkIEZsZXRjaGVyIGluIFNGIzI5MzEwNDIpLgoKMjAxMC0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB3YXJuaW5nLCBlcnJvciBhbmQgZGlhZ25vc3RpYyByZXBvcnRpbmcuIFRoZSB3YXJuaW5nIG51bWJlciBpcyBubyAKICAgICAgICAgICAgbG9uZ2VyIHNob3duIHdpdGhpbiBicmFja2V0cy4gVGhpcyBpcyB0byBoZWxwIGRlZmF1bHQgcGFyc2luZyBvZiB3YXJuaW5nIG1lc3NhZ2VzIGJ5CiAgICAgICAgICAgIG90aGVyIHRvb2xzLCB2aW0gb24gVW5peCBpbiBwYXJ0aWN1bGFyLgoKICAgICAgICAgICAgRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5IHVzaW5nIC1Gc3RhbmRhcmQ6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCgogICAgICAgICAgICBBbHNvIHN1YnRsZSBmaXggdG8gLUZtaWNyb3NvZnQgZm9ybWF0IGFkZGluZyBpbiBtaXNzaW5nIHNwYWNlLiBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKTogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApIDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYSBmZXcgaW5jb25zaXN0ZW5jaWVzIGluIHJlcG9ydGluZyBvZiBmaWxlL2xpbmUgbnVtYmVyaW5ncyBpbmNsdWRpbmcgbW9kaWZ5aW5nCiAgICAgICAgICAgIHRoZSBvdmVybG9hZCB3YXJuaW5ncyA1MDksIDUxMiwgNTE2LCA0NzQsIDQ3NSB0byBub3cgYmUgdHdvIGxpbmUgd2FybmluZ3MuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgLWRlYnVnLXRhZ3Mgb3V0cHV0IHRvIHVzZSBzdGFuZGFyZCBmaWxlIG5hbWUvbGluZSByZXBvcnRpbmcgc28gdGhhdCBlZGl0b3JzCiAgICAgICAgICAgIGNhbiBlYXNpbHkgbmF2aWdhdGUgdG8gdGhlIGFwcHJvcHJpYXRlIGxpbmVzLgogICAgICAgICAgICBXYXMgdHlwaWNhbGx5OgogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTIpCiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5KQogICAgICAgICAgICBub3c6CiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMjogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOTogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbWlzc2luZyBmaWxlL2xpbmUgbnVtYmVycyBmb3IgdHlwZW1hcCB3YXJuaW5ncyBhbmQgaW4gb3V0cHV0IGZyb20gdGhlCiAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoLy1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0eXBlbWFwcyB1c2VkIGRlYnVnZ2luZyBvcHRpb24gKC1kZWJ1Zy10bXVzZWQpLiBXaGVuIHVzZWQgZWFjaCBsaW5lIGRpc3BsYXlzCiAgICAgICAgICAgIHRoZSB0eXBlbWFwIHVzZWQgZm9yIGVhY2ggdHlwZSBmb3Igd2hpY2ggY29kZSBpcyBiZWluZyBnZW5lcmF0ZWQgaW5jbHVkaW5nIHRoZSBmaWxlCiAgICAgICAgICAgIGFuZCBsaW5lIG51bWJlciByZWxhdGVkIHRvIHRoZSB0eXBlLiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY29uZGVuc2VkIGZvcm0gb2YgdGhlCiAgICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24uIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWphdmFleGNlcHRpb24gYW5kIGRpcmVjdG9ycyBzbyB0aGF0IGFsbCB0aGUgYXBwcm9wcmlhdGUgdGhyb3dzIGNsYXVzZXMgCiAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQuIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGV0ZXIgR3JlZW53b29kLgoKMjAwOS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24gZm9yIGRlYnVnZ2luZyB0aGUgdHlwZW1hcCBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzLgogICAgICAgICAgICBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBSZW1vdmUgdGhlIC1hcGkgb3B0aW9uIGFuZCB1c2UgdGhlIG5ldyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSCiAgICAgICAgICAgIG1hY3JvIHByb3ZpZGVkIGluIHRoZSBvY3RhdmUgaGVhZGVycyBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwaSB2ZXJzaW9uIGluc3RlYWQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1J1YnldIEltcHJvdmUgc3VwcG9ydCBmb3IgUnVieSAxLjkgdW5kZXIgR0NDLiAgQWRkcmVzc2VzIHBhcnQgb2YKCSAgICBTRiMyODU5NjE0LgoKMjAwOS0xMi0wNDogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBtb2R1bG8gb3BlcmF0b3IgKCUpIGluIGNvbnN0YW50IGV4cHJlc3Npb25zCgkgICAgKFNGIzI4MTg1NjIpLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtQSFBdICJlbXB0eSIgaXMgYSByZXNlcnZlZCB3b3JkIGluIFBIUCwgc28gcmVuYW1lIGVtcHR5KCkgbWV0aG9kCgkgICAgb24gU1RMIGNsYXNzZXMgdG8gImlzX2VtcHR5KCkiIChwcmV2aW91c2x5IHRoaXMgd2FzIGF1dG9tYXRpY2FsbHkKCSAgICByZW5hbWVkIHRvICJjX2VtcHR5KCkiKS4KCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTItMDM6IG9sbHkKCSAgICBbUEhQXSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLCBhbmQgZm9yCgkgICAgcG9pbnRlciB0byBtZXRob2QuCgoyMDA5LTEyLTAyOiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmcgYW5kIHJlbmFtZSBvZiByZXNlcnZlZCBjbGFzcyBuYW1lIHRvIGJlIGNhc2UKCSAgICBpbnNlbnNpdGl2ZS4KCjIwMDktMTItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFJldmVydCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcyBhZGRlZCBpbiBzd2lnLTEuMy4zOS4gVGhlCgkgICAgbWVtYmVyaW4gdHlwZW1hcHMgYXJlIGlnbm9yZWQgYWdhaW4gZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBpbmNvbnNpc3RlbmN5IHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMDktMTEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGdlbmVyYXRlZCBxdW90aW5nIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3IgCiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQTsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBBOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIEEgPSAnQSc7IAogICAgICAgICAgICAgIH07CgoyMDA5LTExLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcyB0bwogICAgICAgICAgICB1c2UgdGhlIGFjdHVhbCBjb25zdGFudCB2YWx1ZSBpZiBpdCBpcyBzcGVjaWZpZWQsIHJhdGhlciB0aGFuIHRoZSBDKysgY29kZSB0bwogICAgICAgICAgICBhY2Nlc3MgdGhlIG1lbWJlci4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBFTjsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBFTjsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IEVOID0gMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yMzogd3NmdWx0b24KICAgICAgICAgICAgQysrIG5lc3RlZCB0eXBlZGVmIGNsYXNzZXMgY2FuIG5vdyBiZSBoYW5kbGVkIHRvbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIHsgfSBGb29UeXBlZGVmMSwgRm9vVHlwZWRlZjI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmb3IgQyBuZXN0ZWQgc3RydWN0cyBhcmUgbm93IGdlbmVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBkZWNsYXJlZCAKICAgICAgICAgICAgaW4gdGhlIHBhcnNlZCBjb2RlLgoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0OTE0NzYgLSBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIHN0cnVjdHMsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgfSBpbm5lcjEsIGlubmVyMiwgKmlubmVyMywgaW5uZXI0WzFdOwogICAgICAgICAgICAgIH0gb3V0ZXI7CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBlbnVtIGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gQUJDIHsKICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgYwogICAgICAgICAgICAgIH0gQSA9IGEsICpwQyA9ICZDLCBhcnJheVszXSA9IHthLCBiLCBjfTsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIHN0cnVjdCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUyB7CiAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgfSBpbnN0YW5jZSA9IHsgMTAgfTsKCjIwMDktMTEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk2MDk3NyAtIFN5bnRheCBlcnJvciBwYXJzaW5nIGRlcml2ZWQgbmVzdGVkIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBtZW1iZXIKICAgICAgICAgICAgdmFyaWFibGUgaW5zdGFuY2UuCgoyMDA5LTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIzMTA0ODMgLSBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWYgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDA5LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIHRlbXBsYXRlZCBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQuCgoyMDA5LTExLTEzOiBvbGx5CgkgICAgW3BocF0gRml4IHBsYWNlIHdoZXJlIGNsYXNzIHByZWZpeCAoYXMgc3BlY2lmaWVkIHdpdGggLXByZWZpeCkKCSAgICB3YXNuJ3QgYmVpbmcgdXNlZC4gIFBhdGNoIGZyb20gZ3ZlcmJydWdnZW4gaW4gU0YjMjg5MjY0Ny4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGFibGUgY29kZSBpcyBnZW5lcmF0ZWQgLSB0aGUgbmVzdGVkCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIGlzIG5vdyB0cmVhdGVkIGxpa2UgYSBub3JtYWwgbmVzdGVkIGNsYXNzZXMsIHRoYXQgaXMsIGFzIGFuIG9wYXF1ZSB0eXBlCiAgICAgICAgICAgIHVubGVzcyB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGlzIHVzZWQuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXBsYWNlIFNXSUdXQVJOX1BBUlNFX05FU1RFRF9DTEFTUyB3aXRoIFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUyBhbmQKICAgICAgICAgICAgU1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MgZm9yIG5hbWVkIGFuZCB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KCiAgICAgICAgICAgIE5hbWVkIG5lc3RlZCBjbGFzcyBpZ25vcmVkIHdhcm5pbmdzIGNhbiBub3cgYmUgc3VwcHJlc3NlZCBieSBuYW1lIHVzaW5nICV3YXJuZmlsdGVyLCBlZzoKCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTKSBPdXRlcjo6SW5uZXI7CgogICAgICAgICAgICBidXQgY2xlYXJseSB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIGNhbm5vdCBhbmQgdGhlIGdsb2JhbCBzdXBwcmVzc2lvbiBpcyBzdGlsbCByZXF1aXJlZCwgZWc6CgogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49U1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MKCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgYXMgYSB3YXkgdG8gdXNlIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgYSBuZXN0ZWQgY2xhc3MgCiAgICAgICAgICAgIChDKysgbW9kZSBvbmx5KS4gSXQgcmVtb3ZlcyB0aGUgbmVzdGVkIGNsYXNzIGZyb20gU1dJRydzIHR5cGUgaW5mb3JtYXRpb24gc28gaXQgaXMgYXMgaWYgU1dJRwogICAgICAgICAgICBoYWQgbmV2ZXIgcGFyc2VkIHRoZSBuZXN0ZWQgY2xhc3MuIFRoZSBkb2N1bWVudGVkIG5lc3RlZCBjbGFzcyB3b3JrYXJvdW5kcyB1c2luZyBhIGdsb2JhbAogICAgICAgICAgICBmYWtlIGNsYXNzIHN0b3BwZWQgd29ya2luZyB3aGVuIFNXSUcgdHJlYXRlZCB0aGUgbmVzdGVkIGNsYXNzIGFzIGFuIG9wYXF1ZSBwb2ludGVyLCBhbmQKICAgICAgICAgICAgdGhpcyBmZWF0dXJlIHJldmVydHMgdGhpcyBiZWhhdmlvdXIuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBkZXRhaWxzIG9mIGhvdwogICAgICAgICAgICB0byB1c2UgYW5kIGltcGxlbWVudCBpdCwgc2VlIHRoZSAiTmVzdGVkIGNsYXNzZXMiIHNlY3Rpb24gaW4gU1dJR1BsdXMuaHRtbC4KCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZXJlIHdlcmUgYSBudW1iZXIgb2YgQysrIGNhc2VzIHdoZXJlIG5lc3RlZCBjbGFzc2VzL3N0cnVjdHMvdW5pb25zIHdlcmUgYmVpbmcgaGFuZGxlZAogICAgICAgICAgICBhcyBpZiBDIGNvZGUgd2FzIGJlaW5nIHBhcnNlZCB3aGljaCB3b3VsZCBvZnRlbnRpbWVzIGxlYWQgdG8gdW5jb21waWxhYmxlIGNvZGUgYXMgYW4KICAgICAgICAgICAgYXR0ZW1wdCB3YXMgbWFkZSB0byB3cmFwIHRoZSBuZXN0ZWQgc3RydWN0cyBsaWtlIGl0IGlzIGRvY3VtZW50ZWQgZm9yIEMgY29kZS4gTm93IGFsbAogICAgICAgICAgICBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBhcmUgaWdub3JlZCBpbiBDKysgbW9kZSwgYXMgd2FzIGFsd2F5cyBkb2N1bWVudGVkLiBIb3dldmVyLAogICAgICAgICAgICB0aGVyZSBpcyBhbiBpbXByb3ZlbWVudCBhcyB1c2FnZSBvZiBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBpcyBub3cgYWx3YXlzIHRyZWF0ZWQKICAgICAgICAgICAgYXMgYW4gb3BhcXVlIHR5cGUgYnkgZGVmYXVsdCwgcmVzdWx0aW5nIGluIGdlbmVyYXRlZCBjb2RlIHRoYXQgc2hvdWxkIGFsd2F5cyBjb21waWxlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTExLTA5OiBkcmpvZQoJICAgIEZpeCBSIGZvciAtZmNvbXBhY3QgYW5kIGFkZCBzdGRfbWFwLmkKCjIwMDktMTEtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvbnNpc3RlbmN5IGZvciBuZXN0ZWQgc3RydWN0cy91bmlvbnMvY2xhc3Nlcy4gVW5jb21waWxhYmxlIGNvZGUgd2FzIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGlubmVyIHN0cnVjdCBhbmQgdW5pb24gZGVjbGFyYXRpb25zIHdlcmUgdXNlZCBhcyB0eXBlcyB3aXRoaW4gdGhlCiAgICAgICAgICAgIGlubmVyIHN0cnVjdC4gVGhlIGlubmVyIHN0cnVjdC91bmlvbiBpcyBub3cgdHJlYXRlZCBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gbWFraW5nIHRoZQogICAgICAgICAgICBiZWhhdmlvdXIgdGhlIHNhbWUgYXMgYW4gaW5uZXIgY2xhc3MuIChDKysgY29kZSksIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IElubmVyU3RydWN0IHsgaW50IHg7IH07CiAgICAgICAgICAgICAgICBJbm5lclN0cnVjdCogZ2V0SW5uZXJTdHJ1Y3QoKTsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0wODogd3NmdWx0b24KCSAgICBJZ25vcmVkIG5lc3RlZCBjbGFzcy9zdHJ1Y3Qgd2FybmluZ3Mgbm93IGRpc3BsYXkgdGhlIG5hbWUgb2YgdGhlIGlnbm9yZWQgY2xhc3Mvc3RydWN0LgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBCdWcgIzE1MTQ2ODEgLSBGaXggbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIGEgbmFtZXNwYWNlIGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKICAgICAgICAgICAgY29kZSBhbmQgaW50cm9kdWNlZCBzdHJhbmdlIHNpZGUgZWZmZWN0cyB0byBvdGhlciB3cmFwcGVyIGNvZGUgZXNwZWNpYWxseSBjb2RlCiAgICAgICAgICAgIGFmdGVyIHRoZSBuZXN0ZWQgdGVtcGxhdGUgY2xhc3MuIE5vdGUgdGhhdCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBhcmUgc3RpbGwgaWdub3JlZC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW10YWJzICAgIC0gRGlzcGxheSBzeW1ib2wgdGFibGVzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgLWRlYnVnLXN5bWJvbHMgICAgLSBEaXNwbGF5IHRhcmdldCBsYW5ndWFnZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCiAgICAgICAgICAgICAgLWRlYnVnLWNzeW1ib2xzICAgLSBEaXNwbGF5IEMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwoKMjAwOS0xMS0wMzogd3NmdWx0b24KCSAgICBGaXggc29tZSB1c2FnZSBvZiB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBQSB7IC8qIC4uLiAqLyB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6QUE7CgogICAgICAgICAgICBhbmQgYnVnICMxODE2ODAyIC0gU3dpZ1ZhbHVlV3JhcHBlciBzaG91bGQgYmUgdXNlZDoKCiAgICAgICAgICAgICAgc3RydWN0IENDIHsKICAgICAgICAgICAgICAgIENDKGludCk7IC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIDo6Q0MgeCgpOwoKICAgICAgICAgICAgYW5kIGluIHRlbXBsYXRlIHBhcmFtZXRlciBzcGVjaWFsaXphdGlvbnM6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHt9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IHZvaWQgYSgpIHt9IH07CiAgICAgICAgICAgICAgdGVtcGxhdGUgPD4gc3RydWN0IFg8Uz4geyB2b2lkIGIoKSB7fSB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShNeVRDb25jcmV0ZSkgWDwgOjpTID47CgogICAgICAgICAgICBwbHVzIHByb2JhYmx5IHNvbWUgb3RoZXIgY29ybmVyIGNhc2UgdXNhZ2Ugb2YgOjouCgoyMDA5LTExLTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHBvdGVudGlhbCBtZW1vcnkgbGVhayBpbiBpbml0aWFsaXNhdGlvbiBjb2RlIGZvciB0aGUKCSAgICBnZW5lcmF0ZWQgbW9kdWxlLgoKMjAwOS0xMC0yMzogd3NmdWx0b24KCSAgICBGaXggc2VnIGZhdWx0IHdoZW4gdXNpbmcgYSBuYW1lZCBuZXN0ZWQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB1c2luZyAldGVtcGxhdGUobmFtZSkgCiAgICAgICAgICAgIHdpdGhpbiBhIGNsYXNzLiBBIHdhcm5pbmcgdGhhdCB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZCBpcyBub3cgaXNzdWVkIHBsdXMgcHJvY2Vzc2luZyAKICAgICAgICAgICAgY29udGludWVzIGFzIGlmIG5vIG5hbWUgd2FzIGdpdmVuLgoKMjAwOS0xMC0yMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGaXggc3RkOjp2ZWN0b3I8Y29uc3QgVCo+LiBUaGlzIHdvdWxkIHByZXZpb3VzbHkgY29tcGlsZSwgYnV0IG5vdCBydW4gY29ycmVjdGx5LgoKMjAwOS0xMC0yMDogd3NmdWx0b24KCSAgICBGaXhlZCBwcmV2aW91c2x5IGZhaXJseSBwb29yIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYW5kIGV4cGxpY2l0IAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBzdXBwb3J0LiBOdW1lcm91cyBidWdzIGluIHRoaXMgYXJlYSBoYXZlIGJlZW4gZml4ZWQgaW5jbHVkaW5nOgoKICAgICAgICAgICAgLSBUZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gaW1wbGVtZW50ZWQgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzLCBlZyB0aGlzIG5vdwogICAgICAgICAgICAgIHdvcmtzOgogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWCAgICAgIHt9OwogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWDxUICo+IHt9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKFgxKSBYPGNvbnN0IGludCAqPjsgLy8gQ2hvb3NlcyBUICogc3BlY2lhbGl6YXRpb24KCiAgICAgICAgICAgICAgYW5kIG1vcmUgY29tcGxleCBjYXNlcyB3aXRoIG11bHRpcGxlIHBhcmFtZXRlcnMgYW5kIGEgbWl4IG9mIHRlbXBsYXRlIGFyZ3VtZW50CiAgICAgICAgICAgICAgZGVkdWN0aW9uIGFuZCBleHBsaWNpdGx5IHNwZWNpYWxpc2VkIHBhcmFtZXRlcnMsIGVnOgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IFR3b1Bhcm0gICAgICAgICAgICAgICB7IHZvaWQgYSgpIHt9IH07CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+ICAgICAgICAgICAgICBzdHJ1Y3QgVHdvUGFybTxUMSAqLCBpbnQgKj4gIHsgdm9pZCBlKCkge30gfTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShFKSBUd29QYXJtPGludCAqKiwgaW50ICo+OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBwcmltYXJ5IHRlbXBsYXRlIG11c3Qgbm93IGJlIGluIHNjb3BlLCBsaWtlIGluIEMrKywgd2hlbgogICAgICAgICAgICBhbiBleHBsaWNpdCBvciBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIGluc3RhbnRpYXRlZCB3aXRoICV0ZW1wbGF0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wOS0xNDogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAlY3NhdHRyaWJ1dGVzIGZvciBhZGRpbmcgQyMgYXR0cmlidXRlcyB0byBlbnVtIHZhbHVlcywgc2VlIGRvY3MgZm9yIGV4YW1wbGUuCgoyMDA5LTA5LTExOiB3c2Z1bHRvbgoJICAgIEZpeCBtZW1tb3ZlIHJlZ3Jlc3Npb24gaW4gY2RhdGEuaSBhcyByZXBvcnRlZCBieSBBZHJpYWFuIFJlbnRpbmcuCgoyMDA5LTA5LTA3OiB3c2Z1bHRvbgoJICAgIEZpeCBjb25zdGFudCBleHByZXNzaW9ucyBjb250YWluaW5nIDw9IG9yID49LgoKMjAwOS0wOS0wMjogd3NmdWx0b24KCSAgICBUaGUgZm9sbG93aW5nIG9wZXJhdG9ycyBpbiBjb25zdGFudCBleHByZXNzaW9ucyBub3cgcmVzdWx0IGluIHR5cGUgYm9vbCBmb3IgQysrIAogICAgICAgICAgICB3cmFwcGVycyBhbmQgcmVtYWluIGFzIHR5cGUgaW50IGZvciBDIHdyYXBwZXJzLCBhcyBwZXIgZWFjaCBzdGFuZGFyZDogCgogICAgICAgICAgICAgICYmIHx8ID09ICE9IDwgPiA8PSA+PSAoQWN0dWFsbHkgdGhlIGxhc3QgNCBhcmUgc3RpbGwgYnJva2VuKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICNkZWZpbmUgQSAxMAogICAgICAgICAgICAgICNkZWZpbmUgQiAxMAogICAgICAgICAgICAgICNkZWZpbmUgQV9FUV9CICBBID09IEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKICAgICAgICAgICAgICAjZGVmaW5lIEFfQU5EX0IgQSAmJiBCIC8vIG5vdyB3cmFwcGVkIGFzIHR5cGUgYm9vbCBmb3IgQysrCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjg0NTc0Ni4gdHJ1ZSBhbmQgZmFsc2UgYXJlIG5vdyByZWNvZ25pc2VkIGtleXdvcmRzIChvbmx5IHdoZW4gd3JhcHBpbmcgQysrKS4KICAgICAgICAgICAgQ29uc3RhbnRzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBhcmUgbm93IHdyYXBwZWQgKGFzIHR5cGUgYm9vbCk6CiAgICAgICAgICAgICAgI2RlZmluZSBGT08gdHJ1ZQogICAgICAgICAgICAgICNkZWZpbmUgQkFSIEZPTyAmJiBmYWxzZQoKVmVyc2lvbiAxLjMuNDAgKDE4IEF1Z3VzdCAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTA4LTE3OiBvbGx5CgkgICAgW1BlcmxdIEFkZCAiI3VuZGVmIGRvX2V4ZWMiIHRvIG91ciBjbGVhbiB1cCBvZiBQZXJsIGdsb2JhbAoJICAgIG5hbWVzcGFjZSBwb2xsdXRpb24uCgoyMDA5LTA4LTE3OiBvbGx5CgkgICAgW1BIUF0gRml4IHRvIHdyYXAgYSByZXNvdXJjZSByZXR1cm5lZCBieSBfX2dldCgpIGluIGEgUEhQIG9iamVjdCAoU0YjMjU0OTIxNykuCgoyMDA5LTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI3OTc0ODUgQWZ0ZXIgZG9pbmcgYSAnbWFrZSBjbGVhbicsIGluc3RhbGwgZmFpbHMgaWYgeW9kbDJtYW4gb3IgeW9kbDJodG1sIAogICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gQ2F1Z2h0IGV4Y2VwdGlvbnMgZGlzcGxheSB0aGUgdHlwZSBvZiB0aGUgQysrIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICBnZW5lcmljICJjKystc2lkZSB0aHJldyBhbiBleGNlcHRpb24iIG1lc3NhZ2UuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gV2hlbiAlY2F0Y2hlcyBpcyB1c2VkLCBmaXggc28gdGhhdCBhbnkgY2xhc3NlcyBzcGVjaWZpZWQgaW4gdGhlICJ0aHJvd3MiCiAgICAgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgInRocm93cyIgdHlwZW1hcCBhcmUgZ2VuZXJhdGVkIGludG8gdGhlIEphdmEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGV4Y2VwdGlvbiBoYW5kbGluZyB3aGVuICVjYXRjaGVzIGlzIHVzZWQsIHJlcG9ydGVkIGJ5IEp1YW4gTWFudWVsIEFsdmFyZXouCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXRlbXBsYXRlIHNlZyBmYXVsdCBvbiBzb21lIGNhc2VzIG9mIG92ZXJsb2FkaW5nIHRoZSB0ZW1wbGF0ZWQgbWV0aG9kLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSmFuIEt1cGVjLgoKMjAwOS0wOC0xNTogd3NmdWx0b24KCSAgICBbUnVieV0gQWRkIG51bWVyb3VzIG1pc3Npbmcgd3JhcHBlZCBtZXRob2RzIGZvciBzdGQ6OnZlY3Rvcjxib29sPiBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBhcyByZXBvcnRlZCBieSBZb3Vzc2VmIEpvbmVzLgoKMjAwOS0wOC0xNDogd3NmdWx0b24KCSAgICBbUGVybF0gQWRkIFNXSUdfQ29udmVydFB0ckFuZE93bigpIG1ldGhvZCBpbnRvIHRoZSBydW50aW1lIGZvciBzbWFydCBwb2ludGVyIAogICAgICAgICAgICBtZW1vcnkgb3duZXJzaGlwIGNvbnRyb2wuIHNoYXJlZF9wdHIgc3VwcG9ydCBzdGlsbCB0byBiZSBhZGRlZC4gUGF0Y2ggZnJvbSAKICAgICAgICAgICAgRGF2aWQgRmxldGNoZXIuCgoyMDA5LTA4LTE0OiBvbGx5CgkgICAgW1BIUF0gUEhQNSBub3cgd3JhcHMgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgYXMgZG9jdW1lbnRlZC4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIFBIUCAiY2xhc3MiIGV4YW1wbGUgdG8gd29yayB3aXRoIFBIUDUgYW5kIHVzZQoJICAgIG1vZGVybiB3cmFwcGluZyBmZWF0dXJlcy4KCjIwMDktMDgtMTM6IHdzZnVsdG9uCgkgICAgW1BIUF0gc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb3ZlcmhhdWwuIFRoZXkgbm8gbG9uZ2VyIHJlcXVpcmUgdGhlIAogICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF92ZWN0b3IoKSBtYWNyby4gQWRkZWQgd3JhcHBlcnMgZm9yIGNhcGFjaXR5KCkgYW5kIHJlc2VydmUoKS4KCjIwMDktMDgtMTM6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIGNvbnN0IHJlZmVyZW5jZSB0eXBlbWFwcy4gY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBhcmUKICAgICAgICAgICAgbm93IHBhc3NlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBwb2ludGVyIGxpa2UgdGhlIG90aGVyIHRhcmdldCBsYW5ndWFnZXMuCgkgICAgRml4ZXMgU0YjMjUyNDAyOS4KCjIwMDktMDgtMDg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gTW9yZSB1c2VyIGZyaWVuZGx5IEF0dHJpYnV0ZUVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZXJlIGFyZQogICAgICAgICAgICBubyBjb25zdHJ1Y3RvcnMgZ2VuZXJhdGVkIGZvciB0aGUgcHJveHkgY2xhc3MgaW4gdGhlIGV2ZW50IHRoYXQgdGhlCiAgICAgICAgICAgIGNsYXNzIGlzIGFic3RyYWN0IC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IAogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCAtIGNsYXNzIGlzIGFic3RyYWN0IiB3aGVyZWFzIGlmIHRoZXJlIGFyZSBubwogICAgICAgICAgICBwdWJsaWMgY29uc3RydWN0b3JzIGZvciBhbnkgb3RoZXIgcmVhc29uIGFuZCB0aGUgY2xhc3MgaXMgbm90IGFic3RyYWN0LAogICAgICAgICAgICB0aGUgbWVzc2FnZSByZW1haW5zCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIi4KICAgICAgICAgICAgW3RjbF0gU2ltaWxhcmx5IGZvciB0Y2wgd2hlbiB1c2luZyAtaXRjbC4KCjIwMDktMDgtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggZ2VuZXJhdGVkIGNvZGUgdG8gd29yayB3aXRoIFBIUCA1LjMuCgoyMDA5LTA4LTA0OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFZhcmlvdXMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyAod2hpY2ggd291bGQgY29uZmxpY3QKICAgICAgICAgICAgd2l0aCB0aGUgYnVpbHQtaW4gUEhQIG9uZXMpIGFyZSBub3cgYXV0b21hdGljYWxseSBoYW5kbGVkIGJ5CiAgICAgICAgICAgIGFkZGluZyBhICdjXycgcHJlZml4LgoKMjAwOS0wOC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgc3RkOjp2ZWN0b3I8VD4gaW1wbGVtZW50YXRpb24gaXMgaW1wcm92ZWQgYW5kIG5vdyB1c2VzICR0eXBlbWFwIHN1Y2gKICAgICAgICAgICAgdGhhdCB0aGUgcHJveHkgY2xhc3MgZm9yIFQgbm8gbG9uZ2VyIGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gc29tZSBtYWNyb3MKICAgICAgICAgICAgZm9yIGNvcnJlY3QgQyMgY29tcGlsYXRpb247IHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkLCB3aGVyZQogICAgICAgICAgICBDU1RZUEUgd2FzIHRoZSBDIyB0eXBlIGZvciB0aGUgQysrIGNsYXNzIENUWVBFOgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkVfTUlOSU1VTShDU1RZUEUsIENUWVBFKQogICAgICAgICAgICAgIHVzYWdlIHNob3VsZCBiZSByZW1vdmVkIGFsdG9nZXRoZXIKCiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9TUEVDSUFMSVpFKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGg6CiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChDVFlQRSkKCiAgICAgICAgICAgIFNvbWUgbW9yZSBkZXRhaWxzIGluIGNzaGFycC9zdGRfdmVjdG9yLmkKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wNy0zMTogb2xseQoJICAgIFtQeXRob25dIEZpeCBpbmRlbnRhdGlvbiBzbyB0aGF0IHdlIGdpdmUgYSB1c2VmdWwgZXJyb3IgaWYgdGhlCgkgICAgbW9kdWxlIGNhbid0IGJlIGxvYWRlZC4gIFBhdGNoIGZyb20gR2FldGFuIExlaG1hbm4gaW4gU0YjMjgyOTg1My4KCjIwMDktMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkdHlwZW1hcChtZXRob2QsIHR5cGVsaXN0KSBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvLiBUaGlzIGFsbG93cwogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgYSB0eXBlbWFwIHRvIGJlIGluc2VydGVkIHdpdGhpbiBhbm90aGVyIHR5cGVtYXAuCiAgICAgICAgICAgIEZ1bGx5IGRvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMDctMjk6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gU3RhdGljIG1lbWJlciB2YXJpYWJsZXMgYXJlIG5vdyBwcmVmaXhlZCB3aXRoIHRoZQogICAgICAgICAgICBjbGFzcyBuYW1lLiBUaGlzIGFsbG93cyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIHRoZQogICAgICAgICAgICBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IGNsYXNzZXMuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkIG1pc3NpbmcgbG9ja3MgdG8gc3RkOjptYXAgd3JhcHBlcnMuICBQYXRjaCBmcm9tIAoJICAgIFBhdWwgSGFtcHNvbiBpbiBTRiMyODEzODM2LgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBQSFAgT1VUUFVUIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgSGl0b3NoaQoJICAgIEFtYW5vIGluIFNGIzI4MjYzMjIuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCByZXNvdXJjZSBkZXN0cnVjdG9yIGZvciBjbGFzc2VzCgkgICAgd2l0aG91dCBhIGRlc3RydWN0b3IgYW5kIG5vbi1jbGFzcyB0eXBlcy4gIFBhdGNoIGZyb20gSGl0b3NoaSBBbWFubwoJICAgIGluIFNGIzI4MjUzMDMuCgoyMDA5LTA3LTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHdhcm5pbmdzIGFib3V0IGNsYXNoZXMgYmV0d2VlbiBpZGVudGlmaWVycyBhbmQgUEhQCgkgICAga2V5d29yZHMgYW5kIGF1dG9tYXRpYyByZW5hbWluZyB0byB3b3JrIHdpdGggdGhlIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVycy4gIEZpeGVzIFNGIzE2MTM2NzkuCgoyMDA5LTA3LTI4OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIElmIGEgbWVtYmVyIGZ1bmN0aW9uIGlzIG5vdCBwdWJsaWMgYnV0IGl0IGhhcyBhIGJhc2UKICAgICAgICAgICAgd2hpY2ggaXMgcHVibGljLCB0aGVuIG5vdyBhIHdhcm5pbmcgaXMgaXNzdWVkIGFuZCB0aGUgbWVtYmVyCiAgICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgYmUgcHVibGljLCBhcyBQSFAgcmVxdWlyZXMgdGhpcy4KCjIwMDktMDctMjE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZC4KCjIwMDktMDctMTU6IG9sbHkKCSAgICBbUGVybF0gRG9uJ3Qgc3BlY2lmeSBQZXJsIHByb3RvdHlwZSAiKCkiIGZvciBhIGNvbnN0cnVjdG9yIHdpdGggYQoJICAgIGRpZmZlcmVudCBuYW1lIHRvIHRoZSBjbGFzcywgYXMgc3VjaCBjb25zdHJ1Y3RvcnMgY2FuIHN0aWxsIHRha2UKCSAgICBwYXJhbWV0ZXJzLgoKMjAwOS0wNy0xMjogeGF2aWVyOTgKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3IgT2N0YXZlIDMuMiBBUEkKCjIwMDktMDctMDU6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIGxpc3Qgb2YgUEhQIGtleXdvcmRzIC0gImNmdW5jdGlvbiIgaXMgbm8gbG9uZ2VyIGEKCSAgICBrZXl3b3JkIGluIFBIUDUgYW5kIFBIUCA1LjMgYWRkZWQgImdvdG8iLCAibmFtZXNwYWNlIiwgIl9fRElSX18iLAoJICAgIGFuZCAiX19OQU1FU1BBQ0VfXyIuCgoyMDA5LTA3LTAzOiBvbGx5CgkgICAgW1RjbF0gVG8gY29tcGxlbWVudCBVU0VfVENMX1NUVUJTLCBhZGQgc3VwcG9ydCBmb3IgVVNFX1RLX1NUVUJTCgkgICAgYW5kIFNXSUdfVENMX1NUVUJTX1ZFUlNJT04uICBEb2N1bWVudCBhbGwgdGhyZWUgaW4gdGhlIFRjbCBjaGFwdGVyCgkgICAgb2YgdGhlIG1hbnVhbC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gU0YjMjgxMDM4MCBieSBDaHJpc3RpYW4KCSAgICBHb2xsd2l0emVyLgoKMjAwOS0wNy0wMjogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBBZGRlZCBmYWN0b3J5LmkgZm9yIFBIUCwgc2VlIHRoZSBsaV9mYWN0b3J5IHRlc3RjYXNlCiAgICAgICAgICAgIGZvciBtb3JlIGluZm8gb24gaG93IHRvIHVzZSBpdC4KCjIwMDktMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtV2FsbGt3IG9wdGlvbiBhcyByZXBvcnRlZCBieSBTb2xvbW9uIEdpYmJzLgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN5bnRheCBlcnJvciB3aGVuIGEgbmVzdGVkIHN0cnVjdCBjb250YWlucyBhIGNvbW1lbnQgY29udGFpbmluZyBhICogZm9sbG93ZWQgCiAgICAgICAgICAgIGV2ZW50dWFsbHkgYnkgYSAvLiBSZWdyZXNzaW9uIGZyb20gMS4zLjM3LCByZXBvcnRlZCBieSBTb2xvbW9uIEdpYmJzLgoKMjAwOS0wNy0wMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBVbmtub3duIHByb3BlcnRpZXMgYXJlIG5vIGxvbmdlciBpZ25vcmVkIGluIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEZpeGVkICVuZXdvYmplY3QgYmVoYXZpb3VyLCBwcmV2aW91c2x5IGFueSBtZXRob2QKICAgICAgICAgICAgbWFya2VkIHdpdGggJW5ld29iamVjdCB3YXMgaGFuZGxlZCBhcyBhIGNvbnN0cnVjdG9yLgoKMjAwOS0wNi0zMDogb2xseQoJICAgIFtSdWJ5XSBVbmRlZmluZSBjbG9zZSBhbmQgY29ubmVjdCBtYWNyb3MgZGVmaW5lZCBieSBSdWJ5IEFQSQoJICAgIGhlYWRlcnMgYXMgd2UgZG9uJ3QgbmVlZCB0aGVtIGFuZCB0aGV5IGNhbiBjbGFzaCB3aXRoIEMrKyBtZXRob2RzCgkgICAgYmVpbmcgd3JhcHBlZC4gIFBhdGNoIGZyb20gVml0IE9uZHJ1Y2ggaW4gU0YjMjgxNDQzMC4KCjIwMDktMDYtMjY6IG9sbHkKCSAgICBbUnVieV0gRml4IHRvIGhhbmRsZSBGSVhOVU0gdmFsdWVzIGdyZWF0ZXIgdGhhbiBNQVhJTlQgcGFzc2VkIGZvciBhCgkgICAgZG91YmxlIHBhcmFtZXRlci4KCjIwMDktMDYtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHRoZSBjb21wYWN0ZGVmYXVsdGFyZ3MgZmVhdHVyZSAKICAgICAgICAgICAgd2hlcmUgYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYW5kIGlzIGFzc2lnbmVkIGEgZGVmYXVsdCB2YWx1ZS4gVGhlIFN3aWdWYWx1ZVdyYXBwZXIKICAgICAgICAgICAgdGVtcGxhdGUgd29ya2Fyb3VuZCBmb3IgYSBtaXNzaW5nIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgCiAgICAgICAgICAgIGdlbmVyYXRlZCBkb2VzIG5vdCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgoKMjAwOS0wNi0xNjogd3NmdWx0b24KCSAgICBbSmF2YSxDI10gRml4IGVudW0gbWFyc2hhbGxpbmcgd2hlbiAlaWdub3JlIGlzIHVzZWQgb24gb25lIG9mIHRoZSBlbnVtIGl0ZW1zLgogICAgICAgICAgICBJbmNvcnJlY3QgZW51bSB2YWx1ZXMgd2VyZSBiZWluZyBwYXNzZWQgdG8gdGhlIEMrKyBsYXllciBvciBjb21waWxhdGlvbiBlcnJvcnMgcmVzdWx0ZWQuCgoyMDA5LTA2LTAyOiB0YWxieQoJICAgIFtQZXJsXSBSZXNvbHZlZCByZWZlcmVuY2UuaSBvdmVybG9hZCBzdXBwb3J0IHByb2JsZW0KCSAgICBpZGVudGlmaWVkIGJ5IEpvaG4gUG90b3dza3kuCgoyMDA5LTA1LTI2OiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjptYXAgd3JhcHBlcnMgYmFzZWQgb24gcGF0Y2ggZnJvbSBZdXZhbCBCYXJvci4gVGhlIEMjIHByb3h5CiAgICAgICAgICAgIG5vdyBpbXBsZW1lbnRzIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklEaWN0aW9uYXJ5PD4uCgoJICAgIFRoZXNlIHN0ZDptYXAgd3JhcHBlcnMgaGF2ZSBhIG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBvdmVyaGF1bCB0byBtYWtlIHRoZW0KICAgICAgICAgICAgbGlrZSBhIC5ORVQgSURpY3Rpb25hcnkuIFNvbWUgbWV0aG9kIG5hbWVzIGhhdmUgY2hhbmdlZCBhcyBmb2xsb3dpbmc6CiAgICAgICAgICAgICAgc2V0IC0+IHNldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGdldCAtPiBnZXRpdGVtICh1c2UgdGhpc1tdIHByb3BlcnR5IG5vdykKICAgICAgICAgICAgICBoYXNfa2V5IC0+IENvbnRhaW5zS2V5CiAgICAgICAgICAgICAgZGVsIC0+IFJlbW92ZQogICAgICAgICAgICAgIGNsZWFyIC0+IENsZWFyCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyB1c2VkIGZvciBzdGQ6Om1hcCB3cmFwcGVycyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBubyBsb25nZXIgd29yazoKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fa2V5CiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX3ZhbHVlCiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2JvdGgKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wNS0yMDogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBBZGQgdGhlICd0aGlzb3duJyBtZW1iZXIgdG8gY2xhc3Nlcy4gVGhlIHVzYWdlIG9mIGl0CiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBQeXRob24gdGhpc293biBvbmU6IGl0J3MgMSBieSBkZWZhdWx0IGFuZAogICAgICAgICAgICB5b3UgY2FuIHNldCBpdCB0byAwIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgZnJlZWluZyBpdC4gKEZvcgogICAgICAgICAgICBleGFtcGxlIHRvIHByZXZlbnQgYSBkb3VibGUgZnJlZS4pCgoyMDA5LTA1LTE0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSB3cm9uZyBwb2ludGVyIHZhbHVlIHJldHVybmVkIGJ5IFN3aWdQeU9iamVjdF9yZXByKCkuCgoyMDA5LTA1LTEzOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTWlub3IgdHdlYWsgd2hlbiB3cmFwcGluZyBpbiAtbm9jd3JhcCBtb2RlLgoKMjAwOS0wNS0xMTogd3NmdWx0b24KCSAgICBbQyNdIEltcHJvdmVkIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9uIHRoZSBDIyBwcm94eSBzaWRlIGZyb20gWXV2YWwgQmFyb3IuIFRoZXNlCgkgICAgaW1wbGVtZW50IElMaXN0PD4gaW5zdGVhZCBvZiBJRW51bWVyYWJsZTw+IHdoZXJlIHBvc3NpYmxlLgoKMjAwOS0wNC0yOTogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEFkZCB0aGUgJ25vdGRlcml2ZWQnIGF0dHJpYnV0ZSB0byB0aGUgamF2YWJhc2UgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCSAgICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgdGhlIHR5cGVtYXAgd2lsbCBub3QgYXBwbHkgdG8gY2xhc3NlcyB0aGF0IGFyZSBkZXJpdmVkCgkgICAgZnJvbSBhIEMrKyBiYXNlIGNsYXNzLCBlZyAKCSAgICAgICV0eXBlbWFwKGNzYmFzZSwgbm90ZGVyaXZlZD0iMSIpIFNXSUdUWVBFICJDb21tb25CYXNlIgoKMjAwOS0wNC0yOTogb2xseQoJICAgIFtQeXRob25dIERvbid0IGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgR0lMIGluIHNpdHVhdGlvbnMgd2hlcmUgd2UKCSAgICBrbm93IHRoYXQgaXQgd2lsbCBhbHJlYWR5IGJlIGxvY2tlZC4gIFRoaXMgYXZvaWRzIHNvbWUgZGVhZC1sb2NrcwoJICAgIHdpdGggbW9kX3B5dGhvbiAoZHVlIHRvIG1vZF9weXRob24gYnVncyB3aGljaCBhcmUgYXBwYXJlbnRseQoJICAgIHVubGlrZWx5IHRvIGV2ZXIgYmUgZml4ZWQpLCBhbmQgcmVzdWx0cyBpbiBzbWFsbGVyIHdyYXBwZXJzIHdoaWNoCgkgICAgcnVuIGEgbGl0dGxlIGZhc3RlciAoaW4gdGVzdHMgd2l0aCBYYXBpYW4gb24geDg2LTY0IFVidW50dSA5LjA0LAoJICAgIHRoZSBzdHJpcHBlZCB3cmFwcGVyIGxpYnJhcnkgd2FzIDExJSBzbWFsbGVyIGFuZCByYW4gMi43JSBmYXN0ZXIpLgoKMjAwOS0wNC0yMTogd3NmdWx0b24KCSAgICBbQyNdIEZpeCAjMjc1MzQ2OSAtIGJvb2wgJk9VVFBVVCBhbmQgYm9vbCAqT1VUUFVUIHR5cGVtYXBzIGluaXRpYWxpc2F0aW9uLgoKMjAwOS0wNC0wOTogd3NmdWx0b24KCSAgICBGaXggIzI3NDY4NTggLSBDIG1hY3JvIGV4cHJlc3Npb24gdXNpbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwoKMjAwOS0wMy0zMDogb2xseQoJICAgIFtQSFBdIFRoZSBkZWZhdWx0IG91dCB0eXBlbWFwIGZvciBjaGFyW0FOWV0gbm93IHJldHVybnMgdGhlIHN0cmluZyB1cCB0byBhCgkgICAgemVybyBieXRlLCBvciB0aGUgZW5kIG9mIHRoZSBhcnJheSBpZiB0aGVyZSBpcyBubyB6ZXJvIGJ5dGUuICBUaGlzCgkgICAgaXMgdGhlIHNhbWUgYXMgUHl0aG9uIGRvZXMsIGFuZCBzZWVtcyBtb3JlIGdlbmVyYWxseSB1c2VmdWwgdGhhbgoJICAgIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIHRoZSB3aG9sZSBjb250ZW50cyBvZiB0aGUgYXJyYXkKCSAgICBpbmNsdWRpbmcgYW55IHplcm8gYnl0ZXMuICBJZiB5b3Ugd2FudCB0aGUgb2xkIGJlaGF2aW91ciwgeW91IGNhbiBwcm92aWRlCgkgICAgeW91ciBvd24gdHlwZW1hcCB0byBkbyB0aGlzOgoKCSAgICAldHlwZW1hcChvdXQpIGNoYXIgW0FOWV0KCSAgICAlewoJCVJFVFZBTF9TVFJJTkdMKCQxLCAkMV9kaW0wLCAxKTsKCSAgICAlfQoKVmVyc2lvbiAxLjMuMzkgKDIxIE1hcmNoIDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMy0xOTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgbWVtb3J5IGxlYWsgcmVsYXRlZCB0byBQeXRob24gMyB1bmljb2RlIGFuZCBDIGNoYXIqIGNvbnZlcnNpb24sCiAgICAgICAgICAgIHdoaWNoIGNhbiBiZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYmVmb3JlIHRoaXMgZml4OgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZnJvbSBsaV9jc3RyaW5nIGltcG9ydCAqCiAgICAgICAgICAgICAgICAgIGk9MAogICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgICAgICBuID0gc3RyKGkpKjEwCiAgICAgICAgICAgICAgICAgICAgICB0ZXN0MyhuKQoKICAgICAgICAgICAgVGhpcyBmaXggYWZmZWN0ZWQgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgc28geW91IGNhbm5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aAogICAgICAgICAgICBhIG51bGwgYWxsb2MgYW5kIG5vbi1udWxsIGNwdHIgYXJndW1lbnQgaW4gUHl0aG9uIDMsIG90aGVyd2lzZSBhIHJ1bnRpbWUgZXJyb3IKICAgICAgICAgICAgd2lsbCBiZSByYWlzZWQuCgoyMDA5LTAzLTE4OiB3c2Z1bHRvbgoJICAgIFtDI10gc3RkOjp2ZWN0b3I8VD4gd3JhcHBlciBpbXByb3ZlbWVudHMgZm9yIC5ORVQgMiBhbmQgYWxzbyBwcm92aWRpbmcgdGhlCgkgICAgbmVjZXNzYXJ5IG1hY2hpbmVyeSB0byB1c2UgdGhlIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXJzIHdpdGggbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBzdWNoCgkgICAgYXMgTElOUSAtIHRoZSBDIyBwcm94eSBjbGFzcyBub3cgZGVyaXZlcyBmcm9tIElFbnVtZXJhYmxlPD4uIFRoZSBkZWZhdWx0IGlzIG5vdyB0byAKCSAgICBnZW5lcmF0ZSBjb2RlIHJlcXVpcmluZyAuTkVUIDIgYXMgYSBtaW5pbXVtLCBhbHRob3VnaCB0aGUgQyMgY29kZSBjYW4gYmUgY29tcGlsZWQgCgkgICAgZm9yIC5ORVQgMSBieSBkZWZpbmluZyB0aGUgU1dJR19ET1RORVRfMSBDIyBwcmVwcm9jZXNzb3IgY29uc3RhbnQuIFNlZSB0aGUgCgkgICAgc3RkX3ZlY3Rvci5pIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wMy0xMjogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICMyNjc2NzM4IFNXSUcgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gU29tZSBmaXhlcyBmb3IgUHl0aG9uIDMuMC4xIGFuZCBoaWdoZXIgc3VwcG9ydC4gSW4gMy4wLjEsIHRoZSBDIEFQSSBmdW5jdGlvbgogICAgICAgICAgICBQeU9iamVjdF9Db21wYXJlIGlzIHJlbW92ZWQsIHNvIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCBpcyB1c2VkIGZvciByZXBsYWNlbWVudC4KICAgICAgICAgICAgU3RydWN0IGluaXRpbGl6YXRpb24gb2YgU3dpZ1B5T2JqZWN0IGFuZCBTd2lnUHlPYmplY3RfYXNfbnVtYmVyIGNoYW5nZWQgdG8gcmVmbGVjdAogICAgICAgICAgICB0aGUgZHJvcCBvZiB0cF9jb21wYXJlIGFuZCBuYl9sb25nLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTgzMTYwLiBOb3cgdGhlIGltcG9ydGVyIGluIFB5dGhvbiBzaGFkb3cgd3JhcHBlciB0YWtlIGNhcmUgb2YgdGhlCiAgICAgICAgICAgIGNhc2UgdGhhdCBtb2R1bGUgYWxyZWFkeSBpbXBvcnRlZCBhdCBvdGhlciBwbGFjZS4KCjIwMDktMDItMjg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjYzNzM1Mi4gTW92ZSBzdHJ1Y3QgZGVjbGFyYXRpb24gb2YgU1dJR19tb2R1bGUgaW4gcHlpbml0LnN3ZyBiZWZvcmUKICAgICAgICAgICAgdGhlIG1ldGhvZCBjYWxscywgc2luY2Ugc29tZSBDIGNvbXBpbGVyIGRvbid0IGFsbG93IGRlY2xhcmF0aW9uIGluIG1pZGRsZSBvZiBmdW5jdGlvbgogICAgICAgICAgICBib2R5LgoKMjAwOS0wMi0yMTogd3NmdWx0b24KCSAgICBbQWxsZWdyb2NsXSBGaXggc2VnIGZhdWx0IHdyYXBwaW5nIHNvbWUgY29uc3RhbnQgdmFyaWFibGUgKCVjb25zdGFudCkgdHlwZXMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIFtDRkZJXSBGaXggc2VnIGZhdWx0cyB3aGVuIGZvciAlZXh0ZW5kIGFuZCB1c2luZyBzdGF0ZW1lbnRzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBGaXggU0YgIzI2MDU5NTU6IC1jbyBvcHRpb24gd2hpY2ggYnJva2UgaW4gMS4zLjM3LiAKCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgTmV3ICVpbnNlcnQoImJlZ2luIikgc2VjdGlvbiBhZGRlZC4gQWxzbyBjYW4gYmUgdXNlZCBhcyAlYmVnaW4uIFRoaXMgaXMgYSBuZXcKCSAgICBjb2RlIHNlY3Rpb24gcmVzZXJ2ZWQgZW50aXJlbHkgZm9yIHVzZXJzIGFuZCB0aGUgY29kZSB3aXRoaW4gdGhlIHNlY3Rpb24gaXMgZ2VuZXJhdGVkCgkgICAgYXQgdGhlIHRvcCBvZiB0aGUgQy9DKysgd3JhcHBlciBmaWxlIGFuZCBzbyBwcm92aWRlcyBhIG1lYW5zIHRvIHB1dCBjdXN0b20gY29kZQoJICAgIGludG8gdGhlIHdyYXBwZXIgZmlsZSBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0IFNXSUcgZ2VuZXJhdGVzLgoKMjAwOS0wMi0xNzogd3NmdWx0b24KCSAgICAnbWFrZSBjbGVhbi10ZXN0LXN1aXRlJyB3aWxsIG5vdyBydW4gY2xlYW4gb24gQUxMIGxhbmd1YWdlcy4gUHJldmlvdXNseSBpdCBvbmx5CgkgICAgcmFuIHRoZSBjb3JyZWN0bHkgY29uZmlndXJlZCBsYW5ndWFnZXMuIFRoaXMgd2F5IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBjbGVhbiB1cAoJICAgIHByb3Blcmx5IGFmdGVyIHJ1bm5pbmcgJ21ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUnLgoKMjAwOS0wMi0xNDogd3NmdWx0b24KCSAgICBFeHRlbmQgYXR0cmlidXRlIGxpYnJhcnkgc3VwcG9ydCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIHVzZQoJICAgIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIHNlbWFudGljcy4gVHdvIG5ldyBtYWNyb3MgYXJlIGF2YWlsYWJsZSBhbmQgdXNhZ2UgaXMgaWRlbnRpY2FsCgkgICAgdG8gJWF0dHJpYnV0ZS4gVGhlc2UgYXJlICVhdHRyaWJ1dGV2YWwgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgJWF0dHJpYnV0ZXN0cmluZyBmb3IKCSAgICBzdHJpbmcgY2xhc3NlcywgbGlrZSBzdGQ6OnN0cmluZy4gU2VlIGF0dHJpYnV0ZS5zd2cgZm9yIG1vcmUgZGV0YWlscy4KCjIwMDktMDItMTM6IHdzZnVsdG9uCgkgICAgQWRkIHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzLiBQcmV2aW91c2x5IHRoZSBtZW1iZXJpbiB0eXBlbWFwcyB3ZXJlCgkgICAgaWdub3JlZCBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgoKMjAwOS0wMi0xMjogd3NmdWx0b24KCSAgICBSZW1vdmUgdW5uZWNlc3NhcnkgdGVtcG9yYXJ5IHZhcmlhYmxlIHdoZW4gd3JhcHBpbmcgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VzLiAKCSAgICBFeGFtcGxlIG9mIGdlbmVyYXRlZCBjb2RlIGZvciB3cmFwcGluZzoKCgkgICAgICBzdHJ1Y3QgWFlaIHsKCQlzdGQ6OnN0cmluZyYgcmVmUmV0dXJuKCk7CgkgICAgICB9OwoKCSAgICB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJl9yZXN1bHRfcmVmID0gKGFyZzEpLT5yZWZSZXR1cm4oKTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmX3Jlc3VsdF9yZWY7CiAgICAgICAgICAgICAgfQoKCSAgICAgTm93IGl0IGlzOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICYoYXJnMSktPnJlZlJldHVybigpOwoKMjAwOS0wMi0wODogYmh5CiAgICAgICAgICAgIENoYW5nZSB0aGUgU0laRSBtYXBwZWQgYnkgJXB5YnVmZmVyX211dGFibGVfYmluYXJ5IGFuZCAlcHlidWZmZXJfYmluYXJ5IGluIHB5YnVmZmVyLmkgZnJvbQogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYnVmZmVyLgoKMjAwOS0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVmZWF0dXJlIG5vdCB3b3JraW5nIGZvciBjb252ZXJzaW9uIG9wZXJhdG9ycywgcmVwb3J0ZWQgYnkgTWF0dCBTcHJhZ3VlLCBmb3IgZXhhbXBsZToKCSAgICAgICVmZWF0dXJlKCJjczptZXRob2Rtb2RpZmllcnMiKSBvcGVyYXRvciBib29sICJwcm90ZWN0ZWQiOwoKMjAwOS0wMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBBcHBseSAjMjA4MTk2NyBjb25maWd1cmUgY2hhbmdlcyBmb3IgZXhhbXBsZXMgdG8gYnVpbGQgd2l0aCByZWNlbnQgUExUIHZlcnNpb25zLgoJICAgIEFsc28gZml4ZXMgTWFrZWZpbGUgZXJyb3JzIGJ1aWxkaW5nIFNXSUcgZXhlY3V0YWJsZSB3aGVuIG16c2NoZW1lIHBhY2thZ2UgaXMgaW5zdGFsbGVkIAoJICAgICh2ZXJzaW9uIDMuNzIgYXBwcm94IGFuZCBsYXRlcikuCgoyMDA5LTAyLTA0OiB0YWxieQogICAgICAgICAgICBbUGVybF0gRml4IFNGIzI1NjQxOTIgcmVwb3J0ZWQgYnkgRGF2aWQgS29sb3ZyYXRuay4KICAgICAgICAgICAgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgbm93IGhhbmRsZXMgImdldCIgbWFnaWMuCgpWZXJzaW9uIDEuMy4zOCAoMzEgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyNDg4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBOb3cgJXB5dGhvbnByZXBlbmQKICAgICAgICAgICAgYW5kICVweXRob25hcHBlbmQgaGF2ZSBjb3JyZWN0IGluZGVudGF0aW9uLgoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyMDQ4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBUaGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgb2Ygc3RhdGljIG1lbWJlciBmdW5jdGlvbiBpbiBnZW5lcmF0ZWQgcHJveHkgY29kZSBzaG91bGQgbm90IGhhdmUgdGhlCiAgICAgICAgICAgICdzZWxmJyBwYXJhbWV0ZXIuCgoyMDA5LTAxLTI5OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMS4zLjM3IHdoZXJlIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkKCSAgICBmb3IgdGFyZ2V0IGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIChpbiB0aGUgYWJzZW5jZSBvZiAtb3V0ZGlyKSB3YXMgbm8KCSAgICBsb25nZXIgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBnZW5lcmF0ZWQgYy9jKysgZmlsZS4KCjIwMDktMDEtMjg6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBGaXggcHJveHkgY2xhc3Mgbm90IGJlaW5nIHVzZWQgd2hlbiB0aGUgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yCgkgICAgd2FzIHVzZWQgZm9yIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHZhbHVlLiBSZXBvcnRlZCBieSBEYXZpZCBQaWVwZ3Jhc3MuCgoyMDA5LTAxLTE1OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggc2VnIGZhdWx0IHdoZW4gcnVubmluZyB3aXRoIC12IG9wdGlvbiwgcmVwb3J0ZWQgYnkgSm9obiBLeS4KClZlcnNpb24gMS4zLjM3ICgxMyBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTEzOiBtZ29zc2FnZQoJICAgIFtMdWFdIEFkZGVkIGNvbnRyYWN0IHN1cHBvcnQgZm9yIHJlcXVpcmluZyB0aGF0IHVuc2lnbmVkIG51bWJlcnMgYXJlID49MAoJICAgIFJld3JvdGUgbXVjaCBvZiBFeGFtcGxlcy9MdWEvZW1iZWQzLiAKCSAgICBBZGRlZCBhIGxvdCB0byB0aGUgTHVhIGRvY3VtZW50YXRpb24uCgoyMDA5LTAxLTEzOiB3c2Z1bHRvbgoJICAgIEZpeCBjb21waWxhdGlvbiBlcnJvciB3aGVuIHVzaW5nIGRpcmVjdG9ycyBvbiBwcm90ZWN0ZWQgdmlydHVhbCBvdmVybG9hZGVkIAoJICAgIG1ldGhvZHMgcmVwb3J0ZWQgYnkgU2FtIEhlbmRsZXkuCgoyMDA5LTAxLTEyOiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgaGFuZGxpbmcgb2YgaW50ZWdlciBhcnJheXMKCjIwMDktMDEtMTA6IGRyam9lCgkgICAgW1JdIEZpeCBpbnRlZ2VyIGhhbmRsaW5nIGluIHIgdG8gZGVhbCBjb3JyZWN0bHkgd2l0aCBzaWduZWQKCSAgICBhbmQgdW5zaWduZWQgaXNzdWVzCgoyMDA5LTAxLTEwOiB3c2Z1bHRvbgoJICAgIFBhdGNoICAjMTk5Mjc1NiBmcm9tIENvbGluIE1jRG9uYWxkIC0gJWNvbnRyYWN0IG5vdCB3b3JraW5nIGZvciBjbGFzc2VzIAoJICAgIGluIG5hbWVzcGFjZQoKMjAwOS0wMS0wNTogb2xseQoJICAgIE1hcmsgU1dJR1BFUkw1LCBTV0lHUEhQNSwgYW5kIFNXSUdUQ0w4IGFzIGRlcHJlY2F0ZWQgaW4gdGhlIHNvdXJjZQoJICAgIGNvZGUgYW5kIHJlbW92ZSBkb2N1bWVudGF0aW9uIG9mIHRoZW0uCgoyMDA4LTEyLTMwOiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMjQzMDc1Ni4gQWxsIHRoZSBsYW5ndWFnZXMgbm93IGRlZmluZSBhIG1hY3JvIGluIHRoZSBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGZpbGUgaW5kaWNhdGluZyB3aGljaCBsYW5ndWFnZSBpcyBiZWluZyB3cmFwcGVkLiBUaGUgbWFjcm8gbmFtZSBpcyB0aGUKCSAgICBzYW1lIGFzIHRob3NlIGRlZmluZWQgd2hlbiBTV0lHIGlzIHJ1biwgZWcgU1dJR0pBVkEsIFNXSUdPQ1RBVkUsIFNXSUdDU0hBUlAgZXRjCgkgICAgYW5kIGFyZSBsaXN0ZWQgaW4gdGhlICJDb25kaXRpb25hbCBDb21waWxhdGlvbiIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMDgtMTItMjM6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMjE1Mzc3MyAtICVub2phdmFleGNlcHRpb24gd2FzIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICBpbnN0ZWFkIG9mIGRpc2FibGluZyBpdC4gQ2xlYXJpbmcgY2hlY2tlZCBKYXZhIGV4Y2VwdGlvbnMgYWxzbyBkaWRuJ3Qgd29yay4gCgkgICAgVGhlIG5ldyAlY2xlYXJqYXZhZXhjZXB0aW9uIGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUuCgoyMDA4LTEyLTIyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjQzMjgwMSAtIE1ha2UgU3dpZ1ZhbHVlV3JhcHBlciBleGNlcHRpb24gc2FmZSBmb3Igd2hlbiBjb3B5IGNvbnN0cnVjdG9ycwoJICAgIHRocm93IGV4Y2VwdGlvbnMuCgoyMDA4LTEyLTIxOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyNDQwMDQ2IHdoaWNoIGZpeGVzIHBvc3NpYmxlIHNlZyBmYXVsdHMgZm9yIG1lbWJlciBhbmQgZ2xvYmFsCgkgICAgdmFyaWFibGUgY2hhciBhcnJheXMgd2hlbiB0aGUgc3RyaW5ncyBhcmUgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZyBhcnJheSBzaXplLgoKMjAwOC0xMi0yMDogd3NmdWx0b24KCSAgICBUaGUgY2NhY2hlIGNvbXBpbGVyIGNhY2hlIGhhcyBiZWVuIGFkYXB0ZWQgdG8gd29yayB3aXRoIFNXSUcgYW5kCgkgICAgbmFtZWQgY2NhY2hlLXN3aWcuIEl0IG5vdyB3b3JrcyB3aXRoIEMvQysrIGNvbXBpbGVycyBhcyB3ZWxsIGFzIFNXSUcKCSAgICBhbmQgY2FuIHJlc3VsdCBpbiBpbXByZXNzaXZlIHNwZWVkdXBzIHdoZW4gdXNlZCB0byByZWNvbXBpbGUgdW5jaGFuZ2VkCgkgICAgY29kZSB3aXRoIGVpdGhlciBhIEMvQysrIGNvbXBpbGVyIG9yIFNXSUcuIERvY3VtZW50YXRpb24gaXMgaW4gQ0NhY2hlLmh0bWwKCSAgICBvciB0aGUgaW5zdGFsbGVkIGNjYWNoZS1zd2lnIG1hbiBwYWdlLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCBmcm9tIEthbHlhbm92IERtaXRyeSB3aGljaCBmaXhlcyBwYXJzaW5nIG9mIG5lc3RlZCBzdHJ1Y3RzCgkgICAgY29udGFpbmluZyBjb21tZW50cy4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgRml4IGVycm9yIG1lc3NhZ2UgaW4gc29tZSBuZXN0ZWQgc3RydWN0IGFuZCAlaW5saW5lIHBhcnNpbmcgZXJyb3Igc2l0dWF0aW9ucwoJICAgIHN1Y2ggYXMgdW50ZXJtaW5hdGVkIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgoKMjAwOC0xMi0wNzogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlciB3aXRoIEdDQyA0LjMuCgoyMDA4LTEyLTA2OiB3c2Z1bHRvbgoJICAgIFtQSFBdIERlcHJlY2F0ZSAlcHJhZ21hKHBocDQpLiBQbGVhc2UgdXNlICVwcmFnbWEocGhwKSBpbnN0ZWFkLgoJICAgIFRoZSBmb2xsb3dpbmcgdHdvIHdhcm5pbmdzIGhhdmUgYmVlbiByZW5hbWVkOgoJICAgIFdBUk5fUEhQNF9NVUxUSVBMRV9JTkhFUklUQU5DRSAtPiBXQVJOX1BIUF9NVUxUSVBMRV9JTkhFUklUQU5DRQoJICAgIFdBUk5fUEhQNF9VTktOT1dOX1BSQUdNQSAgICAgICAtPiBXQVJOX1BIUF9VTktOT1dOX1BSQUdNQQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTA0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCBTRiMyMTU4OTM4OiBhbGwgdGhlIFNXSUcgc3ltYm9sIG5hbWVzIHN0YXJ0ZWQgd2l0aCBQeQogICAgICAgICAgICBhcmUgY2hhbmdlZCwgc2luY2UgdGhleSBhcmUgaW5hcHByb3ByaWF0ZSBhbmQgZGlzY291cmFnZWQgaW4gUHl0aG9uCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gKGZyb20gaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8yLjUuMi9hcGkvaW5jbHVkZXMuaHRtbCk6CgogICAgICAgICAgICAiQWxsIHVzZXIgdmlzaWJsZSBuYW1lcyBkZWZpbmVkIGJ5IFB5dGhvbi5oIChleGNlcHQgdGhvc2UgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgaW5jbHVkZWQgc3RhbmRhcmQgaGVhZGVycykgaGF2ZSBvbmUgb2YgdGhlIHByZWZpeGVzICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIE5hbWVzIGJlZ2lubmluZyB3aXRoICJfUHkiIGFyZSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBleHRlbnNpb24gd3JpdGVycy4gU3RydWN0dXJlIG1lbWJlciBuYW1lcyBkbwogICAgICAgICAgICBub3QgaGF2ZSBhIHJlc2VydmVkIHByZWZpeC4KCiAgICAgICAgICAgIEltcG9ydGFudDogdXNlciBjb2RlIHNob3VsZCBuZXZlciBkZWZpbmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIFRoaXMgY29uZnVzZXMgdGhlIHJlYWRlciwgYW5kIGplb3BhcmRpemVzIHRoZSBwb3J0YWJpbGl0eSBvZiB0aGUgdXNlcgogICAgICAgICAgICBjb2RlIHRvIGZ1dHVyZSBQeXRob24gdmVyc2lvbnMsIHdoaWNoIG1heSBkZWZpbmUgYWRkaXRpb25hbCBuYW1lcyBiZWdpbm5pbmcKICAgICAgICAgICAgd2l0aCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMuIgoKICAgICAgICAgICAgSGVyZSBpcyBhIGJyaWVmIGxpc3Qgb2Ygd2hhdCBjaGFuZ2VkOgoKICAgICAgICAgICAgICAgIFB5U3dpZyogLT4gU3dpZ1B5KgogICAgICAgICAgICAgICAgUHlPYmplY3RfcHRyIC0+IFN3aWdQdHJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3ZhciAtPiBTd2lnVmFyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0Jhc2UsIFB5U2VxdWVuY2VfQ29udCwgUHlTZXF1ZW5jZV9SZWYgLT4KICAgICAgICAgICAgICAgICAgICAgICAgU3dpZ1B5U2VxdWVuY2VfQmFzZSwgU3dpZ1B5U2VxdWVuY2VfQ29udCwgU3dpZ1B5U2VxdWVuY2VfUmVmCiAgICAgICAgICAgICAgICBQeU1hcCogLT4gU3dpZ1B5TWFwKgoKICAgICAgICAgICAgV2UgcHJvdmlkZWQgYSBweW5hbWVfY29tcGF0LmkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFVzZXJzIHdob3NlIGNvZGUgaGF2aW5nCiAgICAgICAgICAgIHRoZXNlIHN5bWJvbHMgYW5kIGRvIG5vdCB3YW50IHRvIGNoYW5nZSBpdCBjb3VsZCBzaW1wbHkgaW5jbHVkZSB0aGlzIGZpbGUKICAgICAgICAgICAgYXQgZnJvbnQgb2YgeW91ciBjb2RlLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byBydW4gdGhlIGNvbnZlcnRpbmcgdG9vbCBvbgogICAgICAgICAgICB5b3VyIGNvZGUsIHdoaWNoIGhhcyBiZWVuIHB1dCBpbiBTV0lHJ3MgU1ZOIHRydW5rIChUb29scy9weW5hbWVfcGF0Y2gucHkpIGFuZAogICAgICAgICAgICB5b3UgY2FuIGRvd25sb2FkIGl0IGhlcmU6CiAgICAgICAgICAgIGh0dHBzOi8vc3dpZy5zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3Qvc3dpZy90cnVuay9Ub29scy9weW5hbWVfcGF0Y2gucHkgCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDI6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzIxNDM3MjcgZnJvbSBTZXJnZSBNb25rZXdpdHogdG8gZml4IGltcG9ydGluZyBiYXNlIGNsYXNzZXMgCgkgICAgd2hlbiB0aGUgcGFja2FnZSBvcHRpb24gaXMgc3BlY2lmaWVkIGluICVtb2R1bGUgYW5kIHRoYXQgbW9kdWxlIGlzICVpbXBvcnQnZWQuCgoyMDA4LTExLTI4OiB3c2Z1bHRvbgoJICAgIFtVVExdIEZpeCAjMjA4MDQ5Ny4gU29tZSBpbmNvcnJlY3QgYWNjZXB0YW5jZSBvZiB0eXBlcyBpbiB0aGUgU1RMLCBlZyBhIGRvdWJsZSAqIGVsZW1lbnQKCSAgICBwYXNzZWQgaW50byBhIHZlY3RvcjxpbnQgKj4gY29uc3RydWN0b3Igd291bGQgYmUgYWNjZXB0ZWQsIGJ1dCB0aGUgZW5zdWluZyBiZWhhdmlvdXIKCSAgICB3YXMgdW5kZWZpbmVkLiBOb3cgdGhlIHR5cGUgY29udmVyc2lvbiBjb3JyZWN0bHkgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KCjIwMDgtMTEtMjQ6IHdzZnVsdG9uCgkgICAgQWRkIC1vdXRjdXJyZW50ZGlyIG9wdGlvbi4gVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIGN1cnJlbnQgCgkgICAgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBlbmFibGVzCgkgICAgYmVoYXZpb3VyIHNpbWlsYXIgdG8gYy9jKysgY29tcGlsZXJzLiBOb3RlIHRoYXQgdGhpcyBjb250cm9scyB0aGUgb3V0cHV0IGRpcmVjdG9yeSwKCSAgICBidXQgb25seSBpbiB0aGUgYWJzZW5jZSBvZiB0aGUgLW8gYW5kL29yIC1vdXRkaXIgb3B0aW9ucy4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgW3J1YnldIEFwcGx5IHBhdGNoICMyMjYzODUwIHRvIGZpeCBydWJ5L2ZpbGUuaSAuLi4gcnVieWlvLmggZmlsZW5hbWUgY2hhbmdlIGluIAoJICAgIHJ1YnkgMS45LgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjMxOTc5MCBmcm9tIEpvaGFuIEhha2UgdG8gZml4IHNoYXJlZF9wdHIgdXNhZ2UgaW4gc3RkOjp0cjEgbmFtZXNwYWNlLgoKMjAwOC0xMS0yMTogd3NmdWx0b24KCSAgICBUaGUgdXNlIG9mIHRoZSBpbmNsdWRlIHBhdGggdG8gZmluZCB0aGUgaW5wdXQgZmlsZSBpcyBub3cgZGVwcmVjYXRlZC4KCSAgICBUaGlzIG1ha2VzIHRoZSBiZWhhdmlvdXIgb2YgU1dJRyB0aGUgc2FtZSBhcyBDL0MrKyBjb21waWxlcnMgaW4gcHJlcGFyYXRpb24KCSAgICBmb3IgdXNlIHdpdGggY2NhY2hlLgoKMjAwOC0xMS0xNjogd3NmdWx0b24KCSAgICBGaXggLW5vcHJlcHJvY2VzcyBvcHRpb24gdG86CgkgICAgLSBjb3JyZWN0bHkgcmVwb3J0IGZpbGUgbmFtZXMgaW4gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMuCgkgICAgLSB1c2UgdGhlIG9yaWdpbmFsIGlucHV0IGZpbGVuYW1lIHRoYXQgY3JlYXRlZCB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3aGVuIAoJICAgICAgZGV0ZXJtaW5pbmcgdGhlIEMrKyB3cmFwcGVyIGZpbGUgbmFtZSAoaW4gdGhlIGFic2VuY2Ugb2YgLW8pLiBQcmV2aW91c2x5IAoJICAgICAgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgY29udGFpbmluZyB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3YXMgdXNlZC4KCjIwMDgtMTEtMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBwYXRjaCAjMjE1MjY5MSBmcm9tIE1BVFNVVVJBIFRha2Fub3JpIHdoaWNoIGZpeGVzIGNvbXBpbGVzIHVzaW5nIHRoZQoJICAgIEludGVsIGNvbXBpbGVyCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgcGF0Y2ggIzIxMjgyNDkgZnJvbSBBbmF0b2x5IFRlY2h0b25payB3aGljaCBjb3JyZWN0cyB0aGUgQy9DKysgcHJveHkKICAgICAgICAgICAgY2xhc3MgYmVpbmcgcmVwb3J0ZWQgZm9yIFB5dGhvbiBkb2NzdHJpbmdzIHdoZW4gJXJlbmFtZSBpcyB1c2VkLgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBzdHJpcCBlbmNvZGVyIHBhdGNoIGZyb20gQW5hdG9seSBUZWNodG9uaWsgIzIxMzAwMTYuIFRoaXMgZW5hYmxlcyBhbiAKICAgICAgICAgICAgZWFzeSB3YXkgdG8gcmVuYW1lIHN5bWJvbHMgYnkgc3RyaXBwaW5nIGEgY29tbW9ubHkgdXNlZCBwcmVmaXggaW4gYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbi9zdHJ1Y3QgbmFtZXMuIEl0IHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb3RoZXIgZW5jb2RlcnMsIHN1Y2ggYXMKICAgICAgICAgICAgdGl0bGUsIGxvd2VyLCBjb21tYW5kIGV0YyBvdXRsaW5lZCBpbiBDSEFOR0VTIGZpbGUgZGF0ZWQgMTIvMzAvMjAwNS4gRXhhbXBsZQogICAgICAgICAgICBiZWxvdyB3aWxsIHJlbmFtZSB3eEFub3RoZXJXaWRnZXQgdG8gQW5vdGhlcldpZGdldCBhbmQgd3hEb1NvbWV0aGluZyB0byAKICAgICAgICAgICAgRG9Tb21ldGhpbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIiUoc3RyaXA6W3d4XSlzIikgIiI7IAoKICAgICAgICAgICAgICBzdHJ1Y3Qgd3hBbm90aGVyV2lkZ2V0IHsKICAgICAgICAgICAgICAgICAgdm9pZCB3eERvU29tZXRoaW5nKCk7CiAgICAgICAgICAgICAgfTsKCjIwMDgtMDktMjY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBMb3RzIG9mIHRlc3Qtc3VpdGUgd29yay4KCSAgICAtIEZpeCBvcmRlcmluZyBvZiB3cmFwcGVyIG91dHB1dCBhbmQgJXsgJX0gaGVhZGVyIG91dHB1dC4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbnMgb2YgbG9jYWwgdmFycyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIGRlZmluZWQgY29uc3RhbnRzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgRW51bVZhbHVlcyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gYWRkIHNvbWUgY29uc3QgdHlwZW1hcHMgdG8gYWxsZWdyb2NsLnN3ZwoJICAgIC0gYWRkIHJlbmFtZSBmb3Igb3BlcmF0b3IgYm9vbCgpIG92ZXJsb2Fkcy4KCQoyMDA4LTA5LTI1OiBvbGx5CgkgICAgW1BIUDVdIEZpbGwgaW4gdHlwZW1hcHMgZm9yIFNXSUdUWVBFIGFuZCB2b2lkICogKFNGIzIwOTUxODYpLgoKMjAwOC0wOS0yMjogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBTdXBwb3J0IHdyYXBwaW5nIG9mIHR5cGVzIHdob3NlIGRlZmluaXRpb25zIGFyZSBub3Qgc2VlbiBieQoJICAgIFNXSUcuIFRoZXkgYXJlIHRyZWF0ZWQgYXMgZm9yd2FyZC1yZWZlcmVuY2VkIGNsYXNzZXMgYW5kIGlmIGEKCSAgICBkZWZpbml0aW9uIGlzIG5vdCBzZWVuIGFyZSB0cmVhdGVkIGFzICgqIDp2b2lkKS4KCSAgICAtIERvbid0IHdyYXAgdGhlIGNvbnRlbnRzIG9mIHVubmFtZWQgbmFtZXNwYWNlcy4KCSAgICAtIE1vcmUgY29kZSBjbGVhbnVwLiBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyB3YXJuaW5ncy4KCSAgICAtIHN0YXJ0IHdvcmsgb24gaGF2aW5nIHRoZSBhbGxlZ3JvY2wgbW9kIHBhc3MgdGhlIGNwcCB0ZXN0LXN1aXRlLgoKMjAwOC0wOS0xOTogb2xseQoJICAgIFtQSFA1XSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLgoKMjAwOC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBDIyBhcnJheSB0eXBlbWFwcyBwcm92aWRlZCBieSBBbnR0aSBLYXJhbnRhLgogICAgICAgICAgICBUaGUgYXJyYXlzIHByb3ZpZGUgYSB3YXkgdG8gdXNlIE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQQXJyYXkpCiAgICAgICAgICAgIGFuZCBwaW5uaW5nIHRoZSBhcnJheSB1c2luZyAnZml4ZWQnLiBTZWUgYXJyYXlzX2NzaGFycC5pIGxpYnJhcnkgZmlsZQogICAgICAgICAgICBmb3IgZGV0YWlscy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCgkgICAgRG9jdW1lbnQgdGhlIG9wdGlvbmFsIG1vZHVsZSBhdHRyaWJ1dGUgaW4gdGhlICVpbXBvcnQgZGlyZWN0aXZlLAogICAgICAgICAgICBzZWUgTW9kdWxlcy5odG1sLiBBZGQgYSB3YXJuaW5nIGZvciBQeXRob24gd3JhcHBlcnMgd2hlbiB0aGUKICAgICAgICAgICAgbW9kdWxlIG5hbWUgZm9yIGFuIGltcG9ydGVkIGJhc2UgY2xhc3MgaXMgbWlzc2luZywgcmVxdWlyaW5nIHRoZQogICAgICAgICAgICBtb2R1bGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkIHRvICVpbXBvcnQsIGVnIAoKICAgICAgICAgICAgICAlaW1wb3J0KG1vZHVsZT0iRm9vTW9kdWxlIikgZm9vLmgKCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gQ2hhbmdlIHRoZSBkZWZhdWx0IGlucHV0IHR5cGVtYXAgZm9yIGNoYXIgKiB0byB0dXJuIFBIUAoJICAgIE51bGwgaW50byBDIE5VTEwgKHByZXZpb3VzbHkgaXQgd2FzIGNvbnZlcnRlZCB0byBhbiBlbXB0eSBzdHJpbmcpLgoJICAgIFRoZSBuZXcgYmVoYXZpb3VyIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CgkgICAgdHlwZW1hcCB3b3JrcyAoU0YjMjAyNTcxOSkuCgoJICAgIElmIHlvdSB3YW50IHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGFkZCB0aGUgZm9sbG93aW5nIHR5cGVtYXAKCSAgICB0byB5b3VyIGludGVyZmFjZSBmaWxlIChQSFAncyBjb252ZXJ0X3RvX3N0cmluZ19leCgpIGZ1bmN0aW9uIGRvZXMKCSAgICB0aGUgY29udmVydGluZyBmcm9tIFBIUCBOdWxsIHRvIGFuIGVtcHR5IHN0cmluZyk6CgoJICAgICV0eXBlbWFwKGluKSBjaGFyICogewoJCWNvbnZlcnRfdG9fc3RyaW5nX2V4KCRpbnB1dCk7CgkJJDEgPSBaX1NUUlZBTF9QUCgkaW5wdXQpOwoJICAgIH0KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IGV4dHJhIGNvZGUgYWRkZWQgdG8gcHJveHkgY2xhc3MgY29uc3RydWN0b3JzIGluIHRoZSBjYXNlCgkgICAgd2hlcmUgdGhlIG9ubHkgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnRzLgoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggd3JhcHBpbmcgb2YgYSByZW5hbWVkIGVudW1lcmF0ZWQgdmFsdWUgb2YgYW4gZW51bSBjbGFzcwoJICAgIG1lbWJlciAoU0YjMjA5NTI3MykuCgoyMDA4LTA5LTE3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEZpeCBob3cgZm9yd2FyZCByZWZlcmVuY2UgdHlwZWRlZnMgYXJlIGhhbmRsZWQsIHNvIGFzIG5vdCB0byBjb25mbGljdAoJICAgIHdpdGggb3RoZXIgbGVnaXQgdHlwZWRlZnMuCgkgICAgLSBEb24ndCAoZm9yIG5vdykgcGVyZm9ybSBhbiBmZml0eXBlIHR5cGVtYXAgbG9va3VwIHdoZW4gdHJ5aW5nIHRvCgkgICAgd2hlbiBjYWxsaW5nIGNvbXBvc2VfZm9yZWlnbl90eXBlKCkuIFRoaXMgaXMgYWN0dWFsbHkgYSB1c2VmdWwgdGhpbmcKCSAgICB0byBkbyBpbiBjZXJ0YWluIGNhc2VzLCB0aGUgdGVzdCBjYXNlcyBmb3Igd2hpY2ggSSBjYW4ndCBjdXJyZW50bHkKCSAgICBsb2NhdGUgOi8uIEl0J3MgYnJlYWtpbmcgc29tZSB3cmFwcGluZyBiZWhhdmlvciB0aGF0IGlzIG1vcmUgY29tbW9ubHkKCSAgICBzZWVuLCBob3dldmVyLiBJJ2xsIHJlYWRkIGluIGEgbW9yZSBhcHByb3ByaWF0ZSB3YXkgd2hlbiBJIGNhbgoJICAgIHJlY3JlYXRlIHRoZSBuZWVkZWQgdGVzdCBjYXNlLCBvciBhIHVzZXIgY29tcGxhaW5zICh3aGljaCBtZWFucwoJICAgIHRoZXkgcHJvYmFibHkgaGF2ZSBhIHRlc3QgY2FzZSkuCgkgICAgLSBkb2N1bWVudCB0aGUgLWlzb2xhdGUgY29tbWFuZC1saW5lIGFyZyBpbiB0aGUgJ3N3aWcgLWhlbHAnIG91dHB1dC4KCSAgICBJdCB3YXMgaW4gdGhlIGh0bWwgZG9jcywgYnV0IG5vdCB0aGVyZS4KCSAgICAtIHNtYWxsIGFtb3VudCBvZiBjb2RlIGNsZWFudXAsIHJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KCSAgICAtIHNvbWUgbWlub3IgYWVzdGhldGljIGNoYW5nZXMuCgoyMDA4LTA5LTEyOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuMCBzdXBwb3J0IGJyYW5jaCBtZXJnZWQgaW50byBTV0lHIHRydW5rLiBUaGFua3MgdG8KICAgICAgICAgICAgR29vZ2xlIFN1bW1lciBvZiBDb2RlIDIwMDggZm9yIHN1cHBvcnRpbmcgdGhpcyBwcm9qZWN0ISBCeSBkZWZhdWx0CiAgICAgICAgICAgIFNXSUcgd2lsbCBnZW5lcmF0ZSBpbnRlcmZhY2UgZmlsZXMgY29tcGF0aWJsZSB3aXRoIGJvdGggUHl0aG9uIDIueAogICAgICAgICAgICBhbmQgMy4wLiBBbmQgdGhlcmUncyBhbHNvIHNvbWUgUHl0aG9uIDMgbmV3IGZlYXR1cmVzIHRoYXQgY2FuIGJlCiAgICAgICAgICAgIGVuYWJsZWQgYnkgcGFzc2luZyBhICItcHkzIiBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIFNXSUcuIFRoZXNlCiAgICAgICAgICAgIGZlYXR1cmVzIGFyZToKCiAgICAgICAgICAgICAgLSBGdW5jdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgQWxzbywgdGhlIHBhcmFtZXRlciBsaXN0IG9mIHByb3h5IGZ1bmN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLAogICAgICAgICAgICAgICAgICBldmVuIHdpdGhvdXQgdGhlICItcHkzIiBvcHRpb24uIEhvd2V2ZXIsIHRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICAgICAgICB3aWxsIGZhbGxiYWNrIHRvICphcmdzIGlmIHRoZSBmdW5jdGlvbiAob3IgbWV0aG9kKSBpcyBvdmVybG9hZGVkLgogICAgICAgICAgICAgIC0gQnVmZmVyIGludGVyZmFjZSBzdXBwb3J0CiAgICAgICAgICAgICAgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIHN1cHBvcnQKCiAgICAgICAgICAgIEZvciBkZXRhaWxzIG9mIFB5dGhvbiAzIHN1cHBvcnQgYW5kIHRoZXNlIGZlYXR1cmVzLCBwbGVhc2Ugc2VlIHRoZQogICAgICAgICAgICAiUHl0aG9uIDMgU3VwcG9ydCIgc2VjdGlvbiBpbiB0aGUgIlNXSUcgYW5kIFB5dGhvbiIgY2hhcHRlciBvZiB0aGUgU1dJRwogICAgICAgICAgICBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlICItYXBwbHkiIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIHN1cHBvcnQgb2YgZ2VuZXJhdGluZyBjb2RlcwogICAgICAgICAgICB1c2luZyBhcHBseSgpIGlzIHJlbW92ZWQuIFNpbmNlIHRoaXMgaXMgb25seSByZXF1aXJlZCBieSB2ZXJ5IG9sZAogICAgICAgICAgICBQeXRob24uCgogICAgICAgICAgICBUaGlzIG1lcmdlIGFsc28gcGF0Y2hlZCBTV0lHJ3MgcGFyc2VyIHRvIHNvbHZlIGEgYnVnLiBCeSB0aGlzIHBhdGNoLAogICAgICAgICAgICBTV0lHIGZlYXR1cmVzIGFibGUgdG8gYmUgY29ycmVjdGx5IGFwcGxpZWQgb24gQysrIGNvbnZlcnNpb24gb3BlcmF0b3IsCiAgICAgICAgICAgIHN1Y2ggbGlrZSB0aGlzOgogICAgICAgICAgICAgIAogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSAgKjo6b3BlcmF0b3IgYm9vbCAleyAuLi4gJX0KCjIwMDgtMDktMDI6IHJpY2hhcmRiCgkgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMyMDg5MTQ5OiBEaXJlY3RvciBleGNlcHRpb24gaGFuZGxpbmcgbWFuZ2xlcwoJICAgIHJldHVybmVkIGV4Y2VwdGlvbi4gIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IFB5dGhvbiBjb2RlIGluIGRpcmVjdG9ycwoJICAgIGFyZSBub3cgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNhbGxlciB3aXRob3V0IGNoYW5nZS4gIEFsc28sIHJlbW92ZQoJICAgIHRoZSAiOiAiIHByZWZpeCB3aGljaCB1c2VkIHRvIGJlIGFkZGVkIHRvIG90aGVyIGRpcmVjdG9yIGV4Y2VwdGlvbnMKCSAgICAoZWcsIHRob3NlIGR1ZSB0byBpbmNvcnJlY3QgcmV0dXJuIHR5cGVzKS4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMTk4ODI5NiBHQ0l0ZW0gbXVsdGlwbGUgbW9kdWxlIGxpbmtpbmcgaXNzdWUgd2hlbiB1c2luZyAKICAgICAgICAgICAgZGlyZWN0b3JzLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciAndXNpbmcnIGFuZCAnZml4ZWQnIGJsb2NrcyBpbiB0aGUgJ2NzaW4nIHR5cGVtYXAgaXMgbm93CiAgICAgICAgICAgIHBvc3NpYmxlIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgcHJlIGF0dHJpYnV0ZSBhbmQgdGhlIG5ldyB0ZXJtaW5hdG9yIGF0dHJpYnV0ZSwgZWcKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbiwgCiAgICAgICAgICAgICAgICAgICAgICAgcHJlPSIgICAgdXNpbmcgKENEYXRlIHRlbXAkY3NpbnB1dCA9IG5ldyBDRGF0ZSgkY3NpbnB1dCkpIHsiLAogICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0b3I9IiAgICB9IC8vIHRlcm1pbmF0ZSB0ZW1wJGNzaW5wdXQgdXNpbmcgYmxvY2siLAogICAgICAgICAgICAgICAgICAgICAgKSBjb25zdCBDRGF0ZSAmCiAgICAgICAgICAgICAgICAgICAgICAgIiRjc2NsYXNzbmFtZS5nZXRDUHRyKHRlbXAkY3NpbnB1dCkiCgogICAgICAgICAgICBTZWUgQ1NoYXJwLmh0bWwgZm9yIG1vcmUgaW5mby4KCjIwMDgtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBDb21taXQgcGF0Y2ggIzIwNzkzODEgc3VibWl0dGVkIGJ5IEJvcmlzIFNtaWxnYSAtIGNvbnN0YW50IGV4cHJzIHB1dCBpbnRvIAogICAgICAgICAgICBuby1ldmFsIGNvbnRleHQgaW4gREVGQ0VOVU0KCjIwMDgtMDgtMDI6IHd1enplYgogICAgICAgICAgICBbQ2hpY2tlbixBbGxlZ3JvXSBDb21taXQgUGF0Y2ggMjAxOTMxNAogICAgICAgICAgICBGaXhlcyBhIGJ1aWxkIGVycm9yIGluIGNoaWNrZW4sIGFuZCBzZXZlcmFsIGJ1aWxkIGVycm9ycyBhbmQgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgIGluIEFsbGVncm8gQ0wKCjIwMDgtMDctMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWlsZGluZyBvZiBUY2wgZXhhbXBsZXMvdGVzdC1zdWl0ZSBvbiBNYWMgT1MgWCByZXBvcnRlZCBieSBHaWRlb24gU2ltcHNvbi4KCjIwMDgtMDctMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMjAxOTE1NiBDb25maWd1cmluZyB3aXRoIC0td2l0aG91dC1vY3RhdmUgb3IgLS13aXRob3V0LWFsbGxhbmcKICAgICAgICAgICAgZGlkIG5vdCBkaXNhYmxlIG9jdGF2ZS4KCjIwMDgtMDctMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGRpcmVjdG9yIHR5cGVtYXBzIGZvciBwb2ludGVycyBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIGNvcnJlY3RseSAKICAgICAgICAgICAgbWFyc2hhbGxlZCB0byBDIy9KYXZhIG51bGwgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBGb3Igc3RkX3ZlY3Rvci5pIGFuZCBzdGRfbWFwLmksIHJlbmFtZSBlbXB0eSgpIHRvIGlzX2VtcHR5KCkKCSAgICBzaW5jZSAiZW1wdHkiIGlzIGEgUEhQIHJlc2VydmVkIHdvcmQuICBCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcmsgS2xlaW4KCSAgICBpbiBTRiMxOTQzNDE3LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1tYWtlIiBoYXMgYmVlbiByZW1vdmVkLiAgCgkgICAgU2VhcmNoZXMgb24gR29vZ2xlIGNvZGVzZWFyY2ggc3VnZ2VzdCB0aGF0IG5vYm9keSBpcyB1c2luZyBpdCBub3cKCSAgICBhbnl3YXkuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIFNXSUcgY2RhdGEuaSBsaWJyYXJ5IG1vZHVsZSBpcyBub3cgc3VwcG9ydGVkLgoKMjAwOC0wNy0wMzogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1waHBmdWxsIiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBXZSByZWNvbW1lbmQgYnVpbGRpbmcgeW91ciBleHRlbnNpb24gYXMgYSBkeW5hbWljYWxseQoJICAgIGxvYWRhYmxlIG1vZHVsZS4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUEhQNF0gU3VwcG9ydCBmb3IgUEhQNCBoYXMgYmVlbiByZW1vdmVkLiAgVGhlIFBIUCBkZXZlbG9wZXJzIGFyZQoJICAgIG5vIGxvbmdlciBtYWtpbmcgbmV3IFBIUDQgcmVsZWFzZXMsIGFuZCB3b24ndCBldmVuIGJlIHByb3ZpZGluZwoJICAgIHBhdGNoZXMgZm9yIGNyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBhZnRlciAyMDA4LTA4LTA4LgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQeXRob25dIEltcG9ydCB0aGUgQyBleHRlbnNpb24gZGlmZmVyZW50bHkgZm9yIFB5dGhvbiAyLjYgYW5kCgkgICAgbGF0ZXIgc28gdGhhdCBhbiBpbXBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgZG9lc24ndCBwcm9kdWNlIGEKCSAgICBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciAyLjYgYW5kIGEgZmFpbHVyZSBmb3IgMi43IGFuZCBsYXRlci4KCSAgICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBTRiMyMDA4MjI5LCBwbHVzIGZvbGxvdy11cCBwYXRjaGVzCgkgICAgZnJvbSBSaWNoYXJkIGFuZCBIYW95dSBCYWkuCgpWZXJzaW9uIDEuMy4zNiAoMjQgSnVuZSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMjQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGRlcHJlY2F0ZWQgLWMgY29tbWFuZGxpbmUgb3B0aW9uIChydW50aW1lIGxpYnJhcnkgZ2VuZXJhdGlvbikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaGFuZGxpbmcgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApCgkgICAgKHRlc3RjYXNlIGlnbm9yZV9wYXJhbWV0ZXIpLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdmYXVsdCB3aGVuIHdyYXBwaW5nIGEgbm9uLWNsYXNzIGZ1bmN0aW9uIG1hcmtlZCB3aXRoCgkgICAgJW5ld29iamVjdCAodGVzdGNhc2UgY2hhcl9zdHJpbmdzKS4KCjA2LzIyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgYSB3YXkgdG8gdXNlIEF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbiBpbnN0ZWFkIG9mIEF0dGFjaEN1cnJlbnRUaHJlYWQKICAgICAgICAgICAgaW4gZGlyZWN0b3IgY29kZS4gRGVmaW5lIHRoZSBTV0lHX0pBVkFfQVRUQUNIX0NVUlJFTlRfVEhSRUFEX0FTX0RBRU1PTiBtYWNybywgc2VlCiAgICAgICAgICAgIExpYi9qYXZhL2RpcmVjdG9yLnN3Zy4KCjA2LzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggY3Jhc2hpbmcgaW4gdGhlIFNUTCB3cmFwcGVycyAocmVqZWN0ISBhbmQgZGVsZXRlX2lmIG1ldGhvZHMpCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEMjIGFuZCBKYXZhIGtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBpbnN0ZWFkIG9mIGp1c3QgaXNzdWluZyBhIHdhcm5pbmcKICAgICAgICAgICAgYW5kIHRoZW4gZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZS4gV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSAKICAgICAgICAgICAga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBLZXl3b3JkIGhhbmRsaW5nIGFkZGVkLiBSIEtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgYm9vbCYgYW5kIGJvb2wqLiBBZGRlZCBydW50ZXN0IGZvciBsaV90eXBlbWFwcyB0ZXN0Y2FzZS4KICAgICAgICAgICAgKEJ1ZyAjMTkzODE0MikKCjA2LzA3LzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCB0ZXN0IGNhc2Uga2V5d29yZF9yZW5hbWUsIHRoZW4gbWFkZSB0aGUga2V5d29yZCByZW5hbWluZyB3b3JrcyBwcm9wZXJseQogICAgICAgICAgICBieSBmaXhpbmcgU3dpZ19uYW1lX21ha2UoKSBmb3IgYSBpbmNvbXBsZXRlIGNvbmRpdGlvbiBjaGVja2luZy4KCjA2LzAyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGVudW0gd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzMwLzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCBzdGQ6OndzdHJpbmcgaW50byBMaWIvdHlwZW1hcHMvcHJpbXR5cGVzLnN3Zywgc2luY2UgaXQgaXMgYWxzbyBhIHByaW1pdGl2ZSAKICAgICAgICAgICAgdHlwZSBpbiBTV0lHIC0gZml4ZWQgU0YgIzE5NzY5NzguCgowNS8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB2YXJpYWJsZSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMjkvMjAwODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGEgdHlwbyBvZiAlI2lmZGVmIGluIExpYi9weXRob24vcHljb250YWluZXIuc3dnLCB3aGljaCBpcyByZWxhdGVkIAogICAgICAgICAgICB0byAtZXh0cmFuYXRpdmUgU1dJRyBvcHRpb24gLSBTRiAjMTk3MTk3Ny4KCjA1LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBwYXJ0aWFsY2hlY2sgbWFrZWZpbGUgdGFyZ2V0cyBmb3IgcGFydGlhbCB0ZXN0aW5nIG9mIHRoZSB0ZXN0LXN1aXRlLiBUaGVzZQogICAgICAgICAgICBqdXN0IGludm9rZSBTV0lHLCBpZSBubyBjb21waWxhdGlvbiBhbmQgbm8gcnVudGltZSB0ZXN0aW5nLiBJdCBjYW4gYmUgZmFzdGVyCiAgICAgICAgICAgIHdoZW4gZGV2ZWxvcGluZyBieSBqdXN0IGRvaW5nIGEgZGlyZWN0b3J5IGRpZmYgb2YgdGhlIGZpbGVzIFNXSUcgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFnYWluc3QgdGhvc2UgZnJvbSBhIHByZXZpb3VzIHJ1bi4gRXhhbXBsZSB1c2FnZSBmcm9tIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5OgoKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stamF2YS10ZXN0LXN1aXRlCgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuY29tcGFzc2VzIG1vcmUgZmxleGliaWxpdHkgaW4gcnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgZWcKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gcHJlZml4IHRoZSBjb21tYW5kIGxpbmUgd2hpY2ggcnVucyBhbnkgdGFyZ2V0IGxhbmd1YWdlIHRlc3QKICAgICAgICAgICAgd2l0aCBhIHRvb2wuIFNlZSB0aGUgUlVOVE9PTCwgQ09NUElMRVRPT0wgYW5kIFNXSUdUT09MIHRhcmdldHMgaW4gdGhlIGNvbW1vbi5tawogICAgICAgICAgICBmaWxlIGFuZCBtYWtlZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSBpdCBpcyBwb3NzaWJsZSB0byAKICAgICAgICAgICAgcnVuIHRoZSBydW50aW1lIHRlc3RzIHRocm91Z2ggdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgUlVOVE9PTD0idmFsZ3JpbmQgLS1sZWFrLWNoZWNrPWZ1bGwiCgogICAgICAgICAgICBvciBpbnZva2UgU1dJRyB1bmRlciB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBTV0lHVE9PTD0idmFsZ3JpbmQgLS10b29sPW1lbWNoZWNrIgoKMDUvMTkvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGRlZmluZSB0aGF0IHdhcyBicmVha2luZyBwcmUtMi43LiAgQ2hlY2tlZCBpbgogICAgICAgICAgICBwYXRjaCBmcm9tIFNvcmVuIFNvbm5lbmJ1cmcgdGhhdCBjcmVhdGVzIHN0cmluZ3MgaW4gIAoJICAgIHZlcnNpb24gaW5kZXBlbmRlbnQgd2F5CgowNS8xNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHZhcmlhYmxlIG5hbWUgY2xhc2ggaW4gZGlyZWN0b3JzIC0gU0YgIzE5NjMzMTYgcmVwb3J0ZWQgYnkgVHJpc3Rhbi4KCjA1LzE0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBhbiBvcHRpbWlzYXRpb24gZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBvYmplY3RzIGJ5IHZhbHVlLCByZWR1Y2luZwogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIG1hZGUuIEltcGxlbWVudGVkIHVzaW5nIGFuCiAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbiB0aGUgIm91dCIgdHlwZW1hcCBjYWxsZWQgIm9wdGltYWwiLiBEZXRhaWxzIGluIAogICAgICAgICAgICBUeXBlbWFwcy5odG1sLgoKMDUvMTEvMjAwODogb2xseQoJICAgIFtQSFBdIENoZWNrIGZvciAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSB3aGVuIGdlbmVyYXRpbmcgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXIuCgowNS8xMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzE5NDM2MDggLSAkc2VsZiBzdWJzdGl0dXRpb24gaW4gJWNvbnRyYWN0LCBwYXRjaCBzdWJtaXR0ZWQgYnkKICAgICAgICAgICAgVG9vbiBWZXJzdHJhZWxlbi4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggY2hhciAqIHR5cGVtYXBzIHRvIHdvcmsgd2hlbiBhcHBsaWVkIHRvIHNpZ25lZCBjaGFyICogYW5kCgkgICAgdW5zaWduZWQgY2hhciAqICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXBwbHlfc3RyaW5ncykuCgowNS8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY2hhciAqIG1lbWJlciB2YXJpYWJsZXMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBiYWQgUEhQIGNvZGUgZ2VuZXJhdGVkIHdoZW4gd3JhcHBpbmcgYW4gZW51bSBpbiBhCgkgICAgbmFtZXNwYWNlICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXJyYXlzX3Njb3BlKS4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBTV0lHIG5vdyBydW5zIHRoZSBQSFAgdGVzdHN1aXRlIHVzaW5nIFBIUDUsIG5vdCBQSFA0LiAgUEhQNAoJICAgIGlzIGVzc2VudGlhbGx5IG9ic29sZXRlIG5vdywgc28gd2UgY2FyZSBtdWNoIG1vcmUgYWJvdXQgc29saWQgUEhQNQoJICAgIHN1cHBvcnQuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTVEwgZml4ZXMgd2hlbiB1c2luZyAlaW1wb3J0IHJhdGhlciB0aGFuICVpbmNsdWRlIGFuZCB0aGUgU29sYXJpcyBXb3Jrc2hvcAogICAgICAgICAgICBjb21waWxlciBhbmQgdGhlIFJvZ3Vld2F2ZSBTVEwuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2Ygb3ZlcmxvYWRlZCBwcm90ZWN0ZWQgbWV0aG9kcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBDb21taXQgcGF0Y2ggIzE5NTY2MDcgdG8gYWRkIC1NVCBzdXBwb3J0IGZyb20gUmljaGFyZCBCb3VsdG9uLgogICAgICAgICAgICBUaGlzIHBhdGNoIG1pcnJvcnMgdGhlIGdjYyAtTVQgb3B0aW9uIHdoaWNoIGFsbG93cyBvbmUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgICAgICAgIE1ha2VmaWxlIHRhcmdldCBiZWluZyBnZW5lcmF0ZWQgd2hlbiBnZW5lcmF0aW5nIG1ha2VmaWxlcyB3aXRoIHRoZSAtTSBmYW1pbHkKICAgICAgICAgICAgb2Ygb3B0aW9ucy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICQgc3dpZyAtamF2YSAtTU0gLU1UIG92ZXJyaWRkZW5uYW1lIC1jKysgIGV4YW1wbGUuaQogICAgICAgICAgICAgIG92ZXJyaWRkZW5uYW1lOiBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCjA0LzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgW0x1YV0gUmVtb3ZlZCBnZW5lcmF0aW9uIG9mIF93cmFwX2RlbGV0ZV9YWFhYWCAod3JhcHBlcmVkIGRlc3RydWN0b3IpCgkgICAgd2hpY2ggd2FzIHVudXNlZCBhbmQgY2F1c2luZyB3YXJuaW5nIHdpdGggZysrIC1XYWxsLgoJICAgIFJlbW92ZWQgb3RoZXIgdW51c2VkIHdhcm5pbmcgaW4gdHlwZW1hcHMuaSBhbmQgb3RoZXIgcGxhY2VzLgoJICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9lbWJlZDMsIGFuZCBydW4gdGVzdHMgYSBmZXcgdGVzdCBjYXNlcy4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIElCTSdzIEMrKyBjb21waWxlciBvbiBBSVggKHBhdGNoCgkgICAgZnJvbSBHb2VyYW4gVWRkZWJvcmcgaW4gU0YjMTkyODA0OCkuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgUmVuYW1lIEJTSVpFIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvYXJyYXlzX3Njb3BlLmkgdG8gQkJTSVpFIHRvCgkgICAgYXZvaWQgYSBjbGFzaCB3aXRoIEJTSVpFIGRlZmluZWQgYnkgaGVhZGVycyBvbiBBSVggd2l0aCBQZXJsCgkgICAgKHJlcG9ydGVkIGluIFNGIzE5MjgwNDgpLgoKMDQvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IHRvIHdyYXAgYWxsIHByb3RlY3RlZCBtZW1iZXJzIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgdGhlIHZpcnR1YWwgbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICBOb3cgYWxsIHByb3RlY3RlZCBtZW1iZXJzLCAoc3RhdGljIGFuZCBub24tc3RhdGljIHZhcmlhYmxlcywgbm9uLXZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICBhbmQgc3RhdGljIG1ldGhvZHMpIGFyZSB3cmFwcGVkIHdoZW4gdXNpbmcgdGhlIGFsbHByb3RlY3RlZCBtb2RlLiBUaGUgYWxscHJvdGVjdGVkCiAgICAgICAgICAgIG1vZGUgaXMgdHVybmVkIG9uIGluIHRoZSBtb2R1bGUgZGVjbGFyYXRpb246CgogICAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIiwgYWxscHJvdGVjdGVkPSIxIikgbW9kdWxlbmFtZQoKVmVyc2lvbiAxLjMuMzUgKDcgQXByaWwgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFkZCBtaXNzaW5nIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzCgowNC8wNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3RhY2sgb3ZlcmZsb3cgd2hlbiB1c2luZyB0eXBlbWFwIHdhcm5pbmcgc3VwcHJlc3Npb24sIGVnIAogICAgICAgICAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1RZUEVNQVBfQ0hBUkxFQUtfTVNHKQoKMDQvMDUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgc28gdGhhdCAlcHl0aG9ubm9uZHluYW1pYyBjYW4gYmUgdXNlZC4gQWxzbyBjb3JyZWN0cwogICAgICAgICAgICBkaXNwbGF5IG9mIHRoZSBwcm94eSBjbGFzcyB0eXBlLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDQvMDQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFkZCAlbmV3b2JqZWN0IHJlZmVyZW5jZSB0byBweXRob24gbWVtb3J5IG1hbmFnZW1lbnQgc3Vic2VjdGlvbiBvZiBtYW51YWwKCSAgICAocGF0Y2ggZnJvbSBtZGJlYWNoeSBpbiBTRiMxODk0NjEwKS4KCjAzLzI3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHdoZXJlIHRoZSBwb2ludGVyIHR5cGUgaXMgYSB0ZW1wbGF0ZWQgdHlwZSB3aXRoCiAgICAgICAgICAgIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowMy8yNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHR5cGVtYXAgRElTT1dOIGZvciBTV0lHVFlQRSogYW5kIFNXSUdUWVBFW10sIGFuZCBzdXBwb3J0IGZvciAlZGVsb2JqZWN0IGZlYXR1cmUuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9vd25lciB3aGljaCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE4NDQzMDEgZnJvbSBNb250eSBUYXlsb3IgdG8gc3VwcHJlc3MgZW51bSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB1bnVzZWQgd2FybmluZ3MuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNDUyNCBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggZW5zdXJlcyB0aGUKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHdoZW4gYXR0ZW1wdGluZyB0byBjYWxsIGEKICAgICAgICAgICAgY29uc3RydWN0b3Igb24gYSBjbGFzcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHdyYXBwZXIsIGVnIGlmCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgaXMgYWJzdHJhY3QuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNTcwMiBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggcmVtb3ZlcyB3YXJuaW5nIDUxMgogICAgICAgICAgICBmb3Igc3RkOjp2ZWN0b3Igd3JhcHBlcnMuCgowMy8yNi8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQXBwbHkgR0NDIDQuMyB3YXJuaW5ncyBwYXRjaCBmcm9tIFBoaWxpcHAgVGhvbWFzCgkgICAgKFNGIzE5MjUxMjIpLgoKMDMvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gVGhyZWFkIHNhZmV0eSBwYXRjaCBmb3IgU1RMIGl0ZXJhdG9ycyBmcm9tIEFiaGluYW5kYW4gSmFpbi4KCjAzLzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkICVsdWFjb2RlIGZlYXR1cmUgdG8gYWRkIHNvdXJjZSBjb2RlIGludG8gd3JhcHBlcnMuCiAgICAgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGlzLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvYXJyYXlzIHRvIHNob3cgaXRzIHVzZSAoYW5kIHR5cGVtYXBzKQoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBub25wb3J0YWJsZSBzZWQgdXNhZ2Ugd2hpY2ggZmFpbGVkIG9uIE1hYyBPUyBYIChhbmQgcHJvYmFibHkKCSAgICBvdGhlciBwbGF0Zm9ybXMpLiAgRml4ZXMgU0YjMTkwMzYxMi4KCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbWVtb3J5IGxlYWsgaW4gU1dJRydzIHBhcnNlciAoYmFzZWQgb24gcGF0Y2ggZnJvbSBSdXNzZWxsCgkgICAgQnJ5YW50IGluIFNGIzE5MTQwMjMpLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTg3ODI4NSAtIHVubmVjZXNzYXJ5IGNhc3QgZm9yIEMgc3RydWN0IGNyZWF0aW9uIHdyYXBwZXJzLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIGRlYnVnZ2luZyBpbmZvIHdoZW4gdXNpbmcgc2hhcmVkX3B0ciBzdXBwb3J0CgowMy8wNi8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGVkIGRvY3VtZW50YXRpb24gZm9yIEx1YSBleGNlcHRpb25zLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZXhjZXB0aW9uIGFuZCBFeGFtcGxlcy9sdWEvZW1iZWQyLgogICAgICAgICAgICBTbWFsbCB1cGRhdGVzIHRvIHRoZSB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQWRkIGNoYXIgKiYgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb2NjYXNpb25hbCBzZWcgZmF1bHQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlcG9ydCBvdmVybG9hZGVkIG1ldGhvZHMgYXMgYmVpbmcgaWdub3JlZC4KCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggIzE5MDQ1MzcgU3dpZyBjYXVzZXMgYSBQZXJsIHdhcm5pbmcgInggdXNlZCBvbmx5IG9uY2UiIGluIFBlcmwgNS4xMAogICAgICAgICAgICByZXBvcnRlZCBieSBBcmkgSm9sbWEKCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzaGFyZWRfcHRyIHZhcmluL3Zhcm91dCB0eXBlbWFwcyBmb3Igd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlcy4KCjAyLzI1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkd3JhcG5hbWUgdG8gd29yayBpbiAlZXhjZXB0aW9uIChmaXhlcyBzb21lIHdyYXA6bmFtZSBhc3NlcnRpb25zKQoKVmVyc2lvbiAxLjMuMzQgKDI3IEZlYnJ1YXJ5IDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZXMuCgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGZvciB1c2Ugd2l0aGluICVleGNlcHRpb246CiAgICAgICAgICAgICAgJHdyYXBuYW1lIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgd3JhcHBlciBuYW1lCiAgICAgICAgICAgICAgJG92ZXJuYW1lIC0gaWYgYSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIGNvbnRhaW5zIHRoZSBleHRyYSBtYW5nbGluZyB1c2VkIG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdmVybG9hZGVkIG1ldGhvZAogICAgICAgICAgICAgICRkZWNsICAgICAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICAgICAgJGZ1bGxkZWNsIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSByZXR1cm4gdHlwZQoKMDIvMTIvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIE5vdyBzZXR0aW5nIFM0IGZsYWcgaW4gU1dJRyBjcmVhdGVkIG9iamVjdHMuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIFItU1dJRyBmb3IgMi42IGFuZCB3YXJuaW5nIGZvciAyLjYgZmFpbHVyZSBoYXMgYmVlbiByZW1vdmVkLgoKMDIvMTEvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBwYXRjaCBieSBUb3JzdGVuIExhbmRzY2hvZmYgdG8gZml4IHRoZSB1bmFyeSBtaW51cyBpc3N1ZQogICAgICAgICAgICBSYW4gJ2FzdHlsZSAtLXN0eWxlPWtyIC0yJyBhY3Jvc3MgbHVhLmN4eCB0byBuZWF0ZW4gaXQgdXAKCjAyLzEwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1bXAgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gNC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIEFQSSAKICAgICAgICAgICAgY2hhbmdlIGluIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgaWUgY2hhbmdlIGluIGRlZmluaXRpb24gb2Ygc3dpZ19jb252ZXJ0ZXJfZnVuYy4KICAgICAgICAgICAgQW55b25lIGNhbGxpbmcgU1dJR19UeXBlQ2FzdCBtdXN0IHBhc3MgaW4gYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIG5ldyBhZGRpdGlvbmFsCiAgICAgICAgICAgICh0aGlyZCkgcGFyYW1ldGVyIGFuZCB0aGVuIGhhbmRsZSB0aGUgbmV3bHkgY3JlYXRlZCBtZW1vcnkgaWYgdGhlIHJldHVybmVkIHZhbHVlCiAgICAgICAgICAgIGlzIHNldCB0byBTV0lHX0NBU1RfTkVXX01FTU9SWSBlbHNlIGEgbWVtb3J5IGxlYWsgd2lsbCBlbnN1ZS4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkLiBVc2FnZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjZW50bHkKICAgICAgICAgICAgYWRkZWQgSmF2YSBhbmQgQyMgc2hhcmVkX3B0ciB0eXBlbWFwcy4gVHdvIG1hY3JvcyBhcmUgYXZhaWxhYmxlLCBhbHRob3VnaCB0aGVzZQogICAgICAgICAgICBtYXkgd2VsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKCiAgICAgICAgICAgIEZvciBiYXNlIGNsYXNzZXMgb3IgY2xhc3NlcyBub3QgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW46CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgIEZvciBkZXJpdmVkIGNsYXNzZXM6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKCiAgICAgICAgICAgIFRoZSBQUk9YWUNMQVNTIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm94eSBjbGFzcywgYnV0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIEphdmEvQyMuCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVpbmNsdWRlICJib29zdF9zaGFyZWRfcHRyLmkiCgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihLbGFzcywgU3BhY2U6OktsYXNzKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKEtsYXNzRGVyaXZlZCwgU3BhY2U6OktsYXNzLCBTcGFjZTo6S2xhc3NEZXJpdmVkKQoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3NEZXJpdmVkIDogS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGdXJ0aGVyIGRldGFpbHMgdG8gZm9sbG93IGluIGZ1dHVyZSBkb2N1bWVudGF0aW9uLCBidXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlcwogICAgICAgICAgICBzaG91bGQgYmUgbm90ZWQ6CgogICAgICAgICAgICAtIE5vdCByZXN0cmljdGVkIHRvIGJvb3N0OjpzaGFyZWRfcHRyLCBlZyBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZSB1c2VkLgogICAgICAgICAgICAtIEF2YWlsYWJsZSB0eXBlbWFwIGdyb3VwczoKICAgICAgICAgICAgICAoYSkgVHlwZW1hcHMgZm9yIHNoYXJlZF9wdHIgcGFzc2VkIGJ5IHZhbHVlLCByZWZlcmVuY2UsIHBvaW50ZXIgYW5kIHBvaW50ZXIgCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4KICAgICAgICAgICAgLSAoYikgVHlwZW1hcHMgZm9yIHBhc3NpbmcgYnkgcmF3IHZhbHVlLCByYXcgcG9pbnRlciwgcmF3IHJlZmVyZW5jZSwgcmF3IHBvaW50ZXIKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLiAKICAgICAgICAgICAgLSBUaGUgY29kZSBiZWluZyB3cmFwcGVkIGRvZXMgbm90IGV2ZW4gaGF2ZSB0byB1c2Ugc2hhcmVkX3B0ciwgU1dJRyBjYW4gdXNlCiAgICAgICAgICAgICAgc2hhcmVkX3B0ciBhcyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGEgcmF3IHBvaW50ZXIgZHVlIHRvIAogICAgICAgICAgICAgIHRoZSB0eXBlbWFwcyBpbiBncm91cCAoYikgYWJvdmUuCiAgICAgICAgICAgIC0gTm8gYXJyYXkgc3VwcG9ydCBhcyBzaGFyZWRfcHRyIGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzLgogICAgICAgICAgICAtIFRoaXMgd29ya3MgcXVpdGUgZGlmZmVyZW50bHkgdG8gdGhlIHVzdWFsIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IHdoZW4KICAgICAgICAgICAgICBvcGVyYXRvci0+IGlzIHBhcnNlZCBieSBTV0lHOgogICAgICAgICAgICAgIC0gQW4gYWRkaXRpb25hbCBzbWFydCBwb2ludGVyIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQgcmVkdWNpbmcgY29kZSBibG9hdCBpbgogICAgICAgICAgICAgICAgdGhlIHdyYXBwZXJzLgogICAgICAgICAgICAgIC0gVXNpbmcgc21hcnQgcG9pbnRlcnMgYW5kIHJhdyBwb2ludGVycyBjYW4gYmUgbWl4ZWQgc2VhbWxlc3NseS4KICAgICAgICAgICAgICAtIE1pc3NpbmcgY29uc3RydWN0b3JzIGZvciB0aGUgc21hcnQgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSBhbmQgc28KICAgICAgICAgICAgICAgIHNlcGFyYXRlIGZhY3RvcnkgdHlwZSBmdW5jdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUgd3JpdHRlbiBhbmQgd3JhcHBlZC4KICAgICAgICAgICAgICAtIFRoZSBpbXBsaWNpdCBDKysgc2hhcmVkX3B0cjwgZGVyaXZlZCBjbGFzcyA+IHRvIHNoYXJlZF9wdHI8IGJhc2UgY2xhc3MgPgogICAgICAgICAgICAgICAgY2FzdCBhbHNvIHdvcmtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgbmVnYXRlcyB0aGUgbmVjZXNzaXR5IHRvIHdyaXRlCiAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCBoZWxwZXIgY2FzdCBmdW5jdGlvbiBwcm92aWRpbmcgdGhlIHVwY2FzdCB3aGljaCB3b3VsZCBuZWVkCiAgICAgICAgICAgICAgICBjYWxsaW5nIHByaW9yIHRvIHBhc3NpbmcgYSBkZXJpdmVkIGNsYXNzIHRvIGEgbWV0aG9kIHRha2luZyBhIHNoYXJlZF9wdHIgdG8KICAgICAgICAgICAgICAgIGEgYmFzZSBjbGFzcy4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBjbGFzcyByZWdpc3RyYXRpb24gZnVuY3Rpb24gdmlhIGEgbmV3CiAgICAgICAgICAgICJzbWFydHB0ciIgZmVhdHVyZS4gVGhpcyBpcyBhIHZlcnkgbG93IGxldmVsIG9mIGN1c3RvbWlzYXRpb24gbW9zdCB1c2VycwogICAgICAgICAgICB3b3VsZCBuZXZlciBuZWVkIHRvIGtub3cuIFRoZSBmZWF0dXJlIHdpbGwgdHlwaWNhbGx5IGJlIHVzZWQgZm9yIGludHJ1c2l2ZSAKICAgICAgICAgICAgc21hcnQgcG9pbnRlcnMgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIHR5cGVtYXBzLiBFeGFtcGxlIHVzYWdlIG9mIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPTEpIEZvbyB7IGJvb3N0OjpzaGFyZWRfcHRyPCBGb28gPiB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBGb29fc3dpZ3JlZ2lzdGVyIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWdpc3RlciBib29zdDo6c2hhcmVkIDwgRm9vID4KICAgICAgICAgICAgKFNXSUdUWVBFX3BfYm9vc3RfX3NoYXJlZF9wdHJURm9vX3QgaW5zdGVhZCBvZiBTV0lHVFlQRV9wX0ZvbykgYXMgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgdHlwZSBmb3IgaW5zdGFudGlhdGlvbnMgb2YgRm9vLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRmVhdHVyZXMgbm93IHN1cHBvcnRzIHRoZSBvcHRpb25hbCAnbm9ibG9jaycgYXR0cmlidXRlIGZvciBhbGwgdXNhZ2Ugb2YgJWZlYXR1cmUuIAogICAgICAgICAgICBXaGVuIHNwZWNpZmllZCwgdGhlIHsgfSBicmFjZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZmVhdHVyZSBjb2RlLiBUaGlzIGlzIGlkZW50aWNhbAogICAgICAgICAgICBpbiBiZWhhdmlvdXIgdG8gdXNhZ2Ugb2YgJ25vYmxvY2snIGluIHR5cGVtYXBzIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByZXByb2Nlc3NvcgogICAgICAgICAgICBpcyByZXF1aXJlZCB0byBvcGVyYXRlIG9uIHRoZSBjb2RlIGluIHRoZSBmZWF0dXJlIGFuZCB0aGUgZW5jbG9zaW5nIHsgfSBicmFjZXMKICAgICAgICAgICAgYXJlIG5vdCByZXF1aXJlZC4gRXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBGT08gZm9vCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0iMSIpIHsgRk9POjpiYXIgfQoKICAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciB0aGVuIHJlZHVjZXMgdGhpcyBhcyBpZiB0aGlzIGhhZCBiZWVuIHVzZWQgaW5zdGVhZDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIikgImZvbzo6YmFyIgoKMDIvMDEvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBmb3JtYXQgc3RyaW5nIGJ1ZyAoU0YjMTg4MjIyMCkuCgowMS8zMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbnMgdG8gdGhlICV0eXBlcyBkaXJlY3RpdmUuIE5vdyB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBjYW4gYmUKICAgICAgICAgICAgb3ZlcnJpZGRlbiB0byBzb21lIGN1c3RvbSBjb2RlIGluIHRoZSAldHlwZXMgZGlyZWN0aXZlLCBsaWtlIHNvOgoKICAgICAgICAgICAgICAldHlwZXMoZnJvbXR5cGUgPSB0b3R5cGUpICV7CiAgICAgICAgICAgICAgICAuLi4gY29kZSB0byBjb252ZXJ0IGZyb210eXBlIHRvIHRvdHlwZSBhbmQgcmV0dXJuIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgc3BlY2lhbCB2YXJpYWJsZSAkZnJvbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgICAgIHR5cGUgYmVpbmcgY29udmVydGVkIGZyb20uIFRoZSBjb2RlIG11c3QgcmV0dXJuIHRoZSB0b3R5cGUgY2FzdCB0byB2b2lkICouIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFRpbWU7CiAgICAgICAgICAgICAgY2xhc3MgRGF0ZTsKICAgICAgICAgICAgICBEYXRlICZUaW1lOjpkYXRlRnJvbVRpbWUoKTsKCiAgICAgICAgICAgICAgJXR5cGVzKFRpbWUgPSBEYXRlKSAlewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopJGZyb207CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBsb29raW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICBzdGF0aWMgdm9pZCAqX3BfVGltZVRvX3BfRGF0ZSh2b2lkICp4KSB7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKil4OwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIHBsZWFzZSB1c2Ugb25seSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4KCjAxLzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgU21hbGwgdXBkYXRlIHRvIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbCwgdG8gd2FybiBhYm91dCB1c2Ugb2YgbG9jYWwgCgkgICAgdmFyaWFibGVzIGluIHR5cGVtYXBzIGZvciBtdWx0aXBsZSB0eXBlcy4KCjAxLzI1LzIwMDg6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCBidWcgcmVwb3J0ZWQgYnkgS2V2aW4gTWlsbHMgaW4gQVJSQVlTT0ZDTEFTU0VTIHR5cGVtYXBzIHdoZXJlIGFueQogICAgICAgICAgICBjaGFuZ2VzIG1hZGUgdG8gYW4gYXJyYXkgZWxlbWVudCBwYXNzZWQgZnJvbSBKYXZhIHRvIEMgYXJlIG5vdCByZWZsZWN0ZWQgYmFjawogICAgICAgICAgICBpbnRvIEphdmEuCgowMS8yNC8yMDA4OiBtZ29zc2FnZQoJICAgIE1vcmUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICBBbHNvIGxvb2tzIGluIC91c3IvaW5jbHVkZS9sdWEqCgkgICAgQWxzbyBjaGFuZ2VkIHR5cGVtYXBzLmkgbm90IHRvIGNoZWNrIGZvciBOVUxMIGJlZm9yZSBmcmVlaW5nIGEgcG9pbnRlcgoKMDEvMjEvMjAwODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGb3IgU1RMIGNvbnRhaW5lcnMsIFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIGNvbnZlcnQgZnJvbSBvbmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lciB0byBhbm90aGVyLCBlZyBmcm9tIHN0ZDo6dmVjdG9yPGludD4gdG8gc3RkOjp2ZWN0b3I8ZG91YmxlPgogICAgICAgICAgICBvciBzdGQ6Omxpc3Q8aW50PiB0byBzdGQ6OnZlY3RvcjxpbnQ+IG9yIGV2ZW4gc3RkOjp2ZWN0b3I8Rm9vPiB0bwogICAgICAgICAgICBzdGQ6OnZlY3RvcjxCYXI+IGFzIGl0IHByZXZpb3VzbHkgZGlkLiBJbiBmYWN0IFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvCiAgICAgICAgICAgIGNvbnZlcnQgYW55IFNXSUcgd3JhcHBlZCBDKysgcHJveHkgY2xhc3MgdGhhdCBpcyBhbHNvIGEgUHl0aG9uIHNlcXVlbmNlLAogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQuIEFueSBub24tU1dJRyBQeXRob24gc2VxdWVuY2Ugd2lsbCBzdGlsbCBiZQogICAgICAgICAgICBhY2NlcHRlZCB3aGVyZXZlciBhbiBTVEwgY29udGFpbmVyIGlzIGFjY2VwdGVkLiBPdmVybG9hZGVkIG1ldGhvZHMgdXNpbmcKICAgICAgICAgICAgY29udGFpbmVycyBzaG91bGQgYmUgZmFzdGVyLgoKMDEvMTgvMjAwODogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAnZGlyZWN0b3JpbmF0dHJpYnV0ZXMnIGFuZCAnZGlyZWN0b3JvdXRhdHRyaWJ1dGVzJyB0eXBlbWFwIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRoZSBpbXR5cGUgdHlwZW1hcC4gVGhlc2Ugc2hvdWxkIGNvbnRhaW4gQyMgYXR0cmlidXRlcyB3aGljaCB3aWxsCiAgICAgICAgICAgIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBDIyBkaXJlY3RvciBkZWxlZ2F0ZSBtZXRob2RzLgoKMDEvMTgvMjAwODogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBieXRlIHZhbHVlIDI1NSBpbiBpbnB1dCBmaWxlcyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBjaGFyIGlzIHNpZ25lZCAoaXQgd2FzIGdldHRpbmcgbWFwcGVkIHRvIEVPRikuICBGaXhlcyBTRiMxNTE4MjE5LgoKMDEvMTYvMjAwODogd3NmdWx0b24KCSAgICBGaXggdGVtcGxhdGUgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVkIGJ5IGEgc21hcnQgcG9pbnRlci4gQnVnIHJlcG9ydGVkIAogICAgICAgICAgICBieSBSb2JlcnQgTHVwdG9uLgoKMDEvMTQvMjAwODogbWdvc3NhZ2UKCSAgICBTdWJzdGFudGlhbCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgICBDb2RlIGNhbiBub3cgbGluayB0byBsaWJsdWEuYSwgbGlibHVhNTAuYSBvciBsaWJsdWE1MS5hCgkgICAgICBJdCdzIGFsc28gYSBsb3QgbmVhdGVyIG5vdy4KCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEJhY2tlZCBvdXQgIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICoKCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODMyNjEzIC0gVGVtcGxhdGVzIGFuZCBzb21lIHR5cGVkZWZzIGludm9sdmluZyBwb2ludGVycyBvciBmdW5jdGlvbiBwb2ludGVycwoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMxNjMyNjI1IC0gQ29tcGlsYXRpb24gZXJyb3JzIG9uIFZpc3VhbCBDKysgNiB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKi4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODE5ODQ3ICV0ZW1wbGF0ZSB3aXRoIGp1c3Qgb25lIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVyIAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gaW50PiBjbGFzcyBGb28gey4uLn07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0RlZmF1bHQpIEZvbzw+OwoKMTIvMTIvMjAwNzogbWdvc3NhZ2UKCSAgICBbTHVhXSBTbWFsbCBjb3JyZWN0aW9uIG9uIEx1YS5odG1sCgoxMi8wOS8yMDA3OiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMxODM4MjQ4IGZyb20gTW9udHkgVGF5bG9yIGZvciB2cGF0aCBidWlsZHMgb2YgU1dJRy4KCjEyLzA4LzIwMDc6IHdzZnVsdG9uCgkgICAgW0x1YV0gRml4ZXMgdG8gcmVtb3ZlIGdjYy00LjIgd2FybmluZ3MKCjEyLzA2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxNzM0NDE1IC0gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIHRfaXRlbSwgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIHRfYWxsb2MgPSBwZmM6OmFsbG9jX2Zhc3QgPgogICAgICAgICAgICAgICAgY2xhc3MgbGlzdF90IDogcHVibGljIGxpc3RfaW1wbF90PHRfaXRlbSxwZmM6OmFycmF5X3Q8dF9pdGVtLHRfYWxsb2M+ID4geyAuLi4gfTsKCjEyLzA0LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gRml4IGEgYnVnIGluIHRoZSBjbGFzcyBoaWVyYWNoeSBjb2RlLCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG5vdCBwcm9wYWdhdGVkLCAKCSAgICBpZiB0aGUgbmFtZSBvcmRlcmluZyB3YXMgaW4gYSBjZXJ0YWluIG9yZGVyLgoJICAgIEFkZGVkIG5ldyBleGFtcGxlIHByb2dyYW1zIChkdWFsLCBlbWJlZCkgYW5kIHJ1bnRpbWUgdGVzdHMgZm9yIHRlc3Qtc3VpdGUuCgoxMS8zMC8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCB1c2luZyBzdGF0ZW1lbnRzIHVzaW5nIGEgYmFzZSBjbGFzcyBtZXRob2Qgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBvdmVybG9hZGVkLgogICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZSB1c2luZyBzdGF0ZW1lbnRzIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zLCB0aGVzZQogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgd3JhcHBlcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmsoKTsKICAgICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmZ1bms7CiAgICAgICAgICAgICAgfTsKClZlcnNpb24gMS4zLjMzIChOb3ZlbWJlciAyMywgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24KCSAgICBmcm9tIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrCgkgICAgY29kZS4KCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggbWFueSBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20KCSAgICBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKyBjb2RlCgkgICAgd2hlbiBjb21waWxpbmcgd2l0aCBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiBQSFAgNSAodGVzdGVkIHdpdGgKCSAgICBQSFAgNS4yLjMsIGJ1dCBQSFAgNS4yLjEgaXMgcHJvYmFibHkgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQpLgoKMTAvMTUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzE3OTcxMzMgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MgZml4ZXMgJWF0dHJpYnV0ZSB3aGVuIHRoZSBnZXR0ZXIgaGFzIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgYXMgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCBubyBsb25nZXIgZ2VuZXJhdGUgbm9uLWZ1bmN0aW9uYWwgc2V0dGVyIGZvciByZWFkLW9ubHkgYXR0cmlidXRlcy4KCjEwLzE1LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBQcmV2ZW50IFNXSUdfVGNsX0NvbnZlcnRQdHIgZnJvbSBjYWxsaW5nIHRoZSB1bmtub3duIHByb2MuCgkgICAgQWRkIEV4YW1wbGVzL3RjbC9zdGRfdmVjdG9yLyB3aGljaCB0aGlzIGNoYW5nZSBmaXhlcy4gIFBhdGNoCgkgICAgaXMgZnJvbSAiQ2xpZmYgQyIgaW4gU0YjMTgwOTgxOS4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgRGV0YWNoQ3VycmVudFRocmVhZCBiYWNrIGluIGZvciBkaXJlY3RvcnMuIFNlZSBlbnRyeSBkYXRlZCAwOC8xMS8yMDA2IGFuZAogICAgICAgICAgICBzZWFyY2ggZm9yIERldGFjaEN1cnJlbnRUaHJlYWQgb24gdGhlIG1haWxpbmcgbGlzdHMgZm9yIGRldGFpbHMuIFRoZSBjcmFzaGVzIG9uIFNvbGFyaXMKICAgICAgICAgICAgc2VlbSB0byBiZSBvbmx5IHByZXNlbnQgaW4gamRrLTEuNC4yIGFuZCBsb3dlciAoamRrLTEuNS4wIGFuZCBqZGstMS42LjAgYXJlIG9rYXkpLCBzbwogICAgICAgICAgICBhbnlvbmUgdXNpbmcgZGlyZWN0b3JzIHNob3VsZCB1c2UgYSByZWNlbnQgamRrIG9uIFNvbGFyaXMsIG9yIGRlZmluZSAoc2VlIGRpcmVjdG9yLnN3ZykKICAgICAgICAgICAgU1dJR19KQVZBX05PX0RFVEFDSF9DVVJSRU5UX1RIUkVBRCB0byB0aGUgQysrIGNvbXBpbGVyIHRvIGdldCBvbGQgYmVoYXZpb3VyLgoKMTAvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIEMgY29tbWVudHMgaW4gdGhlIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMuCgoxMC8xMi8yMDA3OiB3dXp6ZWIKCSAgICBBZGRlZCBhIHRlc3RzdWl0ZSBlbnRyeSBmb3IgQnVnICMxNzM1OTMxCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQXV0b21hdGljYWxseSByZXJ1biBhdXRvZ2VuLnNoIGlmIGNvbmZpZ3VyZS5pbiBpcyBtb2RpZmllZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBFbmhhbmNlIGNoZWNrLSUtdGVzdC1zdWl0ZSBydWxlIGFuZCBmcmllbmRzIHRvIGdpdmUgYSBtb3JlIGhlbHBmdWwKCSAgICBlcnJvciBtZXNzYWdlIGlmIHlvdSB0cnkgdGhlbSBmb3IgYSBsYW5ndWFnZSB3aGljaCBkb2Vzbid0IGV4aXN0CgkgICAgKGUuZy4gIm1ha2UgY2hlY2stcGhwLXRlc3Qtc3VpdGUiIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CgkgICAgIm1ha2UgY2hlY2stcGhwNC10ZXN0LXN1aXRlIikuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQWRkIG1ha2UgcnVsZSB0byByZWdlbmVyYXRlIE1ha2VmaWxlIGZyb20gTWFrZWZpbGUuaW4gaWYgaXQgaGFzCgkgICAgY2hhbmdlZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbG9uZy1zdGFuZGluZyBtZW1vcnkgbGVhayBpbiB3cmFwcGVkIGNvbnN0cnVjdG9ycyBhbmQKCSAgICB3cmFwcGVkIGZ1bmN0aW9ucy9tZXRob2RzIHdoaWNoIHJldHVybiBhbiBvYmplY3QuCgoxMC8wOC8yMDA3OiBvbGx5CgkgICAgRml4IE1ha2VmaWxlLmluIHRvIHJlYWQgY2hlY2subGlzdCBmaWxlcyBjb3JyZWN0bHkgaW4gYSBWUEFUSAoJICAgIGJ1aWxkLgoKMTAvMDcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZAoKMDkvMjcvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBhZGRlZCBtb3JlIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCB0eXBlY2hlY2tzLgoJICAgIEFkZGVkIGEgcm91dGluZSB3aGljaCBjaGVja3MgdGhlIGV4YWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBhIGZ1bmN0aW9uCgkgICAgKGJyZWFrcyBvcGVyYXRvcl9vdmVybG9hZGluZyBmb3IgdW5hcnkgbWludXMgb3BlcmF0b3IsIGN1cnJlbnRseSBkaXNhYmxlZCkuCgkgICAgUmVvcmdhbmlzZWQgdGhlIGx1YXR5cGVtYXBzLnN3ZyB0byB0aWR5IGl0IHVwLgoJICAgIEFkZGVkIGEgbG90IG9mICVpZ25vcmVzIG9uIHRoZSBvcGVyYXRvcnMgbm90IHN1cHBvcnRlZCBieSBsdWEuCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgY29uc3RhbnQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzICYgcnVudGVzdCBmb3IgbWVtYmVyX3BvaW50ZXIuaQoJICAgIEFkZGVkIGZpcnN0IHZlcnNpb24gb2Ygd2NoYXIuaQoKMDkvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSB0aHJvd3MgdHlwZW1hcHMgZm9yIHN0ZDo6d3N0cmluZyB1c2luZyBDIyBwYXRjaCAjMTc5OTA2NCBmcm9tIERhdmlkIFBpZXBncmFzcwoKMDkvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgIzE3NzEzMTMgdG8gZml4IGJ1ZyAjMTY1MDIyOSAtIGZpeGVzIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nCiAgICAgICAgICAgIGhhbmRsaW5nLgoKMDkvMjAvMjAwNzogb2xseQoJICAgIFtKYXZhXSBFbGltaW5hdGUgc29tZSB1bm5lY2Vzc2FyeSB1c2VzIG9mIGEgdGVtcG9yYXJ5IGJ1ZmZlcgoJICAgIGFsbG9jYXRlZCB1c2luZyBuZXdbXS4gIFNGIzE3OTY2MDkuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIGNhbiBiZSB1c2VkIGluIHRoZSBjc3ZhcmluIHR5cGVtYXAgd2hlcmUgaXQgaXMgYWx3YXlzCiAgICAgICAgICAgIGV4cGFuZGVkIHRvICd2YWx1ZScuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBidWcgcmVwb3J0ZWQgYnkgR2xlbm4gQSBXYXRzb24gYW5kICMxNzk1MjYwIHdoZXJlIHRoZSBjc3R5cGUgdHlwZW1hcCB1c2VkIHRoZSAncmVmJwogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSB0eXBlbWFwIGJvZHksIGl0IHByb2R1Y2VkIHVuY29tcGlsYWJsZSBDIyBwcm9wZXJ0aWVzICh2YXJpYWJsZSB3cmFwcGVycykuCiAgICAgICAgICAgIFRoZSB0eXBlIGZvciB0aGUgcHJvcGVydHkgbm93IGNvcnJlY3RseSBjb21lcyBmcm9tIHRoZSAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGNzdHlwZSB0eXBlbWFwLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBjb25zdCBzdGQ6OndzdHJpbmcmIHR5cGVtYXBzCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgcmVmZXJlbmNlLCBlZyBpbiB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZSBwZ2NwcAogICAgICAgICAgICBpcyBhbHNvIGdlbmVyYXRlZCBub3cgd2hlbiB1c2VyJ3MgY3VzdG9tIHR5cGVtYXBzIHVzZSBhIHByb3h5IGNsYXNzIGluIHRoZSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhbmQgYSAnbG9uZycgaW4gdGhlIGp0eXBlIHR5cGVtYXAuCgowOS8xOC8yMDA3OiBvbGx5CgkgICAgW3BocF0gQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBwYXJhbWV0ZXJzIG9mIHR5cGUgc3RkOjpzdHJpbmcgJgoJICAgIHdoaWNoIGFyZSBtb2RpZmllZCBieSB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTcGxpdCBwb3RlbnRpYWxseSBsb25nIHN0cmluZyBsaXRlcmFscyB0byBhdm9pZCBoaXR0aW5nCgkgICAgTVNWQydzIGxvdyBmaXhlZCBsaW1pdCBvbiBzdHJpbmcgbGl0ZXJhbCBsZW5ndGggLSBwYXRjaCBmcm9tCgkgICAgU0YjMTcyMzc3MCwgYWxzbyByZXBvcnRlZCBhcyBTRiMxNjMwODU1LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtvY2FtbF0gRml4IHJlbmFtaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcyBpbiB0aGUgbWV0aG9kX3RhYmxlIC0KCSAgICBteSBwYXRjaCBmcm9tIFNGIzk0MDM5OS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTaW1wbGVyIGNvZGUgZm9yIFNXSUdfQXNWYWxfYm9vbCgpIHdoaWNoIGZpeGVzIGEgInN0cmljdAoJICAgIGFsaWFzaW5nIiB3YXJuaW5nIGZyb20gR0NDIC0gcGF0Y2ggZnJvbSBTRiMxNzI0NTgxIGJ5IEFuZHJldwoJICAgIEJhdW1hbm4uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBVc2Ugc3Zfc2V0cHZuKCkgdG8gc2V0IGEgc2NhbGFyIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGgKCSAgICAtIHBhdGNoIGZyb20gU0YjMTc0NDYwIGJ5ICJtYXRzdWJhcmF5Ii4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBXaGVuIHdyYXBwaW5nIEMrKyBjb2RlLCBnZW5lcmF0ZSBjb2RlIHdoaWNoIHVzZXMKCSAgICBzdGQ6OnN0cmluZzo6YXNzaWduKFBUUiwgTEVOKSByYXRoZXIgdGhhbiBhc3NpZ25pbmcKCSAgICBzdGQ6OnN0cmluZyhQVFIsIExFTikuICBVc2luZyBhc3NpZ24gZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUKCSAgICAodGVzdGVkIHdpdGggR0NDIDQuMS4yKS4KCjA5LzA3LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICVpZ25vcmUgb24gY29uc3RydWN0b3JzIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBkZWNsYXJlZCBbU0YgIzE3Nzc3MTJdCgowOS8wNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICAtIENoYW5nZSByX2x0eXBlIGluIHR5cGVzeXMuYyB0byBzdG9yZSBhIGhhc2h0YWJsZSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHZhbHVlLgoJICAgICAgc2V2ZXJhbCB2ZXJ5IHN1YnRsZSBidWdzIHdlcmUgYmVpbmcgY2F1c2VkIGJ5IG11bHRpcGxlIGx0eXBlcyBiZWluZyBtYXBwZWQKCSAgICAgIHRvIGEgc2luZ2xlIG1hbmdsZWQgdHlwZSwgbW9zdGx5IHdoZW4gdXNpbmcgdHlwZWRlZmVkIHRlbXBsYXRlIHBhcmFtZXRlcnMuCgkgICAgICBOb3csIHJfbHR5cGUgc3RvcmVzIGEgaGFzaHRhYmxlIG9mIHBvc3NpYmxlIGx0eXBlcywgYW5kIHdoZW4gZ2VuZXJhdGluZyB0aGUKCSAgICAgIHR5cGUgdGFibGUsIGFsbCB0aGUgbHR5cGVzIGFyZSBhZGRlZCBpbnRvIHRoZSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUuCgowOC8zMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTc1NDk2NyBmcm9tIEphbWVzIEJpZ2xlci4KICAgICAgICAgICAgLSBGaXggYnVnIGluIHR1cm5pbmcgb24gd2FybmluZ3MgdGhhdCB3ZXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gRWcgJ3N3aWcgLXcrMzA5JyB3aWxsIG5vdwogICAgICAgICAgICAgIHR1cm4gb24gdGhlIG5vcm1hbGx5IHN1cHByZXNzZWQgd2FybmluZyAzMDkuCgogICAgICAgICAgICAtIE5ldyAtV2V4dHJhIGNvbW1hbmRsaW5lIG9wdGlvbiB3aGljaCBlbmFibGVzIHRoZSBleHRyYSB3YXJuaW5nIG51bWJlcnM6CiAgICAgICAgICAgICAgMjAyLDMwOSw0MDMsNTEyLDMyMSwzMjIgKHRoaXMgaXMgdGhlIGxpc3Qgb2Ygd2FybmluZ3MgdGhhdCBoYXZlIGFsd2F5cyBiZWVuIHN1cHByZXNzZWQgYnkKICAgICAgICAgICAgICBkZWZhdWx0KS4gQnkgc3BlY2lmeWluZyAtV2V4dHJhLCBhbGwgd2FybmluZ3Mgd2lsbCBiZSB0dXJuZWQgb24sIGJ1dCB1bmxpa2UgLVdhbGwsCiAgICAgICAgICAgICAgd2FybmluZ3MgY2FuIHN0aWxsIGJlIHNlbGVjdGl2ZWx5IHR1cm5lZCBvbi9vZmYgdXNpbmcgJXdhcm5maWx0ZXIsCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2FybiBvciBmdXJ0aGVyIC13IGNvbW1hbmRsaW5lIG9wdGlvbnMsIGVnOgogICAgICAgICAgICAgICAgc3dpZyAtV2V4dHJhIC13MzA5CiAgICAgICAgICAgICAgd2lsbCB0dXJuIG9uIGFsbCB3YXJuaW5ncyBleGNlcHQgMzA5LgoKMDgvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgLSBOZXcgZGVidWdnaW5nIG9wdGlvbnMsIC1kZWJ1Zy1tb2R1bGUgPG4+IGFuZCAtZGVidWctdG9wIDxuPiB0byBkaXNwbGF5IHRoZSBwYXJzZSB0cmVlIGF0CiAgICAgICAgICAgICAgdmFyaW91cyBzdGFnZXMsIHdoZXJlIDxuPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN0YWdlcyAxLTQuRm9yIGV4YW1wbGUsIHRvCiAgICAgICAgICAgICAgZGlzcGxheSB0b3Agb2YgcGFyc2UgdHJlZSBhdCBzdGFnZXMgMSBhbmQgMzoKICAgICAgICAgICAgICAgIHN3aWcgLWRlYnVnLXRvcCAxLDMKCiAgICAgICAgICAgIC0gRGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3aGljaCBoYXZlIGVxdWl2YWxlbnRzIGJlbG93OgogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX21vZHVsZSAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgMQogICAgICAgICAgICAgIC1kdW1wX21vZHVsZSAgICAgICAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgNAogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX3RvcCAgICAgICA9PiAgIC1kZWJ1Zy10b3AgMQogICAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAgICAgICA9PiAgIC1kZWJ1Zy10b3AgNAoKICAgICAgICAgICAgLSBSZW5hbWVkIHNvbWUgY29tbWFuZGxpbmUgb3B0aW9ucyBmb3IgbmFtaW5nIGNvbnNpc3RlbmN5IGFjcm9zcyBhbGwgb3B0aW9uczoKICAgICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgID0+ICAgLWRlYnVnLXRlbXBsYXRlCiAgICAgICAgICAgICAgLWRlYnVnX3R5cGVtYXAgICA9PiAgIC1kZWJ1Zy10eXBlbWFwCiAgICAgICAgICAgICAgLWR1bXBfY2xhc3NlcyAgICA9PiAgIC1kZWJ1Zy1jbGFzc2VzCiAgICAgICAgICAgICAgLWR1bXBfdGFncyAgICAgICA9PiAgIC1kZWJ1Zy10YWdzCiAgICAgICAgICAgICAgLWR1bXBfdHlwZWRlZiAgICA9PiAgIC1kZWJ1Zy10eXBlZGVmCiAgICAgICAgICAgICAgLWR1bXBfbWVtb3J5ICAgICA9PiAgIC1kZWJ1Zy1tZW1vcnkKCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhhbmRsaW5nIG9mIGRvdWJsZSBvciBmbG9hdCBwYXJhbWV0ZXJzIHdpdGggYW4gaW50ZWdlcgoJICAgIGRlZmF1bHQgdmFsdWUuCgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEdlbmVyYXRlIF9faXNzZXQoKSBtZXRob2RzIGZvciBzZXR0ZXJzIGZvciBQSFAgNS4xIGFuZCBsYXRlci4KCjA4LzIwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggZGlyZWN0b3IgYnVnICMxNzc2NjUxIHJlcG9ydGVkIGJ5IFN0ZXBoYW5lIFJvdXRlbG91cyB3aGljaCBvY2N1cnJlZCB3aGVuCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBvZiBzb21lIG90aGVyIHN5bWJvbHMgdXNlZCB3aXRoaW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzLgoKMDgvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgQ29ycmVjdCBiZWhhdmlvdXIgZm9yIHRlbXBsYXRlZCBtZXRob2RzIHVzZWQgd2l0aCAlcmVuYW1lIG9yICVpZ25vcmUgYW5kIHRoZSBlbXB0eQogICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiAtICV0ZW1wbGF0ZSgpLiBBIHdhcm5pbmcgaXMgaXNzdWVkIGlmIHRoZSBtZXRob2QgaGFzIG5vdCBiZWVuCiAgICAgICAgICAgIHJlbmFtZWQuCgowOC8xNi8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTmFtZSBnZW5lcmF0ZWQgY2wgZmlsZSBiYXNlZCBvbiBpbnB1dCBmaWxlIHJhdGhlciB0aGFuIGJ5CgkgICAgbW9kdWxlIG5hbWUuIEl0IHdhcyBwb3NzaWJsZSB0byBlbmQgdXAgd2l0aCBhIG15cGFja2FnZS5jbCBhbmQgYSB0ZXN0X3dyYXAuYwoJICAgIHdoZW4gcGFyc2luZyBhIHRlc3QuaSBpbnB1dCBmaWxlLiBDb25mdXNpbmcuIEFsc28sIGluY2x1ZGUgZXh0ZXJuYWwtZm9ybWF0CgkgICAgdGVtcGxhdGVzIGZvciA6ZmF0IGFuZCA6ZmF0LWxlIGF1dG9tYXRpY2FsbHkgdG8gYXZvaWQgdGhlc2UgYmVpbmcgY29tcGlsZWQKCSAgICBhdCBydW50aW1lLgoKMDgvMTUvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBBcHBseSBwYXRjaCAjMTc2NjA3NiBmcm9tIExlaWdoIFNtaXRoIGFkZGluZyBzdXBwb3J0IGZvciBuZXdseSBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIGNmZmkgOmxvbmctbG9uZyBhbmQgOnVuc2lnbmVkLWxvbmctbG9uZy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgZG9jdW1lbnRhdGlvbiBwYXRjaCAjMTc0MzU3MyBmcm9tIEplZmZyZXkgU29yZW5zZW4uIEl0IGNvbnRhaW5zIGEgbmVhdAogICAgICAgICAgICBpZGVhIHdpdGggcmVzcGVjdCB0byBiZXR0ZXIgbWVtb3J5IG1hbmFnZW1lbnQgYnkgdGhlIEpWTSBvZiBDKysgYWxsb2NhdGVkIG1lbW9yeS4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBseSBwYXRjaCAjMTc3MTQxMCBmcm9tIFdhZGUgQnJhaW5lcmQgdG8gZml4IHR5cGVkZWYgWFMoU3dpZ1BlcmxXcmFwcGVyKSBpbgogICAgICAgICAgICBwZXJscnVuLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybCBidWlsZCA4MjIgYW5kIFBlcmwgNS44LjkgYW5kIDUuMTAgYnJhbmNoZXMuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBjb25zdCBlbnVtIHJlZmVyZW5jZSB0eXBlbWFwcyBmaXhlZC4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBDKysgY2xhc3MgbWVtYmVyIHBvaW50ZXJzLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgc3VwcG9ydCBmb3IgJG93bmVyIGluIHRoZSAib3V0IiB0eXBlbWFwcyBsaWtlIGluIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gTm90ZSB0aGF0ICRvd25lciBoYXMgYWx3YXlzIGJlZW4gc3VwcG9ydGVkIGluIHRoZSAiamF2YW91dCIgLyAiY3NvdXQiCiAgICAgICAgICAgIHR5cGVtYXBzLgoKMDgvMDEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIHRlbXBsYXRlZCBtZXRob2RzIHdpdGhpbiB0aGUgc21hcnQKICAgICAgICAgICAgcG9pbnRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IGNyYWlnZG8gYXQgZWUud2FzaGluZ3Rvbi5lZHUuCgowNy8zMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIGZpeGVkIG1lbW9yeSBhY2Nlc3MgYWZ0ZXIgYmVpbmcgZnJlZWQgYnVnLiB0aGFua3MgdG8gTWFydGluIFBlcmNvc3NpLgogICAgICAgICAgICBwYWNrYWdlIG5hbWUgY2xvcyBjaGFuZ2VkIHRvIGNsLiB0aGFua3MgdG8gUmFsZiBNYXR0ZXMKCjA3LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhcmFsbGVsIG1ha2Ugc3VwcG9ydCBhZGRlZCBmb3IgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIGZvciBkZXZlbG9wZXJzIHdobyBoYXZlCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgQ1BVLiBOb3cgcGFyYWxsZWwgbWFrZSBjYW4gYmUgdXNlZCBmb3IgY2hlY2tpbmcgaW4gYWRkaXRpb24gdG8gYnVpbGRpbmcKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZS4gU29tZSB0eXBpY2FsIGNoZWNraW5nIGV4YW1wbGVzOgoKICAgICAgICAgICAgICBtYWtlIC1qOCAtayBjaGVjawogICAgICAgICAgICAgIG1ha2UgLWo0IGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgLWoyIGNoZWNrLWphdmEtZXhhbXBsZXMKCjA3LzE5LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIEZpeGVkIGJ1ZyB0aGF0IHN0b3BwZWQgY29uZmlndXJlIHdvcmtpbmcgb24gbWluZ3cgKGFwcGxpZWQgZG9zMnVuaXggdG8gY29uZmlndXJlLmluKQoKMDcvMTAvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRXh0cmEgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjEgKHVwZGF0ZWQgU1dJR19pbml0LCBkb2NzLCBleGFtcGxlcywgdGVzdCBzdWl0ZSkKCSAgICBSZW1vdmVkIG5hbWUgY2xhc2ggZm9yIHN0YXRpYyBsaW5rIG9mIG11bHRpcGxlIG1vZHVsZXMKCjA3LzA1LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiBTV0lHX0FMTE9DX0FSUkFZKCkKICAgICAgICAgICAgaW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgYXJndW1lbnRzLgogICAgICAgICAgICBDaGFuZ2VkIHRoZSBvdXRwdXQgb2Ygc3dpZ190eXBlKCkgdG8gdXNlIHRoZSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoZSB0eXBlLAoJICAgIHJhdGhlciB0aGFuIHRoZSByYXcgc3dpZyB0eXBlLgoKMDcvMDMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3JzIGZvciBzb21lIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGVyZSB0aGUgaW10eXBlIHJlc3VsdGVkIGluIGlkZW50aWNhbAogICAgICAgICAgICBtZXRob2RzIGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgQyMgZGlyZWN0b3IgY2xhc3MsIGVnIHZvaWQgZm9vKGludCAqKSBhbmQgdm9pZCBmb28oZG91YmxlICopCiAgICAgICAgICAgIHVzZWQgdG8gZ2VuZXJhdGVkIHR3byBvZiB0aGVzZToKCiAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIFN3aWdEaXJlY3RvcmZvbyhJbnRQdHIgcCkgeyAuLi4gfQoKMDYvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIHBhcmFtZXRlciBuYW1lIGNoYW5nZXMgaW4gc3RkX3ZlY3Rvci5pIGFsbG93aW5nIGJldHRlciB0YXJnZXRpbmcKICAgICAgICAgICAgb2YgdHlwZW1hcHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb2YgY29udGFpbmVycyBvZiBwb2ludGVycykuCgowNi8wNy8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggZm9yZWlnbi10eXBlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGxvb2sgZm9yIGZmaXR5cGUgdHlwZW1hcAoJICAgIGJpbmRpbmdzLiBmaXggaW5vdXRfdHlwZW1hcHMuaSBmb3Igc3RyaW5ncy4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUnVieV0KCSAgICBVc2Ugd2hpY2hldmVyIG9mICJsb25nIiBvciAibG9uZyBsb25nIiBpcyB0aGUgc2FtZSBzaXplIGFzICJ2b2lkKiIKCSAgICB0byBob2xkIHBvaW50ZXJzIGFzIGludGVnZXJzLCByYXRoZXIgdGhhbiB3aGljaGV2ZXIgbWF0Y2hlcyBvZmZfdC4KCSAgICBGaXhlcyBjb21waWxhdGlvbiBvbiBPUyBYIGFuZCBHQ0Mgd2FybmluZ3Mgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgc2l6ZW9mKHZvaWQqKSA8IHNpemVvZihvZmZfdCkgKFNGIHBhdGNoICMxNzMxOTc5KS4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggaGFuZGxpbmcgb2YgYSBwYXJ0aWN1bGFyIGNhc2UgaW52b2x2aW5nIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuCgowNi8wNS8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggY2FzZSB3aGVyZSB3ZSdkIHBhc3MgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXJzCgkgICAgKGkuZS4gTlMxOjpOUzI6OkZPTykgdG8gc3dpZy1pbnNlcnQtaWQuIEFsbCBuYW1lc3BhY2VzCgkgICAgc2hvdWxkIGJlIHN0cmlwcGVkLgoKCSAgICBGaXggYnVnIGluIFR5cGVkZWZIYW5kbGVyIGludHJvZHVjZWQgYnkgbGFzdCBmaXguCgowNi8wNS8yMDA3OiBvbGx5CgkgICAgRml4IHJlcG9ydGluZyBvZiBmaWxlbmFtZXMgaW4gZXJyb3JzIGFmdGVyICVpbmNsdWRlIChwYXRjaCBmcm9tCgkgICAgTGVpZ2ggU21pdGggaW4gIzE3MzEwNDA7IGFsc28gcmVwb3J0ZWQgYXMgIzE2OTk5NDApLgoKMDUvMzEvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4ICJtaXNzaW5nIGluaXRpYWxpc2VyIiB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgY29kZSB3aXRoIFB5dGhvbiAyLjUgd2l0aCB3YXJuaW5ncyBlbmFibGVkIChwYXRjaCBmcm9tCgkgICAgYnVnIzE3Mjc2NjggZnJvbSBMdWtlIE1vb3JlKS4KCjA1LzI5LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIFNwbGl0IGRvY3N0cmluZ3MgaW50byBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMgYXQgZWFjaCBuZXdsaW5lIHdoZW4KCSAgICBnZW5lcmF0aW5nIEMvQysrIHdyYXBwZXIgY29kZSAodGhlIEMvQysrIGNvbXBpbGVyIHdpbGwganVzdCBjb21iaW5lCgkgICAgdGhlbSBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwpLiAgVGhpcyBhdm9pZHMgTVNWQwoJICAgIGNvbXBsYWluaW5nIHRoYXQgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nIChwcm9ibGVtIHJlcG9ydGVkIGJ5CgkgICAgQm8gUGVuZyBvbiB0aGUgbWFpbGluZyBsaXN0KS4KCjA1LzI4LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEVzY2FwZSBiYWNrc2xhc2hlcyBpbiBkb2NzdHJpbmdzLgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4IGF1dG9kb2MgZ2VuZXJhdGlvbiBvZiBlbnVtcyB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlCgkgICAgZW51bXMgYXJlIHdyYXBwZWQgLSBwYXRjaCAjMTY5NzIyNiBmcm9tIEpvc2ggQ2hlcnJ5LgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCB3cmFwcGluZyBvZiBtZXRob2RzIGFuZCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB0byBhCgkgICAgY2xhc3MgKGJ1ZyMxNzAwNzg4KSBhbmQgdGhvc2Ugd2hpY2ggaGF2ZSBvdmVybG9hZGVkIGZvcm1zIHJldHVybmluZwoJICAgIGJvdGggY2xhc3NlcyBhbmQgbm9uLWNsYXNzZXMgKGJ1ZyMxNzEyNzE3LCB0aGFua3MgdG8gU2ltb24KCSAgICBCZXJ0aGlhdW1lIGZvciB0aGUgcGF0Y2gpLgoKMDUvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXJlbmFtZSBpbmNvbnNpc3RlbmN5IGluIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFzIHJlcG9ydGVkIGJ5IFpob25nIFJlbi4gVGhlIG1hdGNoaW5nCiAgICAgICAgICAgIGlzIG5vdyBkb25lIG9uIHRoZSBvcGVyYXRvciBuYW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdCBpcyBkb25lIGZvciBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgQUJDKCkgY29uc3Q7CiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChBQkMgYSkgY29uc3Q7CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEFCQyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZChBQkMgYSkgY29uc3Qge30KICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBBQkMoKSBjb25zdCB7IEFCQyBhOyByZXR1cm4gYTsgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlIHRoYXQgcXVhbGlmeWluZyB0aGUgY29udmVyc2lvbiBvcGVyYXRvciBwcmV2aW91c2x5IG1heSBvciBtYXkgbm90IGhhdmUgbWF0Y2hlZC4KICAgICAgICAgICAgTm93IGl0IGRlZmluaXRlbHkgd29uJ3QsIHNvIHRoaXMgd2lsbCBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIFNwYWNlOjpBQkMoKSBjb25zdDsKCiAgICAgICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoaXMgZG9lcyBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoU3BhY2U6OkFCQyBhKSBjb25zdDsKCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkIHdpdGggcmVzcGVjdCB0byAlcmVuYW1lLCBuYW1lc3BhY2VzIGFuZCB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIENvbnZlcnNpb24gb3BlcmF0b3JzIGRvY3VtZW50YXRpb24gdG9vLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNS8xNi8yMDA3OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJhZCBnZW5lcmF0aW9uIG9mIGxvY2FsIHZhciBsdHlwZSdzIGluIGZ1bmN0aW9uV3JhcHBlcigpLgoJICAgIFRyeSB0byB3b3JrIGJldHRlciB3aXRoIHRoZSBiYWNrd2FyZCBvcmRlciBpbiB3aGljaCBzd2lnCgkgICAgdW5yb2xscyBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMuCgkgICAgY2xlYW5lZCB1cCBhIGxpdHRsZSB1bm5lY2Vzc2FyeSBjb2RlL2RlYnVnIHByaW50ZidzLgoJICAgIFJlbW92ZSB3YXJuaW5nIHdoZW4gcmVwbGFjaW5nICRsZGVzdHJ1Y3RvciBmb3IgZmY6Zm9yZWlnbi1wb2ludGVyCgowNS8xMi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBzd2lnIC1weXRob24gLXRocmVhZHMgbm93IGdlbmVyYXRlcyBDL0MrKyBjb2RlIHdoaWNoIHVzZXMgUHl0aG9uJ3MKCSAgICBvd24gdGhyZWFkaW5nIGFic3RyYWN0aW9uIChmcm9tIHB5dGhyZWFkLmgpIHJhdGhlciB0aGFuIE9TIHNwZWNpZmljCgkgICAgY29kZS4gIFRoZSBvbGQgY29kZSBmYWlsZWQgdG8gY29tcGlsZSBvbiBNUyBXaW5kb3dzLiAgKFNlZSBTRiBwYXRjaAoJICAgIHRyYWNrZXIgIzE3MTAzNDEpLgoKMDUvMDQvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBTVEwgcmVuYW1lcyB0byBiZSBnbG9iYWwgcmVuYW1lcy4gIFRoaXMgZml4ZXMKCSAgICBTVEwgZnVuY3Rpb25zIG5vdCBiZWluZyByZW5hbWVkIHdoZW4gYXV0b3JlbmFtZSBpcyBvbi4KICAgICAgICAgICAgVGhpcyBpcyBhIG5vdCBhIHRvdGFsbHkgcGVyZmVjdCB3b3JrLWFyb3VuZCwgYnV0IGJldHRlci4KCSAgICBTb21lb25lIHJlYWxseSBuZWVkcyB0byBmaXggdGhlIHRlbXBsYXRlIHJlbmFtaW5nIGNvZGUuCgkgICAgKFNlZSBidWcgIzE1NDU2MzQpCgowNS8wNC8yMDA3ICBnZ2EKCSAgICBbQWxsXQogICAgICAgICAgICBDaGFuZ2VkICVyZW5hbWUoIiUodW5kZXJjYXNlKXMiKSBhIGxpdHRsZSBzbyB0aGF0IHNpbmdsZQoJICAgIG51bWJlcnMgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBub3QgdW5kZXJjYXNlZC4gIFRoYXQgaXM6CgkJZ2V0U29tZXRoaW5nIC0+IGdldF9zb21ldGhpbmcKCQlnZXQyRAkgICAgIC0+IGdldF8yZAoJCWdldDIzNAkgICAgIC0+IGdldF8yMzQKCSAgICBCVVQ6CgkJYXNGbG9hdDIgICAgIC0+IGFzX2Zsb2F0MgoJICAgIChCdWcgIzE2OTk3MTQpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIF9fc3dpZ3R5cGVfXyA9PiBAX19zd2lndHlwZV9fIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZAoJICAgIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSAoYW5kIGZvbGxvd3MgUnVieSdzIG9mZmljaWFsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGp1c3QgaW4gY2FzZSkuCgkgICAgTWFkZSB0cmFja2luZyA9PiBAX190cmFja2luZ3NfXyBmb3Igc2FtZSByZWFzb24uCgkgICAgQ3VycmVudGx5IHN0b3JpbmcgaXZhcnMgd2l0aG91dCB0aGUgQCBzZWVtcyB2YWxpZCwgYnV0CgkgICAgdGhlIFBpY2tBeGUgc2F5cyB0aGlzIGlzIG5vdCBjb3JyZWN0LCBzbyBqdXN0IGluIGNhc2UuLi4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFwcGxpZWQgcGF0Y2ggZm9yIC1taW5oZXJpdCBidWcgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzLgoJICAgIFRoaXMgaXNzdWUgc2hvdWxkIGJlIHJldmlzaXRlZCBtb3JlIGNsb3NlbHksIGFzIE11bHRpcGxlCgkgICAgSW5oZXJpdGFuY2UgaW4gUnVieSBpcyBzdGlsbCBwcm9ibGVtYXRpYy4KCSAgICAocGF0Y2gvYnVnICMxNjA0ODc4KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMgaW4gcnVieSB3aWxsIG5vdyByZXBvcnQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgdGhlIHBvc3NpYmxlIHByb3RvdHlwZXMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyB0aGUgbnVtYmVyIG9yCiAgICAgICAgICAgIHR5cGUgb2YgYSBwYXJhbWV0ZXIuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGb3Jnb3QgdG8gZG9jdW1lbnQgdGhlIGJ1ZyBmaXhpbmcgb2YgYW4gb2xkIGJ1ZyByZWdhcmRpbmcKCSAgICBleGNlcHRpb25zLgoJICAgIChidWcgIzE0NTgyNDcpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBSdWJ5IGRvY3VtZW50YXRpb24gdG8gdXNlIHRoZSBwcm9wZXIgY3NzIHN0eWxlcyBmb3IKCSAgICBlYWNoIHNlY3Rpb24uIEFkZGVkIGF1dG9kb2Mgc2VjdGlvbiB0byBSdWJ5J3MgZG9jcyB0bwoJICAgIGRvY3VtZW50IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgUnVieSBpbiBkb2N1bWVudGluZyBpdHMgbW9kdWxlcy4KCSAgICBNYWRlIHJkb2MgZG9jdW1lbnRhdGlvbiBzcGl0IG91dCB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyArCgkgICAgbWV0aG9kIG5hbWUuICBBbGJlaXQgdGhpcyB3aWxsIG1ha2UgdGhlIGN1cnJlbnQgcmRvYyBub3QgcmVjb2duaXplCiAgICAgICAgICAgIHRoZSBtZXRob2QsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGRpZmZlcmVudAogICAgICAgICAgICBjbGFzc2VzIHdpdGggc2ltaWxhciBtZXRob2RzIChyZG9jIHdhcyBjcmVhdGVkIHRvIGRvY3VtZW50IHRoZQoJICAgIHJ1Ynkgc291cmNlIHdoaWNoIG9ubHkgY29udGFpbnMgb25lIGNsYXNzIHBlciBjIGZpbGUsIHVubGlrZSBzd2lnKQogICAgICAgICAgICBJIGhhdmUgcGF0Y2hlZCByZG9jIHRvIG1ha2UgaXQgbW9yZSBmcmllbmRseSB0byBzd2lnLiAgVGhpcwogICAgICAgICAgICBwYXRjaCBuZWVkcyB0byBiZSBtZXJnZWQgaW4gdGhlIHJ1Ynkgc3RkIGxpYnJhcnkgbm93LgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBmbGFnIC1mZWF0dXJlIHRvIGJlIC1pbml0X25hbWUgdG8gYmV0dGVyIHJlZmxlY3QgaXRzCgkgICAgcHVycG9zZSBhbmQgYXZvaWQgY29uZnVzaW9uIHdpdGggLWZlYXR1cmVzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgYXV0b2RvYyBnZW5lcmF0aW9uLgoJICAgIEFkZGVkIGF1dG9kb2MgLnN3ZyBmaWxlcyB0byBSdWJ5IGxpYnJhcnkgZm9yIGVhc2lseSBhZGRpbmcKCSAgICBkb2N1bWVudGF0aW9uIHRvIGNvbW1vbiBSdWJ5IG1ldGhvZHMgYW5kIFNUTCBtZXRob2RzLgoJICAgIEZpeGVkIGF1dG9kb2MgZG9jdW1lbnRpbmcgb2YgZ2V0dGVycyBhbmQgc2V0dGVycyBhbmQgbW9kdWxlLgoJICAgIE1hZGUgdGVzdCBzdWl0ZSBhbHdheXMgZ2VuZXJhdGUgYXV0b2RvY3MuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHNvbWUgd2FybmluZ3MgZnJvbSBTVEwgYW5kIHRlc3Qgc3VpdGUuCgowNS8wMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBpc3N1ZXMgd2l0aCBDKysgY2xhc3NlcyBhbmQgaGllcmFjaGllcyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBzb3VyY2UgZmlsZXMuIEZpeGVkIGltcG9ydHMgdGVzdCBjYXNlICYgYWRkZWQgcnVuIHRlc3QuCgkgICAgQWRkZWQgRXhhbXBsZXMvaW1wb3J0cy4KCSAgICBBZGRlZCB0eXBlbmFtZSBmb3IgcmF3IGx1YV9TdGF0ZSoKCSAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9uIG5hdGl2ZSBmdW5jdGlvbnMuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBEb2NzdHJpbmdzIGFyZSBub3cgc3VwcG9ydGVkLgoJICAgICVmZWF0dXJlKCJhdXRvZG9jIikgYW5kICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93CgkgICAgcHJvcGVybHkgc3VwcG9ydGVkIGluIFJ1YnkuICBUaGVzZSBmZWF0dXJlcyB3aWxsIGdlbmVyYXRlCgkgICAgYSBfd3JhcC5jeHggZmlsZSB3aXRoIHJkb2MgY29tbWVudHMgaW4gdGhlbS4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFNUTCBmaWxlcyBoYXZlIGJlZW4gdXBncmFkZWQgdG8gZm9sbG93IHRoZSBuZXcgc3dpZy9weXRob24KCSAgICBMaWIvc3RkIGNvbnZlbnRpb25zLgoJICAgIFRoaXMgbWVhbnMgc3RkOjp2ZWN0b3IsIHN0ZDo6c2V0LCBzdGQ6Om1hcCwgc2V0OjptdWx0aW1hcCwKCSAgICBzdGQ6Om11bHRpc2V0LCBzdGQ6OmRlcXVlIGFuZCBzdGQ6OnN0cmluZyBhcmUgbm93IHByb3Blcmx5CgkgICAgc3VwcG9ydGVkLCBpbmNsdWRpbmcgdGhlaXIgaXRlcmF0b3JzLCBzdXBwb3J0IGZvciBjb250YWluaW5nCgkgICAgcnVieSBvYmplY3RzIChzd2lnOjpHQ19WQUxVRSkgYW5kIHNldmVyYWwgb3RoZXIgcnVieQoJICAgIGVuaGFuY2VtZW50cy4KCSAgICBzdGQ6OmNvbXBsZXgsIHN0ZDo6aW9zLCBzdGQ6Omlvc3RyZWFtLCBzdGQ6Omlvc3RyZWFtYnVmIGFuZAoJICAgIHN0ZDo6c3N0cmVhbSBhcmUgbm93IGFsc28gc3VwcG9ydGVkLgoJICAgIHN0ZDo6d3N0cmluZywgc3RkOjp3aW9zLCBzdGQ6Ondpb3N0cmVhbSwgc3RkOjp3aW9zdHJlYW1idWYKCSAgICBhbmQgc3RkOjp3c3N0cmVhbSBhcmUgc3VwcG9ydGVkIHZlcmJhdGltIHdpdGggbm8gdW5pY29kZQoJICAgIGNvbnZlcnNpb24uCgoJICAgIHN0ZF92ZWN0b3IuaSBub3cgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBSdWJ5IEFycmF5cyBtdWNoIG1vcmUKCSAgICBjbG9zZWx5LCBzdXBwb3J0aW5nIHNsaWNpbmcsIHNoaWZ0aW5nLCB1bnNoaWZ0aW5nLAogICAgICAgICAgICBtdWx0aXBsZSBpbmRleGluZyBhbmQgcHJvcGVyIHJldHVybiB2YWx1ZXMgb24gYXNzaWdubWVudC4KCgkgICAgQ09NUEFUQUJJTElUWSBOT1RFOiB0aGlzIGNoYW5nZXMgdGhlIG9sZGVyIGFwaSBhIGxpdHRsZSBiaXQgaW4KCSAgICB0aGF0IGltcHJvcGVyIGluZGV4aW5nIHdvdWxkIHByZXZpb3VzbHkgKGluY29ycmVjdGx5KSByYWlzZQoJICAgIGV4Y2VwdGlvbnMuICBOb3csIG5pbCBpcyByZXR1cm5lZCBpbnN0ZWFkLCBmb2xsb3dpbmcgcnVieSdzCgkgICAgc3RhbmRhcmQgQXJyYXkgYmVoYXZpb3IuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIHRoZSB2YWx1ZSBvZiBTV0lHX1RZUEVDSEVDS19CT09MIHRvIGJlIDEwMDAwIChpZS4gaGlnaGVyCgkgICAgdGhhbiB0aGF0IG9mIGFsbCBpbnRlZ2VycykuCgkgICAgVGhpcyBpcyBiZWNhdXNlIFJ1YnkgYWxsb3dzIHR5cGVjYXN0aW5nCgkgICAgaW50ZWdlcnMgZG93biB0byBib29sZWFucyB3aGljaCBjYW4gbWFrZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvbgoJICAgIGJvb2xzIGFuZCBpbnRlZ2VycyB0byBmYWlsLgoJICAgIChidWcjIDE0ODgxNDIpCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBhIHN1YnRsZSBidWcgaW4gbXVsdGlwbGUgYXJnb3V0cyB0aGF0IGNvdWxkIGdldCB0cmlnZ2VyZWQgaWYKCSAgICB0aGUgdXNlciByZXR1cm5lZCB0d28gb3IgbW9yZSBhcmd1bWVudHMgYW5kIHRoZSBmaXJzdCBvbmUgd2FzIGFuCgkgICAgYXJyYXkuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGUgbmV3IGZlYXR1cmVzCiAgICAgICAgICAgIGFkZGVkLCBhZGQgZGlyZWN0b3Jpbi9vdXQvYXJnb3V0IHR5cGVtYXBzLCBldGMuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBZGRlZCAlaW5pdHN0YWNrIGFuZCAlaWdub3Jlc3RhY2sgZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3IKCSAgICBmdW5jdGlvbnMuICBUaGVzZSBhbGxvdyB5b3UgdG8gY29udHJvbCB3aGV0aGVyIGEgZGlyZWN0b3IKCSAgICBmdW5jdGlvbiBzaG91bGQgcmUtaW5pdCB0aGUgUnVieSBzdGFjay4KCSAgICBUaGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgZm9yIGFuIGVtYmVkZGVkIFJ1Ynkgd2hlcmUgdGhlCgkgICAgZGlyZWN0b3IgbWV0aG9kIGlzIHVzZWQgYXMgYSBDKysgY2FsbGJhY2sgYW5kIG5vdCBjYWxsZWQKICAgICAgICAgICAgYnkgdGhlIHVzZXIgZnJvbSBydWJ5IGNvZGUuCgkgICAgRXhwbGFuYXRpb246CgkgICAgUnVieSdzIEdDIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHRoZSBydW5uaW5nIE9TIHN0YWNrIGluIG9yZGVyIHRvCgkgICAgbWFyayBhbnkgVkFMVUUgKFJ1Ynkgb2JqZWN0cykgaXQgZmluZHMgdGhlcmUgdG8gYXZvaWQgY29sbGVjdGlvbgoJICAgIG9mIHRoZW0uICBUaGlzIGFsbG93cyB0aGUgcnVieSBBUEkgdG8gYmUgdmVyeSBzaW1wbGUgYW5kIGFsbG93cwoJICAgIHlvdSB0byB3cml0ZSBjb2RlIGxpa2UgIlZBTFVFIGEgPSBzdGgiIGFueXdoZXJlIHdpdGhvdXQgbmVlZGluZwoJICAgIHRvIGRvIHRoaW5ncyBsaWtlIHJlZmNvdW50aW5nIGxpa2UgcHl0aG9uLgoJICAgIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBvZiB0aGUgc3RhY2sgaXMgc2V0IHdoZW4gcnVieV9pbml0KCkgaXMKCSAgICBjYWxsZWQuICAgSWYgcnVieSBpcyBpbml0ZWQgd2l0aGluIG1haW4oKSwgYXMgaXQgdXN1YWxseSBpcyB0aGUKCSAgICBjYXNlIHdpdGggdGhlIG1haW4gcnVieSBleGVjdXRhYmxlLCBydWJ5IHdpbGwgYmUgYWJsZSB0byBjYWxjdWxhdGUKCSAgICBpdHMgc3RhY2sgcHJvcGVybHkuICBIb3dldmVyLCB3aGVuIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhcyB3aGVuCgkgICAgcnVieSBpcyBlbWJlZGRlZCBhcyBhIHBsdWdpbiB0byBhbiBhcHBsaWNhdGlvbiB3aGVyZSBtYWluIGlzIG5vdAoJICAgIGF2YWlsYWJsZSwgcnVieV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlLCBhbmQKCSAgICBydWJ5IHdpbGwgYmUgaW5jb3JyZWN0bHkgdHJhY2tpbmcgdGhlIHN0YWNrIGZyb20gdGhlIGZ1bmN0aW9uCgkgICAgdGhhdCBjYWxsZWQgcnVieV9pbml0KCkgZm9yd2FyZHMgb25seSwgd2hpY2ggY2FuIGxlYWQgdG8KCSAgICBhbGwgc29ydHMgb2Ygd2VpcmQgY3Jhc2hlcyBvciB0byBydWJ5IHRoaW5raW5nIGl0IGhhcyBydW4gb3V0IG9mCgkgICAgc3RhY2sgc3BhY2UgaW5jb3JyZWN0bHkuCgkgICAgVG8gYXZvaWQgdGhpcywgZGlyZWN0b3IgKGNhbGxiYWNrKSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB0YWdnZWQKCSAgICB0byB0cnkgdG8gcmVzZXQgdGhlIHJ1Ynkgc3RhY2ssIHdoaWNoIHdpbGwgc29sdmUgdGhlIGlzc3Vlcy4KCSAgICBOT1RFOiBydWJ5MS44LjYgc3RpbGwgY29udGFpbnMgYSBidWcgaW4gaXQgaW4gdGhhdCBpdHMgZnVuY3Rpb24KCSAgICB0byByZXNldCB0aGUgc3RhY2sgd2lsbCBub3QgYWx3YXlzIGRvIHNvLiAgVGhpcyBidWcgaXMgdHJpZ2dlcmVkCgkgICAgdmVyeSByYXJlbHksIHdoZW4gcnVieSBpcyBjYWxsZWQgZnJvbSB0d28gdmVyeSBkaXN0aW5jdCBwbGFjZXMKCSAgICBpbiBtZW1vcnksIGxpa2UgYSBicmFuY2ggb2YgbWFpbigpIGFuZCBhbm90aGVyIGRzby4gIFRoaXMgYnVnCgkgICAgaGFzIG5vdyBiZWVuIHJlcG9ydGVkIHRvIHJ1YnktY29yZSBhbmQgaXMgcGVuZGluZyBmdXJ0aGVyCgkgICAgaW52ZXN0aWdhdGlvbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzMwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTcwNzU4MiAtIFJlc3RvcmUgYnVpbGRpbmcgZnJvbSByZWFkLW9ubHkgc291cmNlIGRpcmVjdG9yaWVzLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSB3aWxsIG5vdyByZXBvcnQgdGhlIHBhcmFtZXRlciBpbmRleCBwcm9wZXJseSBvbiB0eXBlCgkgICAgZXJyb3JzIGFzIHdlbGwgYXMgdGhlIGNsYXNzIGFuZCB2YWx1ZSBvZiB0aGUgaW5jb3JyZWN0CgkgICAgYXJndW1lbnQgcGFzc2VkLgoJICAgIChmZWF0dXJlIHJlcXVlc3QgIzE2OTk2NzApCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IG5vIGxvbmdlciBjcmVhdGVzIHRoZSBmcmVlX0NsYXNzIGZ1bmN0aW9uIGlmIHRoZSBjbGFzcwoJICAgIGNvbnRhaW5zIGl0cyBvd24gdXNlciBkZWZpbmVkIGZyZWUgZnVuY3Rpb24gKCVmcmVlZnVuYykuCgkgICAgKGJ1ZyAjMTcwMjg4MikKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgZGlyZWN0b3JzIHJhaXNlIGEgcnVieSBleGNlcHRpb24gZm9yIGluY29ycmVjdCBhcmdvdXQKCSAgICByZXR1cm5lZCB2YWx1ZXMgaWYgUlVCWV9FTUJFRERFRCBpcyBzZXQsIGluc3RlYWQgb2YgdGhyb3dpbmcKCSAgICBhbiBhY3R1YWwgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCSAgICBUaGlzIHdpbGwgcHJldmVudCBjcmFzaGVzIHdoZW4gcnVieSBpcyBlbWJlZGRlZCBhbmQgdW5hd2FyZQoJICAgIG9mIHRoZSBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCB0aGUgbmVlZCBmb3IgLURTV0lHRVhURVJOLgoJICAgIENoYW5nZWQgc3dpZ19ydWJ5X3RyYWNraW5ncyB0byBiZSBhIHN0YXRpYyB2YXJpYWJsZSwgYnV0IGFsc28KCSAgICBiZSBrZXB0IHdpdGhpbiBhIGhpZGRlbiBpbnN0YW5jZSB2YXJpYWJsZSBpbiB0aGUgU1dJRyBtb2R1bGUuCgkgICAgVGhpcyBhbGxvd3MgcHJvcGVybHkgZGVhbGluZyB3aXRoIHRyYWNraW5ncyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBEU09zLCB3aGljaCB3YXMgcHJldmlvdXNseSBicm9rZW4uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgaW1wcm92ZW1lbnQgdG8gcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0gRml4ZWQgR0MgbWVtb3J5IGlzc3VlcyB3aXRoIHRyYWNraW5ncyB0aGF0IGNvdWxkIGxlYWQKCSAgICB0byBzZWdmYXVsdHMgd2hlbiBkZWFsaW5nLCBtYWlubHksIHdpdGggc3RhdGljIHZhcmlhYmxlcy4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFN0cmluZyBjb252ZXJzaW9uIHVzaW5nIG9sZCBydWJ5MS42IG1hY3Jvcy4gIE5vdwoJICAgIFN0cmluZ1ZhbHVlUHRyKCkgaXMgdXNlZCBpZiBhdmFpbGFibGUuICBUaGlzIHJlbW92ZXMgd2FybmluZ3MKCSAgICB3aGVuIGNvbnZlcnRpbmcgc3RyaW5ncyB3aXRoIFwwIGluIHRoZW0uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCB0aGUgYXJnb3V0IGNvdW50IGluIGRpcmVjdG9ycyBmb3IgUnVieS4gIFByZXZpb3VzbHksCgkgICAgaWdub3JlZCBvciAibnVtaW5wdXRzPTAiIHR5cGVtYXBzIHdvdWxkIGluY29ycmVjdGx5IG5vdCBnZXQKCSAgICBjb3VudGVkIHRvd2FyZHMgdGhlIGFyZ291dCBjb3VudC4KCSAgICAoYnVnL3BhdGNoICMxNTQ1NTg1KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgVXBncmFkZWQgUnVieSBjb252ZXJ0ZXIgdG8gcmVjb2duaXplICJudW1pbnB1dHM9MCIuICBQcmV2aW91c2x5LAoJICAgIG9ubHkgdGhlIG9sZCAiaWdub3JlIiBmbGFnIHdhcyBjaGVja2VkICh3aGljaCB3b3VsZCBjdXJyZW50bHkKCSAgICBzdGlsbCB3b3JrIHByb3Blcmx5LCBidXQgaXMgZGVwcmVjYXRlZCkuCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieSAtIGJ1dCBzaG91bGQgYmUgbWFkZSBnZW5lcmljXQoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSBhZGRlZC4KCgkgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gaWdub3JlIHRoZSBvdXRwdXQgb2YgYSBmdW5jdGlvbiBzbwoJICAgIHRoYXQgaXQgaXMgbm90IGFkZGVkIHRvIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzCgkgICAgKCBpZS4gYXJnb3V0cyApLgoJICAgIFRoaXMgc2hvdWxkIGFsc28gYmVjb21lIGEgZmVhdHVyZSBvZiAldHlwZW1hcChkaXJlY3Rvcm91dCkKCSAgICBhcyAibnVtb3V0cHV0cyI9MCwganVzdCBsaWtlICJudW1pbnB1dHMiPTAgZXhpc3RzLgoKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3JzIj0xKQoKCSAgICAlaW5jbHVkZSA8dHlwZW1hcHMuaT4KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgeyBDbGFzczo6bWVtYmVyX2Z1bmN0aW9uMSB9OwoJICAgICV0eXBlbWFwKG91dCkgTVN0YXR1cyB7IC8vIHNvbWUgY29kZSwgbGlrZSBjaGVjayBtc3RhdHVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJhaXNlIGV4Y2VwdGlvbiBpZiB3cm9uZyB9OwoKCSAgICAlaW5saW5lICV7CgkgICAgICB0eXBlZGVmIGludCBNU3RhdHVzOwoJICAgICAgY2xhc3MgQ2xhc3MgewoKCSAgICAgIC8vIG9uZSBhcmd1bWVudCByZXR1cm5lZCwgYnV0IGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIGRpc2NhcmRlZCBhcyBhIHJldHVybiAob3V0KSBwYXJhbWV0ZXIuCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMSggaW50JiBPVVRQVVQgKTsKCgkgICAgICAvLyB0d28gYXJndW1lbnRzIHJldHVybmVkLCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBub3QgZGlzY2FyZGVkCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMiggaW50JiBPVVRQVVQgKTsKCSAgICAgIH07CiAgICAgICAgICAgICV9CgoKMDQvMjEvMjAwNzogb2xseQoJICAgIEZpeCBwYXJzaW5nIG9mIGZsb2F0IGNvbnN0YW50cyB3aXRoIGFuIGV4cG9uZW50IChlLmcuIDFlLTAyZikKCSAgICAoYnVnICMxNjk5NjQ2KS4KCjA0LzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggbGFjayBvZiBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3Mgd2hlbiAtTyBpcyB1c2VkLgoJICAgIEFsc28sIGZpeCBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3MgY29udGFpbmluZyBhIGRvdWJsZSBxdW90ZQoJICAgIGNoYXJhY3Rlci4gIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIGJ1ZyMxNzAwMTQ2LgoKMDQvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTdXBwb3J0IGZvciBhZGRpbmcgaW4gSmF2YS9DIyBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGludGVybWVkaWFyeSBjYWxsLAogICAgICAgICAgICBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbWFyc2hhbGxpbmcgb2YgdGhlIHByb3h5IHR5cGUgdG8gdGhlIGludGVybWVkaWFyeSB0eXBlLgogICAgICAgICAgICBUaGUgamF2YWluL2NzaW4gdHlwZW1hcCBub3cgc3VwcG9ydHMgdGhlICdwcmUnIGFuZCAncG9zdCcgYXR0cmlidXRlcyB0byBhY2hpZXZlIHRoaXMuCiAgICAgICAgICAgIFRoZSBqYXZhaW4gdHlwZW1hcCBhbHNvIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdwZ2NwcG5hbWUnIGF0dHJpYnV0ZSBmb3IgcHJlbWF0dXJlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciBuYW1pbmcgYW5kIHRoZSBjc2luIHR5cGVtYXAgc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ2NzaGluJwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSB1c2VkIGluIGEgY29uc3RydWN0b3IgaGVscGVyIGdlbmVyYXRlZCB3aGVuIHRoZSB0eXBlIGlzIHVzZWQKICAgICAgICAgICAgaW4gYSBjb25zdHJ1Y3Rvci4gRGV0YWlscyBpbiB0aGUgSmF2YS5odG1sIGFuZCBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIERvbid0IHRyZWF0IGByZXN0cmljdCcgYXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIGluIEMrKyBtb2RlCgkgICAgKGJ1ZyMxNjg1NTM0KS4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhvdyB6ZW5kX3Rocm93X2V4Y2VwdGlvbigpIGlzIGNhbGxlZCAoYnVnICMxNzAwNzg1KS4KCjA0LzEwLzIwMDc6IG9sbHkKCSAgICBEZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0byB0ZW1wbGF0ZSBmb3IgYUNDIChyZXBvcnRlZCBvbgoJICAgIHN3aWctdXNlciB0aGF0IHRoaXMgaXMgbmVlZGVkKS4KCjA0LzA0LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gSWYgWlRTIGlzIGVuYWJsZWQsIHJlbGVhc2UgPG1vZHVsZT5fZ2xvYmFsc19pZCBpbiBNU0hVVERPV04KCSAgICB0byBhdm9pZCBQSFAgaW50ZXJwcmV0ZXIgY3Jhc2ggb24gc2h1dGRvd24uICBUaGlzIHNvbHV0aW9uIHdhcwoJICAgIHN1Z2dlc3RlZCBoZXJlOiBodHRwOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDA5ODUKCjA0LzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNF0gQWRkIG1pc3NpbmcgWlRTIGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBDKysgd3JhcHBlciBjb2RlCgkgICAgdG8gZml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gdXNpbmcgWlRTIGVuYWJsZWQgU1dJRyAoTGludXgKCSAgICBkaXN0cmlidXRpb25zIHRlbmQgdG8gZGlzYWJsZSBaVFMsIGJ1dCBub3RhYmx5IHRoZSBXaW5kb3dzIGJ1aWxkCgkgICAgdXNlcyBpdCBieSBkZWZhdWx0KS4KCjA0LzAxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2ODQyNjE6IGZpeGVzIGhhbmRsaW5nIG9mIHVuc2lnbmVkIGludCBsaXRlcmFscywgdGhhbmtzIExlaWdoIFNtaXRoLgogICAgICAgICAgICBBbHNvLCBpbXByb3ZlZCBkb2N1bWVudGF0aW9uLgoKMDMvMzAvMjAwNzogb2xseQoJICAgIEF2b2lkIGdlbmVyYXRpbmcgJzw6JyB0b2tlbiB3aGVuIHVzaW5nIFN3aWdWYWx1ZVdyYXBwZXI8PiBvbiBhIHR5cGUKCSAgICB3aGljaCBzdGFydHMgd2l0aCAnOjonIChwYXRjaCAjMTY5MDk0OCkuCgowMy8yNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbcGVybDVdIEFkZCBTV0lHX2ZhaWwgdG8gdGhlIFNXSUdfZXhjZXB0aW9uIG1hY3JvLiAgRml4ZXMgYSBmZXcgcHJvYmxlbXMgcmVwb3J0ZWQKCSAgICBvbiB0aGUgbWFpbGluZyBsaXN0LgoKMDMvMjMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU3RyaW5nIGNvcHlpbmcgcGF0Y2ggZnJvbSBKb3NoIENoZXJyeSByZWR1Y2luZyBtZW1vcnkgY29uc3VtcHRpb24gYnkgYWJvdXQgMjUlLgoKMDMvMjEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxNjMxOTg3IGZyb20gVWxyaWsgUGV0ZXJzb24gLSBib29sIElOT1VUIHR5cGVtYXBzCiAgICAgICAgICAgIGZhaWwgb24gYmlnIGVuZGlhbiBtYWNoaW5lcy4KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgZ2l2ZW4gZG9kZ3kgQysrIGNvZGU6IG5hbWVzcGFjZSBhYmM6OmRlZiB7IH0KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBzbyB0aGF0IEFSUkFZU09GQ0xBU1NFUyBhbmQgQVJSQVlTT0ZFTlVNUyBpbiBhcnJheXNfamF2YS5pIGNhbiBiZSBhcHBsaWVkCiAgICAgICAgICAgIHRvIHBvaW50ZXIgdHlwZXMuCgowMy8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIFdoZW4gd2Uga25vdyB0aGUgbGl0ZXJhbCBudW1lcmljIHZhbHVlIGZvciBhIGNvbnN0YW50LCB1c2UKCSAgICB0aGF0IHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgUEhQIHdyYXBwZXIgY2xhc3MuCgowMy8wMi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBQSFAgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBjYXNlcyBvZgoJICAgIG92ZXJsb2FkZWQgZm9ybXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4KCjAyLzI2LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2NTYzOTU6IGZpeGVkIGhleCBhbmQgb2N0YWwgdmFsdWVzIGJ1ZywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuCgowMi8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBidWcgaW4gdHlwZW1hcHMgd2hpY2ggY2F1c2VkIGRlcml2ZWRfYnl2YWx1ZSBhbmQgcm5hbWUgdGVzdCBjYXNlcyB0byBmYWlsLgoJICAgIFVwZGF0ZWQgZGVyaXZlZF9ieXZhbHVlLmkgdG8gZXhwbGFpbiBob3cgdG8gZmluZCBhbmQgZml4IHRoZSBwcm9ibGVtCgowMS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1Mzg1MjIgYW5kICMxMzM4NTI3LCBmb3J3YXJkIHRlbXBsYXRlZCBjbGFzcyBkZWNsYXJhdGlvbnMgd2l0aG91dCBhCiAgICAgICAgICAgIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZWQgY2xhc3MgcGFyYW1ldGVycywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCBjbGFzcz4gY2xhc3MgWDsKCjAxLzIzLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMxNjQwODYyOiA8bWFsbG9jLmg+IHJlcGxhY2VkIGJ5IDxzdGRsaWIuaD4KCSAgICBQYXRjaCAjMTU5ODA2MyBUeXBvIGluIHR5cGVtYXBzLmkKCjAxLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgbHVhIHNwZWNpZmljIGNhcnJheXMuaSB3aGljaCBhZGRzIHRoZSBvcGVyYXRvcltdIHN1cHBvcnQuCgkgICAgbW9kaWZpZWQgdGhlIG1haW4gY29kZSB0byBtYWtlIGl0IG5vdCBlbWl0IGFsbCB0aGUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucyAmIGFjY2Vzc29ycwoJICAgIE5vdGU6IEMgc3RydWN0cyBhcmUgY3JlYXRlZCB1c2luZyBuZXdfWFhYKCkgd2hpbGUgQysrIGNsYXNzZXMgdXNlIFhYWCgpIChzaG91bGQgYmUgc3RhbmRhcmRpc2VkKQoJICAgIFVwZGF0ZWQgdGVzdCBjYXNlOiBsaV9jYXJyYXlzCgkgICAgVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbi4KCjAxLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZCBzdXBwb3J0IGZvciBuZXdmcmVlIHR5cGVtYXBzIChzb21ldGltZXMgdXNlZCBieSAlbmV3b2JqZWN0KQoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtbWFjcm9lcnJvcnMuICAgV2hlbiBzdXBwbGllZCwgdGhpcyB3aWxsIGZvcmNlCiAgICAgICAgICAgIHRoZSBDIHNjYW5uZXIvcGFyc2VyIHRvIHJlcG9ydCBwcm9wZXIgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGNvZGUgY29udGFpbmVkCiAgICAgICAgICAgIGluc2lkZSBTV0lHIG1hY3JvcyAoZGVmaW5lZCB3aXRoICVkZWZpbmUpLiAgQnkgZGVmYXVsdCwgU1dJRyBtZXJlbHkgcmVwb3J0cwogICAgICAgICAgICBlcnJvcnMgb24gdGhlIGxpbmUgYXQgd2hpY2ggYSBtYWNybyBpcyB1c2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgeW91CiAgICAgICAgICAgIGNhbiBleHBhbmQgdGhlIGVycm9yIGJhY2sgdG8gaXRzIHNvdXJjZS0tLXNvbWV0aGluZyB3aGljaCBtYXkgc2ltcGxpZnkKICAgICAgICAgICAgZGVidWdnaW5nLgoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXSBNYWpvciBvdmVyaGF1bCBvZiBDL0MrKyBzY2FubmluZyBpbXBsZW1lbnRhdGlvbi4gIEZvciBxdWl0ZQogICAgICAgICAgICBzb21lIHRpbWUsIFNXSUcgY29udGFpbmVkIHR3byBjb21wbGV0ZWx5IGluZGVwZW5kZW50IEMvQysrIHRva2VuaXplcnMtLQogICAgICAgICAgICB0aGUgbGVnYWN5IHNjYW5uZXIgaW4gQ1BhcnNlL2NzY2FubmVyLmMgYW5kIGEgZ2VuZXJhbCBwdXJwb3NlIHNjYW5uZXIKICAgICAgICAgICAgaW4gU3dpZy9zY2FubmVyLmMuIFNXSUcgc3RpbGwgaGFzIHR3byBzY2FubmluZyBtb2R1bGVzLCBidXQgdGhlIEMgcGFyc2VyCiAgICAgICAgICAgIHNjYW5uZXIgKENQYXJzZS9jc2Nhbm5lci5jKSBub3cgcmVsaWVzIHVwb24gdGhlIGdlbmVyYWwgcHVycG9zZQogICAgICAgICAgICBzY2FubmVyIGZvdW5kIGluIFN3aWcvc2Nhbm5lci5jLiAgQXMgYSByZXN1bHQsIGl0IGlzIG11Y2ggc21hbGxlciBhbmQKICAgICAgICAgICAgbGVzcyBjb21wbGljYXRlZC4gIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gbWFpbnRhaW4gYWxsCiAgICAgICAgICAgIG9mIHRoZSBsb3ctbGV2ZWwgQyB0b2tlbml6aW5nIGluIG9uZSBjZW50cmFsIGxvY2F0aW9uIGluc3RlYWQgb2YgdHdvCiAgICAgICAgICAgIHBsYWNlcyBhcyBiZWZvcmUuCgogICAgICAgICAgICAqKipQT1RFTlRJQUwgRkxBS0lORVNTKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBjYXVzZSBwcm9ibGVtcyB3aXRoIGFjY3VyYXRlIGxpbmUgbnVtYmVyIHJlcG9ydGluZwogICAgICAgICAgICBhcyB3ZWxsIGFzIGVycm9yIHJlcG9ydGluZyBtb3JlIGdlbmVyYWxseS4gSSBoYXZlIHRyaWVkIHRvIHJlc29sdmUgdGhpcwogICAgICAgICAgICBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgdGhlcmUgbWlnaHQgYmUgc29tZSBjb3JuZXIgY2FzZXMuCgowMS8xMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCB0eXBlbWFwIHRocm93cyBmb3Igc3RkOjpzdHJpbmcqLCB0eXBlbWFwIGZvciBTV0lHVFlQRSBEWU5BTUlDLAoJICAgIGNoYW5nZWQgdGhlIGV4aXN0aW5nIHRocm93cyB0eXBlbWFwIHRvIHRocm93IGEgc3RyaW5nIGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBvZgoJICAgIHRoZSBvYmplY3QgKHVwZGF0aW5nIGEgZmV3IHRlc3QgY2FzZXMgdG8gZGVhbCB3aXRoIHRoZSBjaGFuZ2UpLgoJICAgIGZpeGVkIHRlc3QgY2FzZTogZHluYW1pY19jYXN0cywgZXhjZXB0aW9uX3BhcnRpYWxfaW5mbywgbGlfc3RkX3N0cmluZywgc2l6ZV90CgowMS8wMy8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdLiAgVXNlIG9mIHN3aWdrZXlzLmMvLmggdmFyaWFibGVzIGlzIHJldm9rZWQuICBQbGVhc2UgdXNlCiAgICAgICAgICAgIHNpbXBsZSBzdHJpbmdzIGZvciBhdHRyaWJ1dGUgbmFtZXMuCgoxMi8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIEFQSSBmdW5jdGlvbnMgSGFzaEdldEF0dHIoKSBhbmQgSGFzaENoZWNrQXR0cigpIGhhdmUgYmVlbiByZXZva2VkLgogICAgICAgICAgICBQbGVhc2UgdXNlIEdldGF0dHIoKSB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzLiAgVGhlIGZ1bmN0aW9uIENoZWNrYXR0cigpIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIGNoZWNrIGF0dHJpYnV0ZXMuICBOb3RlOiAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiByZXZva2VkCiAgICAgICAgICAgIGJlY2F1c2UgdGhleSBvbmx5IGFkZGVkIGEgbWFyZ2luYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYXQgdGhlIGV4cGVuc2UKICAgICAgICAgICAgY29kZSBjbGFyaXR5LgoKMTIvMjYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbW9yZSBTVEwgKG1vcmUgZXhjZXB0aW9ucywgbWFwLCBzaXplX3QpLAoJICAgIGZpeGVkIHRlc3QgY2FzZTogY29udmVyc2lvbl9uc190ZW1wbGF0ZS4KCjEyLzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZSB0byB0aHJvdyBlcnJvcnMgd2hlbiBzZXR0aW5nIGltbXV0YWJsZXMsCgkgICAgYW5kIGFsbG93aW5nIHVzZXIgYWRkaXRpb24gb2YgbW9kdWxlIHZhcmlhYmxlcy4KCjEyLzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlZGVmJ2QgdmFyaWFibGUgd3JhcHBlcnMgdGhhdCB1c2UgJW5hdHVyYWx2YXIsIGVnLCBzdGQ6OnN0cmluZy4KCjEyLzE0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCB0eXBlbWFwcwoKMTIvMTQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCBidWcgIzE2MTM2NzMgKGJhZCBQSFA1IGNvZGUgZ2VuZXJhdGVkIGZvciBnZXR0ZXJzIGFuZAoJICAgIHNldHRlcnMpLgoKMTIvMDIvMjAwNjogd3NmdWx0b24sIEpvaG4gTGVueiwgRGF2ZSBCZWF6bGV5CiAgICAgICAgICAgIE1vdmUgZnJvbSBjdnMgdG8gU3VidmVyc2lvbiBmb3Igc291cmNlIGNvbnRyb2wKCjExLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgQ2xlYW5lZCB1cCBzd2lnd2FybmluZ3Muc3dnIGZpbGUgbm90IHRvIHVzZSBuZXN0ZWQgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbnMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBmb3IgJWV4dGVuZCB0byB3b3JrIGZvciBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KClZlcnNpb24gMS4zLjMxIChOb3ZlbWJlciAyMCwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogTHVpZ2kgQmFsbGFiaW8KICAgICAgICAgICAgW1B5dGhvbl0gQWx0ZXJuYXRlIGZpeCBmb3IgUHl0aG9uIGV4Y2VwdGlvbnMgYnVnICMxNTc4MzQ2ICh0aGUgcHJldmlvdXMgb25lIGJyb2tlIFB5dGhvbgogICAgICAgICAgICBwcm9wZXJ0aWVzIGluIG1vZGVybiBjbGFzc2VzKQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgLWZha2V2ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBub3cgZ2VuZXJhdGVzIHRoZSBmYWtlIHZlcnNpb24gaW50byB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZGlzcGxheWluZyBpdCB3aGVuIHRoZSAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gaXMgdXNlZC4KCjE0LzExLzIwMDY6IG1nb3NzYWdlCgkgICAgW2x1YV0gdXBkYXRlIHRvIHR5cGVtYXAgZm9yIG9iamVjdCBieSB2YWx1ZSwgdG8gbWFrZSBpdCBjODkgY29tcGxpYW50CgpWZXJzaW9uIDEuMy4zMCAoTm92ZW1iZXIgMTMsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtqYXZhXSBSZW1vdmUgRGV0YWNoQ3VycmVudFRocmVhZCBwYXRjaCBmcm9tICAwOC8xMS8yMDA2IC0gaXQgY2F1c2VzIHNlZ2ZhdWx0cwogICAgICAgICAgICBvbiBzb21lIHN5c3RlbXMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbcHl0aG9uXSBGaXggIzE1NzgzNDYgLSBQeXRob24gZXhjZXB0aW9ucyB3aXRoIC1tb2Rlcm4KCjExLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTU5MzI5MSAtIFNtYXJ0IHBvaW50ZXJzIGFuZCBpbmhlcml0aW5nIGZyb20gdGVtcGxhdGVzIAoKMTEvMDkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIG9wZXJhdG9yIHBvaW50ZXIvcmVmZXJlbmNlIGNhc3RzIC0gIzE1OTIxNzMuCgoxMS8wNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHNlbGYgc3BlY2lhbCB2YXJpYWJsZSBmb3IgJWV4dGVuZCBtZXRob2RzLiBQbGVhc2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBqdXN0ICdzZWxmJwogICAgICAgICAgICBhcyB0aGUgQysrICd0aGlzJyBwb2ludGVyLgoKMTEvMDcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXSAKCSAgICBhbGxlZ3JvY2wuc3dnOiBzd2lnLWRlZnZhciB1cGRhdGVkIHRvIGFsbG93IHNwZWNpZnlpbmcgb2YKCSAgICAJCSAgIG5vbi1kZWZhdWx0IGZvcmVpZ24gdHlwZSAodmlhIDpmdHlwZSBrZXl3b3JkIGFyZykuCgkgICAgYWxsZWdyb2NsLmN4eDogU3BlY2lmeSBwcm9wZXIgYWNjZXNzIHR5cGUgZm9yIGVudW0gdmFsdWVzLgoKMTEvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEvQyNdIEZpeCBjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuIHR5cGVzIGZvciBkaXJlY3RvcnMgYXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgTWFyayBEb25zZWx6bWFubgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBEZWxldGVMb2NhbFJlZiBmcm9tIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIGZvciBub3cgYXMgaXQgaXMgY2F1c2luZyBhCiAgICAgICAgICAgIHNlZyBmYXVsdCB3aGVuIHJ1biBvbiBTb2xhcmlzIDguCgoxMC8yOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIFBhdGNoIGZyb20gQ2hyaXMgU2hvZW1ha2VyIHRvIGNsZWFuIHVwIHNvbWUgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEltcG9ydGFudCBmaXggdG8gcHJldmVudCBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdGhlIEphdmEgcHJveHkgY2xhc3MKICAgICAgICAgICAgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBpbiBhIG5hdGl2ZSBtZXRob2QuIFRoZSBmaW5hbGl6ZXIgY291bGQgZGVzdHJveSB0aGUgdW5kZXJseWluZwogICAgICAgICAgICBDKysgb2JqZWN0IHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkLiBUaGUgcHJvYmxlbSBvY2N1cnMgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIHN0cm9uZ2x5IHJlYWNoYWJsZSBhZnRlciBhIG5hdGl2ZSBjYWxsLiAgVGhlIHByb2JsZW0gc2VlbXMgdG8gb2NjdXIgaW4KICAgICAgICAgICAgbWVtb3J5IHN0cmVzcyBzaXR1YXRpb25zIG9uIHNvbWUgSlZNcy4gSXQgZG9lcyBub3Qgc2VlbSB0byBvY2N1ciBvbiB0aGUKICAgICAgICAgICAgU3VuIGNsaWVudCBKVk0gdXAgdG8gamRrIDEuNS4gSG93ZXZlciB0aGUgMS42IGNsaWVudCBqZGsgaGFzIGEgbW9yZSBhZ2dyZXNzaXZlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdG9yIGFuZCBzbyB0aGUgcHJvYmxlbSBkb2VzIG9jY3VyLiBJdCBkb2VzIG9jY3VyIG9uIHRoZSBTdW4gc2VydmVyCiAgICAgICAgICAgIEpWTXMgKGNlcnRhaW5seSAxLjQgb253YXJkcykuIFRoZSBmaXggZW50YWlscyBwYXNzaW5nIHRoZSBwcm94eSBjbGFzcyBpbnRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIGFkZGl0aW9uIHRvIHRoZSBDKysgcG9pbnRlciBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIsIGFzIEphdmEgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICAgIGNvbGxlY3RlZCB3aGVuIHRoZXkgYXJlIHBhc3NlZCBpbnRvIEpOSSBtZXRob2RzLiBUaGUgZXh0cmEgcGFyYW1ldGVyIGNhbiBiZSBzdXBwcmVzc2VkCiAgICAgICAgICAgIGJ5IHNldHRpbmcgdGhlIG5vcGdjcHAgYXR0cmlidXRlIGluIHRoZSBqdHlwZSB0eXBlbWFwIHRvICIxIiBvciB1c2luZyB0aGUgbmV3IC1ub3BnY3BwCiAgICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgIFNlZSBKYXZhLmh0bWwjamF2YV9wZ2NwcCBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoaXMgdG9waWMuCgoxMC8yNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBzbWFydCBwb2ludGVyIHdyYXBwZXJzLiBUaGUgdmlydHVhbC9vdmVycmlkZS9uZXcga2V5d29yZCBpcyBub3QgZ2VuZXJhdGVkCiAgICAgICAgICAgIGZvciBlYWNoIG1ldGhvZCBhcyB0aGUgc21hcnQgcG9pbnRlciBjbGFzcyBkb2VzIG5vdCBtaXJyb3IgdGhlIHVuZGVybHlpbmcgcG9pbnRlcgogICAgICAgICAgICBjbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFNGICMxNDk2NTM1CgoxMC8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBuYXRpdmUgbWV0aG9kcyAmIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KICAgICAgICAgICAgZml4ZWQgdGVzdCBjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcyAmIGNwcF9iYXNpYy4gQWRkZWQgbmV3IGV4YW1wbGUgKGZ1bmN0b3IpLgogICAgICAgICAgICB0aWRpZWQgdXAgYSBsaXR0bGUgb2YgdGhlIGNvZGUgKGFyb3VuZCBjbGFzc0hhbmRsZXIpLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBkaXJlY3Rvcm91dCB0eXBlbWFwIGNoYW5nZXMgdG8gZmFsbCBpbiBsaW5lIHdpdGggdGhlIG90aGVyIGRpcmVjdG9yCiAgICAgICAgICAgIGxhbmd1YWdlcy4gJHJlc3VsdCBpcyBub3cgdXNlZCB3aGVyZSAkMSB1c2VkIHRvIGJlIHVzZWQuIFBsZWFzZSBjaGFuZ2UgeW91ciB0eXBlbWFwcwogICAgICAgICAgICBpZiB5b3UgaGF2ZSBhIGN1c3RvbSBkaXJlY3Rvcm91dCB0eXBlbWFwLgoKMTAvMTgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU29tZSBmaXhlcyBmb3IgYXBwbHlpbmcgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMgdG8gdW5zaWduZWQgY2hhciBhcnJheXMuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBpbiBjb25zdCBzaXplX3QmIGFuZCBjb25zdCBzdGQ6OnNpemVfdCYgdHlwZW1hcHMuCgoxMC8xNS8yMDA2OiBlZnV6enlvbmUgCiAgICAgICAgICAgIFtDRkZJXSBTdXBwcmVzcyBnZW5lcmF0aW5nIGRlZmN0eXBlIGZvciBlbnVtcywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuIFBhdGNoIDE1NjA5ODMuIAoKMTAvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBNaW5vciBmaXggdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCB0aGUgKGFzIHlldCB1bnJlbGVhc2VkKSBjaGlja2VuIDIuNQoKICAgICAgICAgICAgW0d1aWxlLENoaWNrZW5dIEZpeCBTRiBCdWcgMTU3Mzg5Mi4gIEFkZGVkIGFuIGV4dF90ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIHRvIHRlc3QKICAgICAgICAgICAgdGhpcyBidWcsIGJ1dCB0aGlzIHRlc3QgY2FuIG5vdCByZWFsbHkgYmUgbWFkZSBnZW5lcmljIGJlY2F1c2UgdGhlIGV4dGVybmFsIGNvZGUgbXVzdAogICAgICAgICAgICBwbHVnIGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBpbnRlcnByZXRlciBkaXJlY3RseS4KICAgICAgICAgICAgU2VlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvY2hpY2tlbi9leHRfdGVzdC5pIGFuZCBleHRfdGVzdF9leHRlcm5hbC5jeHgKCiAgICAgICAgICAgIEFkZGVkIGEgJS5leHRlcm5hbHRlc3QgdG8gY29tbW9uLm1rLCBhbmQgYW55IGludGVyZXN0ZWQgbGFuZ3VhZ2UgbW9kdWxlcyBjYW4KICAgICAgICAgICAgY29weSBhbmQgc2xpZ2h0bHkgbW9kaWZ5IGVpdGhlciB0aGUgY2hpY2tlbiBvciB0aGUgZ3VpbGUgZXh0X3Rlc3QuaQoKMTAvMTQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gYWRkZWQgT1VUUFVUJiBmb3IgYWxsIG51bWJlciB0eXBlcywgYWRkZWQgYSBsb25nIGxvbmcgdHlwZQogICAgICAgICAgICBmaXhlZCBzZXZlcmFsIHRlc3QgY2FzZXMuCiAgICAgICAgICAgIHVwZGF0ZTogY2hhbmdlZCB0eXBlbWFwcyB0byB1c2UgU1dJR19Db252ZXJ0UHRyIHJhdGhlciB0aGFuIFNXSUdfTXVzdEdldFBvaW50ZXIKICAgICAgICAgICAgc3RhcnRlZCBzcGxpdGluZyBsdWEuc3dnIGludG8gc21hbGxlciBwYXJ0cyB0byBtYWtlIGl0IG5lYXRlcgoKMTAvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBNYXJnaW5hbGx5IGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSBvbmx5IGluIHRoYXQgeW91IGNhbgogICAgICAgICAgICBjb250cm9sIHdoYXQgdGhlIGJhc2UgY2xhc3MgaXMuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgbmV3ICdyZXBsYWNlJyBhdHRyaWJ1dGUgaW4gdGhlIAogICAgICAgICAgICBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcCwgZWcgaW4gdGhlIGZvbGxvd2luZywgJ01lJyB3aWxsIGJlIHRoZSBiYXNlIGNsYXNzLAogICAgICAgICAgICBubyBtYXR0ZXIgd2hhdCBGb28gaXMgcmVhbGx5IGRlcml2ZWQgZnJvbSBpbiB0aGUgQysrIGxheWVyLgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiOwogICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiOwoKICAgICAgICAgICAgUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIGZvciB0aGUgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXBzIHRvIG92ZXJyaWRlIHRoZSBDKysgYmFzZS4KCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgZGVsZXRlKCkgbWV0aG9kIAogICAgICAgICAgICAoaXQgaXMgbm93IGEgc3luY2hyb25pemVkIG1ldGhvZCwgYnV0IGlzIG5vdyBjdXN0b21pc2FibGUgYnkgY2hhbmdpbmcgdGhlIAogICAgICAgICAgICBtZXRob2Rtb2RpZmllcnMgYXR0cmlidXRlIGluIHRoZSBqYXZhZGVzdHJ1Y3Qgb3IgamF2YWRlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcCkKCiAgICAgICAgICAgIFtDI10gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIERpc3Bvc2UoKSBtZXRob2QsIAogICAgICAgICAgICBzaW1pbGFyIHRvIEphdmEncyBkZWxldGUoKSBhYm92ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gUmVtb3ZlIHJlZHVuZGFudCBkaXJlY3RvciBjb2RlIGluICVleHRlbmQgbWV0aG9kcyAoJWV4dGVuZAogICAgICAgICAgICBtZXRob2RzIGNhbm5vdCBiZSBkaXJlY3RvciBtZXRob2RzKQoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gRml4ICMxNTA1NTk0IC0gZGlyZWN0b3Igb2JqZWN0cyBub3QgcmV0dXJuZWQgYXMgZGlyZWN0b3Igb2JqZWN0cwogICAgICAgICAgICBpbiAlZXh0ZW5kIG1ldGhvZHMuCgoxMC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMxMjM4Nzk4IC0gRGlyZWN0b3JzIHVzaW5nIHVuc2lnbmVkIGxvbmcgbG9uZyBvciBhbnkgb3RoZXIgdHlwZQogICAgICAgICAgICBtYXJzaGFsbGVkIGFjcm9zcyB0aGUgSk5JIGJvdW5kYXJ5IHVzaW5nIGEgSmF2YSBjbGFzcyAod2hlcmUgdGhlIGpuaSB0eXBlbWFwIAogICAgICAgICAgICBjb250YWlucyBqb2JqZWN0KS4KCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTE2MjE5NCAtICNpbmNsdWRlLyVpbmNsdWRlIHdpdGhpbiBhIHN0cnVjdHVyZQoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDUwNjYxLCBzdHJpbmcgdHJ1bmNhdGlvbiBpbiBTdHJpbmdfc2VlayB0cnVuY2F0aW5nIEphdmEvQyMgZW51bXMuCgoxMC8wNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXggIzE1Njk1ODcuIFRoZSBuYW1lIGlzIG5vdyBjb3JyZWN0LgoKMTAvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3IgZml4ZXMgZm9yIHZpcnR1YWwgY29udmVyc2lvbiBvcGVyYXRvcnMKCjEwLzA0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggIzE1Njk1ODcgZm9yIFBIUC4gIERvbid0IHVzZSBzaXplb2YoKSBleGNlcHQgd2l0aCBzdHJpbmcKCSAgICBsaXRlcmFscy4gIENoYW5nZSBzb21lICIvLyIgY29tbWVudHMgdG8gIi8qICovIiBmb3IgcG9ydGFiaWxpdHkuCgoxMC8wNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXJ0aWFsIEZpeCAjMTU2OTU4Ny4gVGhlIHR5cGUgaXMgbm93IGNvcnJlY3QsIGJ1dCB0aGUgbmFtZSBpcyBzdGlsbCBub3QgY29ycmVjdC4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzE1Mjc4ODUgLSBPdmVybG9hZGVkIGRpcmVjdG9yIHZpcnR1YWwgbWV0aG9kcyBzb21ldGltZXMgcHJvZHVjZWQKICAgICAgICAgICAgdW5jb21waWxhYmxlIGNvZGUgd2hlbiB1c2VkIHdpdGggdGhlIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlLgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3JzOiBEaXJlY3RvcnMgYXJlIG91dHB1dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgcmF0aGVyIHRoYW4gaW4gc29tZSBwc2V1ZG8tcmFuZG9tIG9yZGVyLgoKMTAvMDMvMjAwNjogbW1hdHVzCiAgICAgICAgICAgIEZpeCAjMTQ4NjI4MSBhbmQgIzE0NzEwMzkuCgoxMC8wMy8yMDA2OiBvbGx5CgkgICAgW1BlcmxdIEZpeCBmb3IgaGFuZGxpbmcgc3RyaW5ncyB3aXRoIHplcm8gYnl0ZXMgZnJvbSBTdGVwaGVuIEh1dHNhbC4KCjA5LzMwLzIwMDY6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gQml0ZmllbGQgc3VwcG9ydCBhbmQgdmFyYXJnIHN1cHBvcnQgZHVlIHRvIEFydGh1ciBTbXlsZXMuCiAgICAgICAgICAgIEMgZXhwcmVzc2lvbiB0byBMaXNwIGNvbnZlcnNpb24sIHRoYW5rcyB0byBBcnRodXIgU215bGVzIGZvciB0aGUgaW5pdGlhbAogICAgICAgICAgICBpZGVhLCBpdCBub3cgc3VwcG9ydHMgY29udmVyc2lvbiBmb3IgYSB3aG9sZSByYW5nZSBvZiBDIGV4cHJlc3Npb25zLiAKCjA5LzI4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUwODMyNyAtIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgaGlkZGVuIHdoZW4gdXNpbmcgLWZ2aXJ0dWFsIG9wdGltaXNhdGlvbi4KICAgICAgICAgICAgT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgY2FuZGlkYXRlcyBmb3IgZWxpbWluYXRpb24gLSB0aGlzIG1pbWljcwogICAgICAgICAgICBDKysgYmVoYXZpb3VyIHdoZXJlIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZAogICAgICAgICAgICBpbiBhIGRlcml2ZWQgY2xhc3MgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUgYXZhaWxhYmxlLgoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbiwgT2NhbWxdIEZpeCAjMTUwNTU5MSBUaHJvd2luZyBleGNlcHRpb25zIGluIGV4dGVuZGVkIGRpcmVjdG9ycwoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDU2MTAwIC0gdmlydHVhbCBvcGVyYXRvcnMuIAoKMDkvMjQvMjAwNjogb2xseQoJICAgIERvbid0IGFjY2lkZW50YWxseSBjcmVhdGUgYSAiPDoiIHRva2VuICh3aGljaCBpcyB0aGUgc2FtZSBhcyAiWyIgaW4gQysrKS4KCSAgICBGaXhlcyBidWcgIyAxNTIxNzg4LgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFtSdWJ5XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIHRoZSBSdWJ5IDEuOQoJICAgIGRldmVsb3BtZW50IGJyYW5jaC4gIEZpeGVzIGJ1ZyAjMTU2MDA5Mi4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBUZW1wbGF0ZXMgY2FuIG5vdyBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycyBhbmQKCSAgICBjb25zdGFudCBleHByZXNzaW9ucywgZS5nLjoKCgkgICAgdGVtcGxhdGU8aW50IHE+IGNsYXNzIHgge307CgkgICAgJXRlbXBsYXRlKHhfbWludXMxKSB4PC0xPjsKCSAgICAldGVtcGxhdGUoeF8xcGx1czIpIHg8MSsyPjsKCgkgICAgQWxzbywgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2FuIG5vdyBpbmNsdWRlIGNvbXBhcmlzb25zICg+LCA8LCA+PSwKCSAgICA8PSwgIT0sID09KSwgbW9kdWx1cyAoJSksIGFuZCB0ZXJuYXJ5IGNvbmRpdGlvbmFscyAoYSA/IGIgOiBjKS4KCgkgICAgRml4ZXMgYnVncyAjNjQ2Mjc1LCAjOTI1NTU1LCAjOTU2MjgyLCAjOTk0MzAxLgoKMDkvMjIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgbWV0aG9kcyAtIEJ1Z3MgIzE1NDYyNTQsICMxNTQzNTMzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHRzIGFuZCBhc3NlcnRzIHdoZW4gZGlyZWN0b3IgbWV0aG9kcyBhcmUgaWdub3JlZCAoIzE1NDM1MzMpCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3V0IG9mIHNvdXJjZSBidWlsZHMgLSBidWcgIzE1NDQ3MTgKCjA5LzIwLzIwMDY6IG9sbHkKCSAgICBUcmVhdCBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiByYXRoZXIKCSAgICB0aGFuIGlnbm9yaW5nIGl0IGNvbXBsZXRlbHksIHNvIHRoYXQgd2UgZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvcgoJICAgIHBhc3Npbmcgb3BhcXVlIHBvaW50ZXJzIHRvIHRoZSBuZXN0ZWQgY2xhc3MgKGZpeGVzIFNGIGJ1ZyAjOTA5Mzg3KS4KCjA5LzIwLzIwMDY6IG9sbHkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgW3BocF0gT3ZlcmxvYWQgcmVzb2x1dGlvbiBub3cgd29ya3MuICBIb3dldmVyIHRvIGFsbG93IHRoaXMsIFNXSUcKCSAgICBnZW5lcmF0ZWQgd3JhcHBlcnMgbm8gbG9uZ2VyIGNvZXJjZSBQSFAgdHlwZXMgKHdoaWNoIHJldmVydHMgYSBjaGFuZ2UKCSAgICBtYWRlIGluIDEuMy4yNikuICBTbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXRob2QgdGFrZXMgYSBzdHJpbmcsIHlvdQoJICAgIGNhbiBubyBsb25nZXIgcGFzcyBhIG51bWJlciB3aXRob3V0IGV4cGxpY2l0bHkgY29udmVydGluZyBpdCB0byBhCgkgICAgc3RyaW5nIGluIFBIUCB1c2luZzogKHN0cmluZyl4CgowOS8xOC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSBmaXggb24gc3dpZ2luaXQuc3dnLCBoYXMgYmVlbiByZXBvcnRlZCB0byBjcmFzaCBvbiBzZXZlcmFsIHRlc3QgY2FzZXMKCSAgICBmb3VuZCBhbmQgZml4ZWQgcHJvYmxlbSBpbiBpbXBvcnRzIHVuZGVyIHB5dGhvbiAobWluZ3cpCgowOS8xNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCBmcm9tIE1pY2hhbCBNYXJlayBmb3IgUHl0aG9uIDIuNSB0byBmaXggNjQgYml0IGFycmF5IGluZGV4ZXMgb24KICAgICAgICAgICAgNjQgYml0IG1hY2hpbmVzLgoKMDkvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGhhcyBiZWVuIHNjcmFwcGVkLiBUaGlzIGZlYXR1cmUgd2FzIGludHJvZHVjZWQgcHJpbWFyaWx5CiAgICAgICAgICAgIHRvIHNvbHZlIHJlY3Vyc2l2ZSBkaXJlY3RvciBtZXRob2QgY2FsbHMuIERpcmVjdG9yIHVwY2FsbCBpbXByb3ZlbWVudHMgbWFkZSBpbnN0ZWFkOgoKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIFRoZSBzd2lnX3VwIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIFRoZSByZXF1aXJlZCBtdXRleGVzCiAgICAgICAgICAgIHdyYXBwaW5nIHRoaXMgZmxhZyBhcmUgYWxzbyBubyBsb25nZXIgbmVlZGVkLiBUaGUgcmVjdXJzaXZlIGNhbGxzIGdvaW5nIGZyb20gQysrCiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGJhY2sgYWdhaW4gZXRjIGFyZSBub3cgYXZvaWRlZCBieSBhIHN1YnRsZWx5IGRpZmZlcmVudAogICAgICAgICAgICBhcHByb2FjaC4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3dpZ191cCBmbGFnIGluIGVhY2ggZGlyZWN0b3IgbWV0aG9kIHRvIGluZGljYXRlCiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGV4cGxpY2l0IEMrKyBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIG1ldGhvZCBvciBhIG5vcm1hbAogICAgICAgICAgICBwb2x5bW9ycGhpYyBDKysgY2FsbCBzaG91bGQgYmUgbWFkZSwgdGhlIG5ldyBhcHByb2FjaCBtYWtlcyBvbmUgb2YgdGhlc2UgY2FsbHMKICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgd3JhcHBlciBtZXRob2QuCgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSByZWN1cnNpdmUgY2FsbCBwcm9ibGVtIHdoZW4gY2FsbGluZyBhIEMrKyBiYXNlIGNsYXNzIG1ldGhvZCBmcm9tCiAgICAgICAgICAgIEphdmEvQyMgaXMgbm93IGZpeGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgYXMgdGhlIGRldGVjdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBleHBsaWNpdCBjYWxsIG9yIGEgbm9ybWFsIHBvbHltb3JwaGljIGNhbGwgaXMgbWFkZQogICAgICAgICAgICBpbiB0aGUgSmF2YS9DIyBsYXllciByYXRoZXIgdGhhbiBpbiB0aGUgQysrIGxheWVyLgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gdXBkYXRlZCBzd2lnaW5pdC5zd2cgdG8gYWxsb3cgbXVsdGlwbGUgaW50ZXJwcmV0ZXJzIHRvIHVzZSBtdWx0aXBsZQoJICAgIHN3aWcgbW9kdWxlcyBhdCBvbmNlLiBUaGlzIGhhcyBiZWVuIHRlc3RlZCBpbiBMdWEgKG1pbmd3ICYgbGludXgpLAoJICAgIHBlcmw1ICYgcHl0aG9uIChsaW51eCkgb25seS4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXMgd2VsbCBhcyBuYXRpdmUgbHVhIG9iamVjdAogICAgICAgICAgICBpbnRvIHdyYXBwZXJlZCBmdW5jdGlvbi4KICAgICAgICAgICAgQWRkZWQgZXhhbXBsZSBmdW5jcHRyMyB0byBkZW1vbnN0cmF0ZSB0aGlzIGZlYXR1cmUKCjA5LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW5hbWUgRXJyb3JDb2RlIGFuZCBFcnJvck1zZyAjZGVmaW5lLXMgdG8gU1dJR19FcnJvckNvZGUKCSAgICBhbmQgU1dJR19FcnJvck1zZyB0byBhdm9pZCBjbGFzaGVzIHdpdGggY29kZSB0aGUgdXNlciBtaWdodCBiZQoJICAgIHdyYXBwaW5nIChwYXRjaCBmcm9tIERhcnJlbiBXYXJuZXIgaW4gU0YgYnVnICMxNDY2MDg2KS4gIEFueQoJICAgIHVzZXIgdHlwZW1hcHMgd2hpY2ggdXNlIEVycm9yQ29kZSBhbmQvb3IgRXJyb3JNc2cgZGlyZWN0bHkgd2lsbAoJICAgIG5lZWQgYWRqdXN0aW5nIC0geW91IGNhbiBlYXNpbHkgZml4IHRoZW0gdG8gd29yayB3aXRoIGJvdGggb2xkCgkgICAgYW5kIG5ldyBTV0lHIGJ5IGNoYW5naW5nIHRvIHVzZSBTV0lHX0Vycm9yTXNnIGFuZCBhZGRpbmc6CgoJCSNpZm5kZWYgU1dJR19FcnJvck1zZwoJCSNkZWZpbmUgU1dJR19FcnJvck1zZygpIEVycm9yTXNnKCkKCQkjZW5kaWYKCjA4LzI5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBNb3ZlIGNvbnN0YW50IGluaXRpYWxpc2F0aW9uIGZyb20gUklOSVQgdG8gTUlOSVQgdG8gZml4IGEKCSAgICB3YXJuaW5nIHdoZW4gdXNpbmcgQXBhY2hlIGFuZCBtb2RfcGhwLiAgV2Ugb25seSBuZWVkIHRvIGNyZWF0ZQoJICAgIFBIUCBjb25zdGFudHMgb25jZSB3aGVuIHdlJ3JlIGZpcnN0IGluaXRpYWxpc2VkLCBub3QgZm9yIGV2ZXJ5IEhUVFAKCSAgICByZXF1ZXN0LgoKMDgvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1NDI0NjYgYWRkZWQgY29kZSB0byBhbGxvdyBtYXBwaW5nIEx1YSBuaWwncyA8LT4gQy9DKysgTlVMTCdzCgkgICAgdXBkYXRlZCB2YXJpb3VzIHR5cGVtYXBzIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIGNoYW5nZXMKCSAgICBhZGRlZCB2b2lkdGVzdF9ydW5tZS5sdWEgdG8gc2hvdyB0aGUgZmVhdHVyZXMgd29ya2luZwoKMDgvMTkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBBZGQgZmVhdHVyZTpjb25zdGFzdmFyIHRvIGV4cG9ydCBjb25zdGFudHMgYXMgdmFyaWFibGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZS4KCjA4LzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEZXRhY2hDdXJyZW50VGhyZWFkIGNhbGxzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IG5hdGl2ZWx5IGNyZWF0ZWQgdGhyZWFkcwogICAgICAgICAgICBubyBsb25nZXIgcHJldmVudCB0aGUgSlZNIGZyb20gZXhpdGluZy4gQnVnIHJlcG9ydGVkIGJ5IFRob21hcyBEdWR6aWFrIGFuZAogICAgICAgICAgICBQYXVsIE5vbGwuCgowOC8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBzbyB0aGV5IHdvcmsKCjA3LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtb3JlIGFkZGl0aW9ucyB0byBzdGQ6OnN0cmluZywgc29tZSB0d2Vha3MgYW5kIHNtYWxsIGJ1ZyBmaXhlcwoJICAgIC1ub2N3cmFwIG1vZGUuCgowNy8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTUyNjAyMiBwZGF0ZWQgc3RkOjpzdHJpbmcgdG8gc3VwcG9ydCBzdHJpbmdzIHdpdGggJ1wwJyBpbnNpZGUgdGhlbQoJICAgIHVwZGF0ZWQgdHlwZW1hcHMuaSB0byBhZGQgc3VwcG9ydCBmb3IgcG9pbnRlciB0byBwb2ludGVycwoKMDcvMTkvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gQWRkIHN0ZF9zdHJpbmcuaSBzdXBwb3J0LgoJICAgIC0gQWRkIG5ld29iamVjdCBwYXRjaCBzdWJtaXR0ZWQgYnkgbWtvZXBwZSAodGhhbmtzISkKCSAgICAtIEZpeCB0eXBlIG5hbWUgbWlzbWF0Y2ggaXNzdWUgZm9yIG5lc3RlZCB0eXBlIGRlZmluaXRpb25zLgoJICAgICAgc3BlY2lmaWNhbGx5IHR5cGVkZWZzIGluIHRlbXBsYXRlZCBjbGFzcyBkZWZucy4KCjA3LzE4LzIwMDY6IG1nb3NzYWdlCgkgICAgQnVnZml4ICMxNTIyODU4CgkgICAgdXBkYXRlZCBsdWEuY3h4IHRvIHN1cHBvcnQgLWV4dGVybmFsLXJ1bnRpbWUgY29tbWFuZAoKMDcvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgSW5jcmVtZW50IHRoZSBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byAzLCBiZWNhdXNlIG9mIHRoZQoJICAgIGFkZGl0aW9uIG9mIHRoZSBvd25kYXRhIG1lbWJlciBpbiBzd2lnX3R5cGVfaW5mby4KCSAgICBSZXBvcnRlZCBieTogUHJhYmh1IFJhbWFjaGFuZHJhbgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU2VhcmNoIHBhdGggZml4ZXM6CiAgICAgICAgICAgIC0gRml4IHNlYXJjaCBwYXRoIGZvciBsaWJyYXJ5IGZpbGVzIHRvIGJlaGF2ZSBhcyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbC4KICAgICAgICAgICAgLSBGaXggbWluZ3cvbXN5cyBidWlsZHMgd2hpY2ggZGlkIG5vdCBmaW5kIHRoZSBTV0lHIGxpYnJhcnkgd2hlbiBpbnN0YWxsZWQuCiAgICAgICAgICAgIC0gV2luZG93cyBidWlsZHMgYWxzbyBvdXRwdXQgdGhlIG1pbmd3L21zeXMgaW5zdGFsbCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcKICAgICAgICAgICAgICBzd2lnIC1zd2lnbGliLgogICAgICAgICAgICAtIFRoZSBub24tZXhpc3RlbnQgYW5kIHVuZG9jdW1lbnRlZCBjb25maWcgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBoYXMKICAgICAgICAgICAgICBiZWVuIHJlbW92ZWQuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHN5bW5hbWUgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24uCgowNy8wNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBBZGQgJWZlYXR1cmUoImNvbnN0YXN2YXIiKSwgd2hpY2ggaW5zdGVhZCBvZiBleHBvcnRpbmcgYSBjb25zdGFudCBhcyBhCgkgICAgc2NoZW1lIGZ1bmN0aW9uLCBleHBvcnRzIHRoZSBjb25zdGFudCBhcyBhIHNjaGVtZSB2YXJpYWJsZS4gIFVwZGF0ZSB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGFzIHdlbGwuCgowNy8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbU2VlIGVudHJ5IG9mIDA5LzEzLzIwMDYgLSBleHBsaWNpdGNhbGwgZmVhdHVyZSBhbmQgZG9jdW1lbnRhdGlvbiB0byBpdCByZW1vdmVkXQogICAgICAgICAgICBOZXcgZXhwbGljaXRjYWxsIGZlYXR1cmUgd2hpY2ggZ2VuZXJhdGVzIGFkZGl0aW9uYWwgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICB0aGF0IGNhbGwgdGhlIG1ldGhvZCBleHBsaWNpdGx5LCBub3QgcmVseWluZyBvbiBwb2x5bW9ycGhpc20gdG8gbWFrZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGNhbGwuIFRoZSBmZWF0dXJlIGlzIGEgZmVhdHVyZSBmbGFnIGFuZCBpcyBlbmFibGVkIGxpa2UgYW55IG90aGVyIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgSXQgYWxzbyByZWNvZ25pc2VzIGFuIGF0dHJpYnV0ZSwgInN1ZmZpeCIgZm9yIG1hbmdsaW5nIHRoZSBmZWF0dXJlIG5hbWUsIHNlZQogICAgICAgICAgICBTV0lHUGx1cy5odG1sI1NXSUdQbHVzX2V4cGxpY2l0Y2FsbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBpcyBhbHNvIGEgd29ya2Fyb3VuZCBmb3Igc29sdmluZyB0aGUgcmVjdXJzaXZlIGNhbGxzCiAgICAgICAgICAgIHByb2JsZW0gd2hlbiBhIGRpcmVjdG9yIG1ldGhvZCBtYWtlcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIG1ldGhvZC4gU2VlCiAgICAgICAgICAgIEphdmEuaHRtbCNqYXZhX2RpcmVjdG9yc19leHBsaWNpdGNhbGwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KCjA2LzI4LzIwMDY6IGpvZSAoSm9zZXBoIFdhbmcpCgkgICAgW3JdIEluaXRpYWwgc3VwcG9ydCBmb3IgUgoKMDYvMjAvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCiAgICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIGdldCBhcHBseV9zdHJpbmdzLmkgdGVzdHN1aXRlIHRvIHBhc3MKCSAgICBSZW1vdmUgaW50ZWdlcnNfcnVubWUuc2NtIGZyb20gdGhlIHRlc3RzdWl0ZSwgYmVjYXVzZSBTV0lHIGFuZCBDaGlja2VuIGRvZXMKICAgICAgICAgICAgaGFuZGxlIG92ZXJmbG93cy4KCjA2LzE5LzIwMDU6IG9sbHkKCSAgICBbcGhwXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBQSFA1IGNsYXNzIHdyYXBwZXJzIGZvciBDKysKCSAgICBjbGFzc2VzICh1c2UgInN3aWcgLXBocDUiKS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBBZGRlZCBzb21lIG1pc3Npbmcga2V5d29yZHMgdG8gdGhlIFBIUDQga2V5d29yZCBsaXN0LCBhbmQKCSAgICBmaXhlZCBfX0xJTkVfXyBhbmQgX19GSUxFX18gd2hpY2ggd2VyZSBpbiB0aGUgd3JvbmcgY2F0ZWdvcnkuCgkgICAgQWxzbyBhZGRlZCBhbGwgdGhlIGtleXdvcmRzIG5ldyBpbiBQSFA1LCBhbmQgYWRkZWQgY29tbWVudHMKCSAgICBub3RpbmcgdGhlIFBIUDQga2V5d29yZHMgd2hpY2ggYXJlbid0IGtleXdvcmRzIGluIFBIUDUuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIGFzIHRoaXMgcG9pbnRlciAoZS5nLgoJICAgIENsYXNzX21ldGhvZChOdWxsKSkgLSBnaXZlIGEgUEhQIEVycm9yIGluc3RlYWQuCgowNi8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lciBjbGFzcy4KCSAgICBGaXggYSBmZXcgYnVncyBpbiBoZWxwZXIgZnVuY3Rpb25zLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlcGxhY2UgSk5JRVhQT1JUIHdpdGggU1dJR0VYUE9SVCwgdGhlcmVieSBlbmFibGluZyB0aGUgcG9zc2liaWxpdHkKICAgICAgICAgICAgb2YgdXNpbmcgZ2NjIC1mdmlzaWJpbGl0eT1oaWRkZW4gZm9yIHBvdGVudGlhbGx5IHNtYWxsZXIgZmFzdGVyIGxvYWRpbmcgd3JhcHBlcnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIE1ha2VmaWxlcyBmb3IgYXV0b2NvbmYtMi42MCBiZXRhCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBWbGFkaW1pciBNZW5zaGFrb3YgcGF0Y2ggZm9yIGNvbXBpbGluZyB3cmFwcGVycyB3aXRoIHB5dGhvbi0yLjUgYWxwaGEuCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVmZmVyIG92ZXJmbG93IGVycm9yIHdoZW4gdXNpbmcgbGFyZ2UgJWZlYXR1cmUoZG9jc3RyaW5nKSByZXBvcnRlZAogICAgICAgICAgICBieSBKb3NlcGggV2luc3Rvbi4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBPcGVyYXRvciBvdmVybG9hZCBmaXggZnJvbSBEYW5pZWwgTW9vcmUuCgowNS8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBnZW5lcmF0aW9uIG9mIENMT1MgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHVuaW9ucwoJICAgIGFuZCBlcXVpdmFsZW50IHR5cGVzLgoKMDUvMjQvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIERvbid0IHJlcXVpcmUgYSBmdWxsIGNsYXNzIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgYSBDTE9TIHdyYXBwZXIuCgowNS8yMC8yMDA2OiBvbGx5CgkgICAgW3BocF0gR0NDIFZpc2liaWxpdHkgc3VwcG9ydCBub3cgd29ya3Mgd2l0aCBQSFAuCgowNS8xOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVtb3ZlZCBzdXBwb3J0IGZvciAtZGxuYW1lICh1c2UgLW1vZHVsZSBpbnN0ZWFkKS4gIEZpeGVkCgkgICAgbmFtaW5nIG9mIFBIUCBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQSFAKCSAgICBjb252ZW50aW9ucyAobm8gInBocF8iIHByZWZpeCBvbiBVbml4OyBvbiBQSFAgPj0gNC4zLjAsIGhhbmRsZSBVbml4CgkgICAgcGxhdGZvcm1zIHdoaWNoIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiLnNvIiBhcyB0aGUgZXh0ZW5zaW9uLikKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZAoKMDUvMDcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCB3aGVyZSBhIEMrKyByZWZlcmVuY2UKCSAgICBpcyB3YW50ZWQuCgowNS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IHdyYXBwZXJzIGdlbmVyYXRlZCBmb3IgZ2xvYmFsICdjaGFyJyB2YXJpYWJsZXMgdG8gbm90CgkgICAgaW5jbHVkZSBhIHRlcm1pbmF0aW5nIHplcm8gYnl0ZSBpbiB0aGUgUEhQIHN0cmluZy4KCjA1LzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSB0eXBlbWFwcyBzbyB0aGF0IGNoYXIgKiBjYW4gYmUgYXBwbGllZCB0byB1bnNpZ25lZCBjaGFyICogb3Igc2lnbmVkIGNoYXIgKgogICAgICAgICAgICB0eXBlcyBhbmQgdmlzYSB2ZXJzYS4KCjA1LzAzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXVRoYW5rcyB0byBMdWtlIEogQ3Jvb2sgZm9yIHRoaXMgaWRlYS4KICAgICAgICAgICAgIC0gYSBzdHJ1Y3QvZW51bS91bmlvbiBpcyByZXBsYWNlZCB3aXRoIDpwb2ludGVyIG9ubHkgaWYKICAgICAgICAgICAgICAgdGhhdCBzbG90IGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0byB0aGF0IHR5cGUuIFNvLDogCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFfc3RydWN0IHsgaW50IHg7IH0gYW5kCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJfc3RydWN0IHsgYV9zdHJ1Y3Qgc3RydWN0XzE7IH07IAogICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBhczoKICAgICAgICAgICAgICAgICAgIChjZmZpOmRlZmNzdHJ1Y3QgYl9zdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdF8xIGFfc3RydWN0KSkKICAgICAgICAgICAgIC0gT3RoZXIgbWlub3IgZml4ZXMgaW4gbGlzcGlmeWluZyBuYW1lcy4KCjA1LzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwb3NzaWJsZSByZWRlZmluaXRpb24gb2YgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIGZvciBWQysrLgoKMDQvMTQvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCiAgICAgICAgICAgIFRoYW5rcyB0byBUaG9tYXMgV2VpZG5lciBmb3IgdGhlIHBhdGNoLgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBleHBvcnQgaXMgc2V0IChleHBvcnQgJ2ZvbykgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBldmVyeSBzeW1ib2wKICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW5saW5lIGlzIHNldCAoZGVjbGFpbSAoaW5saW5lIGZvbykpIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbnRlcm5fZnVuY3Rpb24gaXMgc2V0IAogICAgICAgICAgICAgICMuKHZhbHVlLW9mLWludGVybi1mdW5jdGlvbiAibmFtZSIgIm5vZGVUeXBlIiBwYWNrYWdlKQogICAgICAgICAgICAgIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGUgcGxhaW4gc3ltYm9sLiBBIHNhbXBsZSBzd2lnLWxpc3BpZnkgCiAgICAgICAgICAgICAgaXMgcHJvdmlkZWQuCiAgICAgICAgICAgIC0gZXZlcnkgc3ltYm9sIGlzIHByZWZpeGVkIGJ5IGl0J3MgcGFja2FnZS4KCjA0LzEzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQoJICAgIEZpeGVkIHRoZSBnZW5lcmF0aW9uIG9mIHdyYXBwZXJzIGZvciBnbG9iYWwgdmFyaWFibGVzLiAKICAgICAgICAgICAgQWRkZWQgdGhlIG9wdGlvbiBbbm9dc3dpZy1saXNwIHdoaWNoIHR1cm5zIG9uL29mZiBnZW5lcmF0aW9uIAogICAgICAgICAgICBvZiBjb2RlIGZvciBzd2lnIGhlbHBlciBsaXNwIG1hY3JvLCBmdW5jdGlvbnMsIGV0Yy4KClZlcnNpb24gMS4zLjI5IChNYXJjaCAyMSwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBvdXRwdXQgdHlwZW1hcCBvZiBjaGFyIHNvIGl0IHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluc3RlYWQKCSAgICBvZiBhbiBpbnRlZ2VyLiBBbHNvIGFkZHMgaW5wdXQvb3V0cHV0IHR5cGVtYXBzIGZvciAnY2hhciAqJy4KCgkgICAgYWRkIGNvbW1hbmQtbGluZSBhcmd1bWVudCAtaXNvbGF0ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKCSAgICBmaWxlIHRoYXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgU1dJRyBnZW5lcmF0ZWQgZmlsZXMgdGhhdAoJICAgIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgoKMDMvMjAvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIE1vcmUgdHdlYWtzIHRvIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCgkgICAgRml4IGNvbnN0YW50V3JhcHBlciBmb3IgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLgoKCSAgICBmaW5kLWRlZmluaXRpb24ga2V5YmluZGluZ3Mgc2hvdWxkIHdvcmsgaW4gRUxJL1NMSU1FLgoJICAgIE91dHB1dCAoaW4tcGFja2FnZSA8bW9kdWxlLW5hbWU+KSB0byBsaXNwIHdyYXBwZXIKCSAgICBpbnN0ZWFkIG9mIChpbi1wYWNrYWdlICMuKnN3aWctbW9kdWxlLW5hbWUqKS4KCgkgICAgc2xpZ2h0IHJld29yayBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgoKCSAgICBkb2MgdXBkYXRlcy4KCjAzLzE3LzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtYW5nbGUgbmFtZXMgb2YgY29uc3RhbnRzIGdlbmVyYXRlZCB2aWEgY29uc3RhbnRXcmFwcGVyLgoJICAgIAoJICAgIFdoZW4gdXNpbmcgT1VUUFVUIHR5cGVtYXBzIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgbm9uLXZvaWQKCSAgICByZXR1cm4gdmFsdWUsIGl0IHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgdmFsdWVzLWxpc3QsIGZvbGxvd2VkCgkgICAgYnkgdGhlIE9VVFBVVCBtYXBwZWQgdmFsdWVzLgoKCSAgICBGaXggYnVnIHdpdGggYm9vbGVhbiBwYXJhbWV0ZXJzLCB3aGljaCBuZWVkZWQgdG8gYmUKCSAgICBwYXNzZWQgaW4gYXMgaW50IHZhbHVlcywgcmF0aGVyIHRoYW4gVCBvciBOSUwuCgowMy8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgR2VuZXJhdGUgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyB3aGVuIGluIEMrKyBvciAtY3dyYXAgbW9kZS4KCSAgICBNYWtlIC1jd3JhcCB0aGUgZGVmYXVsdCwgc2luY2UgaXQgaXMgbW9zdCBjb3JyZWN0LiBVc2VycwoJICAgIGNhbiB1c2UgdGhlIC1ub2N3cmFwIG9wdGlvbiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSAuY3h4CgkgICAgZmlsZSB3aGVuIGludGVyZmFjaW5nIHRvIEMgY29kZS4KCgkgICAgV2hlbiBpbiAtbm9jd3JhcCBtb2RlLCBpbXByb3ZlIHRoZSBoYW5kbGluZyBvZiBjb252ZXJ0aW5nCiAJICAgIGluZml4IGxpdGVyYWxzIHRvIHByZWZpeCBub3RhdGlvbiBmb3IgbGlzcC4gVGhpcyBpcyB2ZXJ5CgkgICAgYmFzaWMgYW5kIG5vdCBsaWtlbHkgdG8gYmUgaW1wcm92ZWQgdXBvbiBzaW5jZSB0aGlzIG9ubHkKCSAgICBhcHBsaWVzIHRvIHRoZSAtbm9jd3JhcCBjYXNlLiBMaXRlcmFscyB3ZSBjYW4ndCBmaWd1cmUgb3V0CgkgICAgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGFuZCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgY29kZS4KCgkgICAgdmFsaWRJZGVudGlmaWVyIG5vdyBtb3JlIGNsb3NlbHkgYXBwcm94aW1hdGVzIHdoYXQgbWF5IGJlCgkgICAgYSBsZWdhbCBjb21tb24gbGlzcCBzeW1ib2wuCgoJICAgIEZpeCB0eXBlbWFwIGVycm9yIGluIGFsbGVncm9jbC5zd2cKCSAgICAKMDMvMTIvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCB1cCBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgkgICAgR2VuZXJhdGUgYysrIHN0eWxlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzdHJ1Y3QvdW5pb24gbWVtYmVycwoJICAgIHdoZW4gLWN3cmFwIG9wdGlvbiBzcGVjaWZpZWQuCgowMy8xMC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBDIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGxhc3QgYWxsZWdyb2NsCgkgICAgY29tbWl0LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIENvbW1pdCAjMTQ0NzMzNyAtIERlbGV0ZSBMb2NhbFJlZnMgYXQgdGhlIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIHRvIGZpeCBwb3RlbnRpYWwgbGVhawoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDQ0OTQ5IC0gY29uZmlndXJlIGRvZXMgbm90IGhvbm9yIC0tcHJvZ3JhbS1wcmVmaXguCiAgICAgICAgICAgIFJlbW92ZWQgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4LiBGaXggdGhlIGF1dG9jb25mIHN0YW5kYXJkCiAgICAgICAgICAgIG9wdGlvbnMgLS1wcm9ncmFtLXByZWZpeCBhbmQgLS1wcm9ncmFtLXN1ZmZpeCB3aGljaCB3ZXJlIGJlaW5nIHNob3duIGluIHRoZSBoZWxwLAogICAgICAgICAgICBidXQgd2VyZSBiZWluZyBpZ25vcmVkLiBVc2UgLS1wcm9ncmFtLXN1ZmZpeCBpbnN0ZWFkIG9mIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBub3cuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgRml4ICMxNDQ2MzE5IHdpdGggcGF0Y2ggZnJvbSBhbmRyZWFzdGggLSBtb3JlIHRoYW4gb25lIHdzdHJpbmcgcGFyYW1ldGVyIGluIGRpcmVjdG9yIG1ldGhvZHMKCjAzLzA3LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIAoJICAgIEZpeCBmb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgYSAiLSIgaW4gbm9uLSJzaGFkb3ciIG1vZGUuCgkgICAgUGF0Y2ggZnJvbSBBYXJvbiBWYW5EZXZlbmRlciAoIzE0NDE0NzQpLgoKMDMvMDQvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgLU8gdG8gdGhlIG1haW4gcHJvZ3JhbSwgd2hpY2ggbm93IGVuYWJsZXMgLWZhc3RkaXNwYXRjaAoJICAgIAoJICAgIFtQeXRob25dCgoJICAgIC0gQWRkIHRoZSAtZmFzdGluaXQgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgX19pbml0X18KICAgICAgICAgICAgICBtZXRob2RzLiBTZXR0aW5nICd0aGlzJyBhcyAnc2VsZi50aGlzLmFwcGVuZCh0aGlzKScgaW4gdGhlIHB5dGhvbgoJICAgICAgY29kZSBjb25mdXNlcyBQeUx1Y2VuZS4gTm93IHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQoJICAgICAgdGhlIEMrKyBzaWRlLCBhcyByZXBvcnRlZCBieSBBbmRpIGFuZCBSb2Jpbi4KCgkgICAgLSBBZGQgdGhlIC1mYXN0cXVlcnkgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgU1dJR19UeXBlUXVlcnkgdmlhIGEKICAgICAgICAgICAgICBweXRob24gZGljdCBjYWNoZSwgYXMgcHJvcG9zZWQgYnkgQW5kaSBWYWpkYQoKCSAgICAtIEF2b2lkIHRvIGNhbGwgUHlPYmplY3RfR2V0QXR0ciBpbnNpZGUgU1dJR19QeXRob25fR2V0U3dpZ1RoaXMsCgkgICAgICBzaW5jZSB0aGlzIGNvbmZ1c2VzIFB5THVjZW5lLCBhcyByZXBvcnRlZCBieSBBbmRpIFZhamRhLgoJICAgIAowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgUmVtb3ZlZCBleHRyYSAodm9pZCAqKSBjYXN0IHdoZW4gY2FzdGluZyBwb2ludGVycyB0byBhbmQgZnJvbSBqbG9uZyBhcyB0aGlzCiAgICAgICAgICAgIHdhcyBzdXBwcmVzc2luZyBnY2MncyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5nLiBUaGlzIHdhcm5pbmcgY291bGQgYmUgaWdub3JlZCBpbiB2ZXJzaW9ucyBvZiBnY2MgcHJpb3IgdG8gNC4wLCBidXQgbm93IHRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIHVzZWZ1bCBhcyBnY2MgLU8yIGFuZCBoaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBpbmNsdWRlcyAtZnN0cmljdC1hbGlhc2luZyB3aGljaAogICAgICAgICAgICBnZW5lcmF0ZXMgY29kZSB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlIGNhc3RzLiBUaGUgYXNzaWdubWVudCBpcyBzaW1wbHkgbmV2ZXIgbWFkZS4KICAgICAgICAgICAgUGxlYXNlIHVzZSAtZm5vLXN0cmljdC1hbGlhc2luZyB0byBib3RoIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCBmaXggdGhlIGJhZCBhc3NlbWJseQogICAgICAgICAgICBjb2RlIGdlbmVyYXRlZC4gTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IHRoZSBDIGNvbXBpbGVyLCBidXQgbm90CiAgICAgICAgICAgIHRoZSBDKysgY29tcGlsZXIsIHlldCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgYWxzbyBnZW5lcmF0ZSBicm9rZW4gY29kZS4gQWx0ZXJuYXRpdmVseSB1c2UgCiAgICAgICAgICAgIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIGZvciBnY2MtMy54LiBUaGUgdHlwZW1hcHMgYWZmZWN0ZWQKICAgICAgICAgICAgYXJlIHRoZSAiaW4iIGFuZCAib3V0IiB0eXBlbWFwcyBpbiBqYXZhLnN3ZyBhbmQgYXJyYXlzX2phdmEuc3dnLiBVc2VycyBvdWdodCB0byBmaXgKICAgICAgICAgICAgdGhlaXIgb3duIHR5cGVtYXBzIHRvIGRvIHRoZSBzYW1lLiBOb3RlIHRoYXQgcmVtb3ZhbCBvZiB0aGUgdm9pZCAqIGNhc3Qgc2ltcGx5IHByZXZlbnRzCiAgICAgICAgICAgIHN1cHByZXNzaW9uIG9mIHRoZSB3YXJuaW5nIGZvciB0aGUgQyBjb21waWxlciBhbmQgbm90aGluZyBlbHNlLiBUeXBpY2FsIGNoYW5nZToKCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkodm9pZCAqKSYkaW5wdXQ7ICV9CiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpJiRpbnB1dDsgJX0KCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSh2b2lkICopJiRyZXN1bHQgPSAkMTsgJX0gCiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkmJHJlc3VsdCA9ICQxOyAlfSAKCjAzLzAyLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0KCSAgICBBZGQgdHlwZW1hcHMgZm9yICJsb25nIGxvbmciOyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgaG93ZXZlciwgZGVwZW5kcwoJICAgIG9uIHRoZSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIEd1aWxlLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgaW5uZXIgZXhjZXB0aW9ucy4gSWYgYW55IG9mIHRoZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aGljaCBjb25zdHJ1Y3QKICAgICAgICAgICAgYSBwZW5kaW5nIGV4Y2VwdGlvbiBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZXhjZXB0aW9uLCBpdCB3aWxsIGNyZWF0ZSB0aGUgbmV3CiAgICAgICAgICAgIGV4Y2VwdGlvbiB3aXRoIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBhcyBhbiBpbm5lciBleGNlcHRpb24uCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBQaHA1IGV4Y2VwdGlvbnMgaWYgY29tcGlsaW5nIGFnYWluc3QgUGhwNSAocGF0Y2ggZnJvbSBPbGx5IEJldHRzKS4KCjAzLzAxLzIwMDY6IG1tYXR1cwoJICAgIFVzZSB0aGUgR0NDIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIFNXSUdFWFBPUlQuCgoJICAgIE5vdyB5b3UgY2FuIGNvbXBpbGUgKHdpdGggZ2NjIDMuNCBvciBsYXRlcikgdXNpbmcKCSAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iLgoJICAgIAoJICAgIENoZWNrIHRoZSBkaWZmZXJlbmNlIGZvciB0aGUgJ3N0ZF9jb250YWluZXJzLmknIHB5dGhvbiAKCSAgICB0ZXN0IGNhc2U6CiAKICAgICAgICAgICAgU2l6ZXM6CgoJICAgICAgMzMwNTQzMiBfc3RkX2NvbnRhaW5lcnMuc28KCSAgICAgIDIzODM5OTIgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBFeHBvcnRlZCBzeW1ib2xzIChubSAtRCA8ZmlsZT4uc28gfCB3YyAtbCk6CgogICAgICAgICAgICAgIDYxNDYgX3N0ZF9jb250YWluZXJzLnNvIAogICAgICAgICAgICAgIDE3NCAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbiAKCgkgICAgRXhlY3V0aW9uIHRpbWVzOgoKCSAgICAgIHJlYWwgMG0wLjA1MHMgdXNlciAwbTAuMDM5cyBzeXMgMG0wLjAwNXMgICBfc3RkX2NvbnRhaW5lcnMuc28KICAgICAgICAgICAgICByZWFsIDBtMC4wMzlzIHVzZXIgMG0wLjAyNnMgc3lzIDBtMC4wMDdzICAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBSZWFkIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIG1vcmUgZGV0YWlscy4KCgowMi8yNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIHN1cHBvcnQgZm9yIElOUFVULCBPVVRQVVQsIGFuZCBJTk9VVCB0eXBlbWFwcy4KCSAgICBGb3IgT1VUUFVUIHZhcmlhYmxlcywgdGhlIGxpc3Agd3JhcHBlciByZXR1cm5zIG11bHRpcGxlCgkgICAgdmFsdWVzLgoKMDIvMjYvMjAwNjogbW1hdHVzCgoJICAgIFtSdWJ5XSBhZGQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGZpbGUuCgkgICAgCgkgICAgVXNlIGl0IGFzIGZvbGxvdzoKCgkJJWluY2x1ZGUgYXJnY2FyZ3YuaQoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlYXBwbHkgKGludCBBUkdDLCBjaGFyICoqQVJHVikgeyAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB9IAoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlaW5saW5lIHsJCQkJCiAgIAkgICAgICAgICAgaW50IG1haW5BcHAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSAJCiAgIAkgICAgICAgICAgewkJCQkJCQogICAJICAgICAgICAgICAgcmV0dXJuIGFyZ2M7CQkJCQkKICAgCSAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CQkJCQkJCQoJICAgICAgCQkJCQkJCQogICAJICAgIHRoZW4gaW4gdGhlIHJ1Ynkgc2lkZToJCQkJCQoJICAgICAgCQkJCQkJCQkKICAgCSAgICAgICAgYXJncyA9IFsiYXNkZiIsICJhc2RmMiJdCQkJCQogICAJICAgICAgICBuID0gbWFpbkFwcChhcmdzKTsKCQoKCSAgICBUaGlzIGlzIHRoZSBzaW1pbGFyIHRvIHRoZSBweXRob24gdmVyc2lvbiBMaWIvcHl0aG9uL2FyZ2Nhcmd2LmkKCjAyLzI0LzIwMDY6IG1nb3NzYWdlCgoJICAgIFNtYWxsIHVwZGF0ZSBMdWEgZG9jdW1lbnRzIG9uIHRyb3VibGVzaG9vdGluZyBwcm9ibGVtcwoJICAgIAowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIEZpeCBhbGwgdGhlIGVycm9ycyByZXBvcnRlZCBmb3IgMS4zLjI4LgoJICAgIC0gZml4IGJ1ZyAjMTE1ODE3OAoJICAgIC0gZml4IGJ1ZyAjMTA2MDc4OQoJICAgIC0gZml4IGJ1ZyAjMTI2MzQ1NwoJICAgIC0gZml4ICdjb25zdCAgY2hhciomJyB0eXBlbWFwIGluIHRoZSBVVEwsIHJlcG9ydGVkIGJ5IEdlb2ZmIEh1dGNoaXNvbgoJICAgIC0gZml4ZXMgZm9yIHB5dGhvbiAyLjEgYW5kIHRoZSBydW50aW1lIGxpYnJhcnkKCSAgICAtIGZpeCBjb3B5Y3RvciArIHRlbXBsYXRlIGJ1ZyAjMTQzMjEyNQoJICAgIC0gZml4IFsgMTQzMjE1MiBdICVyZW5hbWUgZnJpZW5kIG9wZXJhdG9ycyBpbiBuYW1lc3BhY2UKCSAgICAtIGZpeCBnY2Mgd2FybmluZyByZXBvcnRlZCBieSBSLiBCZXJuc3RlaW4KCSAgICAtIGF2b2lkIGFzc2VydCB3aGVuIGZpbmRpbmcgYSByZWN1cnNpdmUgc2NvcGUgaW5oZXJpdGFuY2UsCgkgICAgICBlbWl0IGEgd2FybmluZyBpbiB0aGUgd29yc3QgY2FzZSwgcmVwb3J0ZWQgYnkgTml0cm8gCgkgICAgLSBmaXggcHJlbWF0dXJlIG9iamVjdCBkZWxldGlvbiByZXBvcnRlZCBieSBQYXVsIGluIHRjbDNkCgkgICAgLSBmaXggd2FybmluZyByZXBvcnRlZCBieSBOaXRybyBpbiBWQzcKCSAgICAtIG1vcmUgZml4ZXMgZm9yIG9sZCBTb2xhcmlzIGNvbXBpbGVyCgkgICAgLSBmaXggZm9yIHB5dGhvbiAyLjMgYW5kIGdjX3JlZnMgaXNzdWUgcmVwb3J0ZWQgYnkgTHVpZ2kKCSAgICAtIGZpeCBmYXN0cHJveHkgZm9yIG1ldGhvZHMgdXNpbmcga3dhcmdzCgkgICAgLSBmaXggb3ZlcmxvYWQgKyBwcm90ZWN0ZWQgbWVtYmVyIGlzc3VlIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggc2V0ZXJyb3Jtc2cgYXMgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBkaXJlY3RvcnMsIG5vdyB0aGUgdGVzdC1zdWl0ZSBydW5zIGFnYWluIHVzaW5nIC1kaXJlY3RvcnMKCSAgICAtIGZpeCBmb3IgZnJpZW5kIG9wZXJhdG9yIGFuZCBWaXN1YWwgc3R1ZGlvIGFuZCBidWcgMTQzMjE1MgoJICAgIC0gZml4IGJ1ZyAjMTQzNTA5MAoJICAgIC0gZml4IHVzaW5nICsgJWV4dGVuZCBhcyByZXBvcnRlZCBieSBXaWxsaWFtCgkgICAgLSBmaXggYnVnICMxMDk0OTY0CgkgICAgLSBmaXggZm9yIFB5X05vdEltcGxlbWVudGVkIGFzIHJlcG9ydGVkIGJ5IE9sbHkgYW5kIEFtYXVyeQoJICAgIC0gZml4IG5lc3RlZCBuYW1lc3BhY2UgaXNzdWUgcmVwb3J0ZWQgYnkgQ2hhcmxpZQoKCSAgICBhbmQgYWxzbzoKCSAgICAKCSAgICAtIGFsbG93IGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzIGJ5IGRlZmF1bHQKCSAgICAtIGRlbGV0ZSBleHRyYSBuZXcgbGluZXMgaW4gc3dpZ21hY3Jvc1tVVExdCgkgICAgLSBjb3NtZXRpYyBmb3IgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCgkgICAgLSBhZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBVVEwKCSAgICAtIGFkZCBzd2lncmVnaXN0ZXIgcHJveHkgbWV0aG9kIGFuZCBtb3ZlIF9fcmVwcl9fIHRvIGEKCSAgICAgIHNpbmdsZSBnbG9iYWwgbW9kdWxlICBbcHl0aG9uXQoKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBXaGVuIHVzaW5nIGRpcmVjdG9ycywgbm93IHN3aWcgd2lsbCBlbWl0IGFsbCB0aGUgdmlydHVhbAoJICAgIHByb3RlY3RlZCBtZXRob2RzIGJ5IGRlZmF1bHQuIAoKCSAgICBJbiBwcmV2aW91cyByZWxlYXNlcywgeW91IG5lZWRlZCB0byB1c2UgdGhlICdkaXJwcm90JwoJICAgIG9wdGlvbiB0byBhY2hpZXZlIHRoZSBzYW1lLgoKCSAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBuZXcgZGVmYXVsdCBiZWhhdmlvdXIsCgkgICAgdXNlIHRoZSAnbm9kaXJwcm90JyBvcHRpb246IAoKCSAgICAgICBzd2lnIC1ub2RpcnByb3QgLi4uCgoJICAgIGFuZC9vciB0aGUgJW5vZGlyZWN0b3IgZmVhdHVyZSBmb3Igc3BlY2lmaWMgbWV0aG9kcywgaS5lLjoKCgkgICAgICAgJW5vZGlyZWN0b3IgRm9vOjpiYXI7CgoJICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgICAgdmlydHVhbCB+Rm9vKCk7CgoJICAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIoKTsKCSAgICAgICB9OwoJICAgIAoKCSAgICBBcyBiZWZvcmUsIHB1cmUgYWJzdHJhY3QgcHJvdGVjdGVkIG1lbWJlcnMgYXJlIGFsbHdheXMKCSAgICBlbWl0dGVkLCBpbmRlcGVuZGVudCBvZiB0aGUgJ2RpcnByb3Qvbm9kaXJwcm90JyBvcHRpb25zLgoKCjAyLzIyLzIwMDY6IG1tYXR1cwoJICAgIEFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIGxhbmd1YWdlcyB1c2luZyB0aGUgVVRMIChweXRob24sdGNsLHJ1YnkscGVybCkuCgkgICAgCiAgICAgICAgICAgIGZhY3RvcnkuaSBpbXBsZW1lbnRzIGEgbW9yZSBuYXR1cmFsIHdyYXAgZm9yIGZhY3RvcnkgbWV0aG9kcy4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZToJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgR2VvbWV0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZW51bSBHZW9tVHlwZXsJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgICAgIFBPSU5ULAkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgICAgQ0lSQ0xFCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgfkdlb21ldHJ5KCkge30gICAgCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgaW50IGRyYXcoKSA9IDA7CQkJCSAgICAKICAJICAgIAkgCQkJCQkJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgCSAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgICBzdGF0aWMgR2VvbWV0cnkgKmNyZWF0ZShHZW9tVHlwZSBpKTsgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IFBvaW50IDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAxOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSB3aWR0aCgpIHsgcmV0dXJuIDEuMDsgfSAgICAJICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBDaXJjbGUgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDI7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHJhZGl1cygpIHsgcmV0dXJuIDEuNTsgfSAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgfTsgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUoR2VvbVR5cGUgdHlwZSkgewkJICAgIAogIAkgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBQT0lOVDogcmV0dXJuIG5ldyBQb2ludCgpOwkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgQ0lSQ0xFOiByZXR1cm4gbmV3IENpcmNsZSgpOyAJICAgICAJCSAgICAKICAJICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH0JCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH0JCQkJCSAgICAJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICBZb3UgY2FuIHVzZSB0aGUgJWZhY3Rvcnkgd2l0aCB0aGUgR2VvbWV0cnk6OmNyZWF0ZSBtZXRob2QgYXMgZm9sbG93czoKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgJW5ld29iamVjdCBHZW9tZXRyeTo6Y3JlYXRlOwkJCQkgICAgCiAgCSAgICAgICVmYWN0b3J5KEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlLCBQb2ludCwgQ2lyY2xlKTsJICAgIAogIAkgICAgICAlaW5jbHVkZSAiZ2VvbWV0cnkuaCIJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIGFuZCBHZW9tZXRyeTo6Y3JlYXRlIHdpbGwgcmV0dXJuIGEgJ1BvaW50JyBvciAnQ2lyY2xlJyBpbnN0YW5jZSAgIAogIAkgICAgaW5zdGVhZCBvZiB0aGUgcGxhaW4gJ0dlb21ldHJ5JyB0eXBlLiBGb3IgZXhhbXBsZSwgaW4gcHl0aG9uOgkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgIGNpcmNsZSA9IEdlb21ldHJ5LmNyZWF0ZShHZW9tZXRyeS5DSVJDTEUpCQkJICAgIAogIAkgICAgICByID0gY2lyY2xlLnJhZGl1cygpCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgd2hlcmUgJ2NpcmNsZScgbm93IGlzIGEgQ2lyY2xlIHByb3h5IGluc3RhbmNlLgkgICAgCQkgICAgCgoKMDIvMTcvMjAwNjogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIGludGVncmFsCgkgICAgdmFsdWVzLCBhbmQgdGhleSBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCSAgICBbR3VpbGVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZQoJICAgIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgowMi8xMy8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbRG9jdW1lbnRzXSB1cGRhdGVkIHRoZSBleHRlbmRpbmcgZG9jdW1lbnRzIHRvIGdpdmUgYSBza2VsZXRvbiBzd2lnZ2luZyBjb2RlCiAgICAgICAgICAgIHdpdGggYSBmZXcgdHlwZW1hcHMuCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIGFuIGV4dHJhIHR5cGVtYXAgZm9yIHZvaWQqIFtpbl0sIHNvIGEgZnVuY3Rpb24gd2hpY2ggcmVxdWlyZXMgYSB2b2lkKgogICAgICAgICAgICBjYW4gdGFrZSBhbnkga2luZCBvZiBwb2ludGVyCgpWZXJzaW9uIDEuMy4yOCAoRmVicnVhcnkgMTIsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIEZpeCBtYW55IGlzc3VlcyB3aXRoIGxpbmUgY291bnRpbmcgYW5kIGVycm9yIHJlcG9ydHMuCgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBCZXR0ZXIgc3RhdGljIGRhdGEgbWVtYmVyIHN1cHBvcnQsIGlmIHlvdSBoYXZlCgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiBub3cgaXMgdmFsaWQgdG8gYWNjZXNzIHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIsIGllOgoKICAgICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgICAgZi5iYXIgPSAzCgoJICAgIGp1c3QgYXMgaW4gQysrLgoKCjAyLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gdG8gd29yayBhZ2FpbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBQZXJsCiAgICAgICAgICAgICg1LjAwNCBhbmQgbGF0ZXIgdGVzdGVkKQoKMDIvMDQvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoKSBkaXJlY3RpdmUgdG8gZXh0ZW5kCgkgICAgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgaW4gcHl0aG9uLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc21hcnQgcG9pbnRlciBhczoKCSAgICAKCSAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBSQ1B0ciB7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIC4uLgoJICAgICAgICBSQ1B0cihUeXBlICpwKTsKCQlUeXBlICogb3BlcmF0b3ItPigpIGNvbnN0OwoJCS4uLgoJICAgICAgfTsKCSAgICAgIAoJICAgIHlvdSB1c2UgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlciBkaXJlY3RpdmUgYXM6CgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpICBSQ1B0cjxBPjsKCSAgICAKCSAgICB0aGVuLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICBSQ1B0cjxBPiBtYWtlX3B0cigpOwoJICAgICAgaW50IGZvbyhBICopOwoKCSAgICB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CgoJICAgICAgYSA9IG1ha2VfcHRyKCk7CgkgICAgICBiID0gZm9vKGEpOwoKICAgICAgICAgICAgaWUsIHN3aWcgd2lsbCBhY2NlcHQgYSBSQ1B0cjxBPiBvYmplY3Qgd2hlcmUgYSAnQSAqJyBpcwogICAgICAgICAgICBleHBlY3RlZC4KCgkgICAgQWxzbywgd2hlbiB1c2luZyB2ZWN0b3JzCgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpIFJDUHRyPEE+OwoJICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9BKSBzdGQ6OnZlY3RvcjxSQ1B0cjxBPiA+OwoJCQoJICAgIHlvdSBjYW4gdHlwZQoKCSAgICAgIGEgPSBBKCk7CgkgICAgICB2ID0gdmVjdG9yX0EoMikKCSAgICAgIHZbMF0gPSBhCgogICAgICAgICAgICBpZSwgYW4gJ0EgKicgb2JqZWN0IGlzIGFjY2VwdGVkLCB2aWEgaW1wbGljaXQgY29udmVyc2lvbiwgCgkgICAgd2hlcmUgYSBSQ1B0cjxBPiBvYmplY3QgaXMgZXhwZWN0ZWQuIEFkZGl0aW9uYWxseQoKCSAgICAgIHggPSB2WzBdCgoJICAgIHJldHVybnMgKGFuZCBzZXRzICd4JyBhcykgYSBjb3B5IG9mIHZbMF0sIG1ha2luZyByZWZlcmVuY2UKCSAgICBjb3VudGluZyBwb3NzaWJsZSBhbmQgY29uc2lzdGVudC4KCgkgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyIGlzIGp1c3QgYSBjb2xsZWN0aW9ucyBvZiBuZXcvb2xkCgkgICAgdHJpY2tzLCBpbmNsdWRpbmcgJXR5cGVtYXBzIGFuZCB0aGUgbmV3ICVpbXBsaWNpdGNvbnYKCSAgICBkaXJlY3RpdmUuCgowMi8wMi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBidWdmaXggIzEzNTY1NzcsIGNoYW5nZWQgZG91YmxlPT5sdWFfbnVtYmVyIGluIGEgZmV3IHBsYWNlcy4KICAgICAgICAgICAgYWRkZWQgdGhlIHN0ZDo6cGFpciB3cmFwcGluZwoKMDEvMzAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgYW5kIHN0ZDo6d3N0cmluZyBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIG5vdyB1c2UKICAgICAgICAgICAgJW5hdHVyYWx2YXIgYnkgZGVmYXVsdCwgbWVhbmluZyB0aGV5IHdpbGwgbm93IGJlIHdyYXBwZWQgYXMgZXhwZWN0ZWQgaW4gYWxsIGxhbmd1YWdlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGVzZSB3ZXJlIHdyYXBwZWQgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgdGFyZ2V0IGxhbmd1YWdlIHN0cmluZy4KICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBhZGQgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kIHRvIHdyYXAgdGhlc2UgYXMgc3RyaW5nczoKCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMDEvMjgvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSAKCSAgICBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCjAxLzI0LzIwMDY6IG1tYXR1cwoJICAgIC0gQmV0dGVyIHN1cHBvcnQgZm9yIHRoZSAlbmF0dXJhbHZhciBkaXJlY3RpdmUsIG5vdyBpdAoJICAgICAgd29ya3Mgd2l0aCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcyB3ZWxsIGFzCgkgICAgICBKYXZhL0MjLgoJICAgICAgCgkgICAgICBOb3csIGl0IGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2xhc3MgdHlwZXM6CgoJICAgICAgICAlbmF0dXJhbHZhciBzdGQ6OnN0cmluZzsKCSAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KCSAgICAgIAogICAgICAgICAgICAgIHRoYXQgd2lsbCB0ZWxsIHN3aWcgdG8gdXNlIHRoZSAnbmF0dXJhbCcgd3JhcHBpbmcKICAgICAgICAgICAgICBtZWNoYW5pc20gdG8gYWxsIHN0ZDo6c3RyaW5nIGdsb2JhbCBhbmQgbWVtYmVyCiAgICAgICAgICAgICAgdmFyaWFibGVzLgoKCSAgICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgJWFsbG93ZXhjZXB0IGZlYXR1cmUgYWxvbmcgdGhlCiAgICAgICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2hpY2ggYWxsb3dzIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSB2YXJpYWJsZSBhY2Nlc3MgbWV0aG9kcy4gQWxzbywgYWRkCiAgICAgICAgICAgICAgdGhlICVleGNlcHRpb252YXIgZGlyZWN0aXZlIHRvIHNwZWNpZnkgYSBkaXN0aW50aWMKICAgICAgICAgICAgICBleGNlcHRpb24gbWVjaGFuaXNtIG9ubHkgZm9yIHZhcmlhYmxlcy4KCSAgICAgIAoJICAgIAoJICAgIC0gQWRkIG1vcmUgZG9jcyBmb3IgdGhlICVkZWxvYmplY3QgZGlyZWN0aXZlIHRvIG1hcmsgYSBtZXRob2QgYXMgYQoJICAgICAgZGVzdHJ1Y3RvciwgJ2Rpc293bmluZycgdGhlIGZpcnN0IGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCgkgICAgICAgICVuZXdvYmplY3QgY3JlYXRlX2ZvbzsKCSAgICAgICAgJWRlbG9iamVjdCBkZXN0cm95X2ZvbzsKCgkgICAgICAgIEZvbyAqY3JlYXRlX2ZvbygpIHsgcmV0dXJuIG5ldyBGb28oKTsgfQoJICAgICAgICB2b2lkIGRlc3Ryb3lfZm9vKEZvbyAqZm9vKSB7IGRlbGV0ZSBmb287IH0KCgkgICAgICBvciBpbiBhIG1lbWJlciBtZXRob2QgYXM6CgoJICAgICAgICAlZGVsb2JqZWN0IEZvbzo6ZGVzdHJveTsKCgkgICAgICAgIGNsYXNzIEZvbyB7CgkgICAgICAgIHB1YmxpYzoKCSAgICAgICAgICB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzO30KCgkgICAgICAgIHByaXZhdGU6CgkgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICB9OwoKCjAxLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgLSBSZW1vdmVkIHRoZSB0eXBlIHN3aWdfbHVhX2NvbW1hbmRfaW5mbyAmIHJlcGxhY2Ugd2l0aCBsdWFMX3JlZwoJICAgICAgKHdoaWNoIHRoZW4gYnJva2UgdGhlIGNvZGUpLCBmaXhlZCB0aGlzCgkgICAgLSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNhc3QgaW4gdGhlIHR5cGVtYXBzIGZvciBlbnVtJ3MKCSAgICAgIGR1ZSB0byB0aGUgaXNzdWUgdGhhdCBWQy5OZXQgd2lsbCBub3QgYWxsb3cgY2FzdGluZyBvZgoJICAgICAgYSBkb3VibGUgdG8gYW4gZW51bSBkaXJlY3RseS4gVGhlcmVmb3JlIGNhc3QgdG8gaW50IHRoZW4gdG8gZW51bQoJICAgICAgKHRoYW5rcyB0byBKYXNvbiBSZWdvIGZvciB0aGlzIG9ic2VydmF0aW9uKQoKMDEvMTYvMjAwNjogbW1hdHVzIChDaGFuZ2UgZGlzYWJsZWQuLi4gd2lsbCBiZSBiYWNrIGluIENWUyBzb29uKQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHJlZ2V4cCB2aWEgdGhlIGV4dGVybmFsIGxpYnJhcnkKCSAgICBSeFNwZW5jZXIuIFNXSUcgZG9lc24ndCByZXF1aXJlIHRoaXMgbGlicmFyeSB0byBjb21waWxlCgkgICAgYW5kL29yIHJ1bi4gQnV0IGlmIHlvdSBzcGVjaWZ5IC0td2l0aC1yeHNwZW5jZXIsIGFuZCB0aGUKCSAgICBsaWJyYXJ5IGlzIGZvdW5kIGR1cmluZyBpbnN0YWxsYXRpb24sIHRoZW4gc3dpZyB3aWxsIHVzZQoJICAgIGl0IGluIHRocmVlIHBsYWNlczoKCgkgICAgLSBJbiAlcmVuYW1lcyBydWxlcywgdmlhIHRoZSBuZXcgcnhzbWF0Y2ggcnVsZXMsIGZvciBleGFtcGxlOgoJICAgIAkgIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbmFtZT0iR1NMXy4qIikgIiI7CgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRub2RlVHlwZT0iZW51bSBHU0xfLioiKSAiIjsKCSAgICAJIAogICAgICAgICAgICAgIHJ4c21hdGNoIGlzIHNpbWlsYXIgdG8gdGhlIG1hdGNoIHJ1bGUsIGl0IGp1c3QgdXNlcwogICAgICAgICAgICAgIHRoZSBSeFNwZW5jZXIgcmVnZXhwIGxpYnJhcnkgdG8gZGVjaWRlIGlmIHRoZXJlIGlzIGEKICAgICAgICAgICAgICBtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCByZWdleHAuIEFzIHdpdGggdGhlIG1hdGNoCiAgICAgICAgICAgICAgcnVsZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgbmVnYXRlIHJ1bGUgbm90cnhzbWF0Y2guCgoJICAgIC0gSW4gdGhlICVyZW5hbWUgdGFyZ2V0IG5hbWUgdmlhIHRoZSByeHN0YXJnZXQgb3B0aW9uLCBmb3IgZXhhbXBsZToKCSAgICAJCSAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c3RhcmdldD0xKSAiR1NMXy4qIjsKCgkgICAgCXdoZXJlIHRoZSB0YXJnZXQgbmFtZSAiR1NMLioiIGlzIG5vdyB1bmRlcnN0b29kIGFzIGEKCSAgICAJcmVnZXhwIHRvIGJlIG1hdGNoZWQuICAKCSAgICAJIAogICAgICAgICAgICAtIEluIHRoZSBuZXcgZW5jb2RlciAicnhzcGVuY2VyIiwgd2hpY2ggbG9va3MgbGlrZToKCgkgICAgCSAgJShyeHNwZW5jZXI6W3JlZ2V4cF1bcmVwbGFjZV0pcwoKCSAgICAJd2hlcmUgInJlZ2V4cCIgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgInJlcGxhY2UiCgkgICAgCWlzIGEgc3RyaW5nIHVzZWQgYXMgYSByZXBsYWNlbWVudCwgd2hlcmUgdGhlIEAwLEAxLC4uLixAOQoJICAgIAlwc2V1ZG8gYXJndW1lbnRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKCSAgICAJY29ycmVzcG9uZGluZyBtYXRjaGluZyBpdGVtcyBpbiB0aGUgcmVnIGV4cHJlc3Npb24uCgoJICAgIAlGb3IgZXhhbXBsZToKCSAgICAJCSAgICAgIAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEhlbGxvICAgIC0+IAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEdTTEhlbGxvIC0+IEdTTEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtAMV0pcyAgICAgPC0gR1NMSGVsbG8gLT4gSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW2dzbEAxXSlzICA8LSBHU0xIZWxsbyAtPiBnc2xIZWxsbwoKCSAgICAJQW5vdGhlciBleGFtcGxlIGNvdWxkIGJlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiUobG93ZXJjYXNlKXMiLHNvdXJjZWZtdD0iJShyeHNwZW5jZXI6W0dTTF8oLiopXVtAMV0pcyIsJSRpc2Z1bmN0aW9uKSAiIjsKCgkgICAgCXdoaWNoIHRha2Ugb3V0IHRoZSBwcmVmaXggIkdTTF8iIGFuZCByZXR1cm5zIGFsbCB0aGUKCSAgICAJZnVuY3Rpb24gbmFtZXMgaW4gbG93ZXIgY2FzZXMsIGFzIGZvbGxvd2luZzoKCgkgICAgCSAgICB2b2lkIEdTTF9IZWxsbygpOyAgIC0+ICAgaGVsbG8oKTsKCSAgICAJICAgIHZvaWQgR1NMX0hpKCk7ICAgICAgLT4gICBoaSgpOwoJICAgIAkgICAgY29uc3QgaW50IEdTTF9NQVg7ICAtPiAgIEdTTF9NQVg7ICAvLyBubyBjaGFuZ2UsIGlzIG5vdCBhIGZ1bmN0aW9uCgkKCSAgICBXZSB1c2UgdGhlIFJ4U3BlbmNlciBhcyBhbiBpbml0aWFsIHRlc3QgYmVkIHRvCiAgICAgICAgICAgIGltcGxlbWVudGlvbiB3aGlsZSB3ZSBkZWNpZGUgd2hpY2ggbGlicmFyeSB3aWxsIGJlCiAgICAgICAgICAgIGZpbmFsbHkgYWRkZWQgdG8gc3dpZy4KCiAgICAgICAgICAgIFlvdSBjYW4gb2J0YWluIHRoZSBSeFNwZW5jZXIgbGlicmFyeSBmcm9tIAoJICAgIAoJICAgICAgaHR0cDovL2FyZ2xpc3QuY29tL3JlZ2V4IChVbml4KQoKCSAgICBvcgoJICAgICAKCSAgICAgIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMuaHRtbCAoV2luZG93cykKCgkgICAgT25jZSBpbnN0YWxsZWQsIHVzZSAibWFuIHJ4c3BlbmNlciIgdG8gZ2V0IG1vcmUgaW5mbwoJICAgIGFib3V0IHRoZSByZWdleHAgZm9ybWF0LCBvciBqdXN0IGdvb2dsZSByeHNwZW5jZXIuCgoJICAgIFNpbmNlIG5vdyB5b3UgY2FuIGVuYWJsZSB0aGUgcnhzbWF0Y2ggcnVsZXMgKHNlZSBhYm92ZSksCiAgICAgICAgICAgIHRoZSBzaW1wbGUgb3IgJ3wnIHN1cHBvcnQgZm9yIHRoZSBtYXRjaCBydWxlcwogICAgICAgICAgICAoMDEvMTIvMjAwNjogbW1hdHVzKSBpcyBkaXNhYmxlZC4gU3RpbGwsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggdGhlIHJ4c3BlbmNlciBsaWJyYXJ5LCB5b3UgY2FuIHJlLWVuYWJsZQogICAgICAgICAgICB0aGUgc2ltcGxlICdtYXRjaCBvcicgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAtRFNXSUdfVVNFX1NJTVBMRV9NQVRDSE9SLgoJICAKCjAxLzE2LzIwMDY6IG1tYXR1cwoJICAgIENoYW5nZSB0aGUgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIHVzZSB0aGUgcHJlZml4ICclJCcsIGFzIGluOgoJICAgIAoJICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJSRpc2Z1bmN0aW9uLCUkaXNtZW1iZXIpICIiOyAKCSAgIAkKICAgICAgICAgICAgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG90aGVyIHN3aWcgbWFjcm9zL2RpcmVjdGl2ZXMuCgowMS8xNC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgUnVieSBiYW5nISBtZXRob2RzIHZpYSBhIG5ldyAlYmFuZyBmZWF0dXJlLgoJICAgIEJhbmcgbWV0aG9kcyBlbmQgaW4gZXhjbGFtYXRpb24gcG9pbnRzIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZQoJICAgIG9iamVjdCBiZWluZyBwcm9jZXNzZWQgd2lsbCBiZSBtb2RpZmllZCBpbi1wbGFjZSBhcyAKCSAgICBvcHBvc2VkIHRvIGJlaW5nIGNvcGllZC4KCjAxLzEyLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBVcGRhdGVkIHRoZSBSdWJ5IG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKCSAgICBtZXRob2QgbmFtZXMgdG8gbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzIHVzaW5nIHRoZQoJICAgIG5ldyAlcmVuYW1lIGZ1bmN0aW9uYWxpdHkuCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBhbGlhc2VzIGZvciAnY2FzZScgZW5jb2RlcnMgdXNlZCB3aXRoICVyZW5hbWUvJW5hbWV3YXJuCgoJICAgICAgJSh1cHBlcmNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhFTExPX1dPUkxECgkgICAgICAlKGxvd2VyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG93b3JsZAoJICAgICAgJShjYW1lbGNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhlbGxvV29ybGQKCSAgICAgICUodW5kZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb193b3JsZAoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAtZHVtcF9wYXJzZV9tb2R1bGUgYW5kIC1kdW1wX3BhcnNlX3RvcCBvcHRpb25zLAoJICAgIHdoaWNoIGFyZSBzaW1pbGFyIHRvIC1kdW1wX21vZHVsZSBhbmQgLWR1bXBfdG9wLCBidXQgdGhleQoJICAgIGR1bXAgdGhlIG5vZGUgdHJlZXMganVzdCBhZnRlciBwYXJzaW5nLCBzaG93aW5nIG9ubHkgdGhlIAoJICAgIGF0dHJpYnV0ZXMgdmlzaWJsZSBhdCB0aGUgcGFyc2luZyBzdGFnZSwgYW5kIG5vdCB0aGUgYWRkZWQKCSAgICBsYXRlciBpbiB0eXBlbWFwLmN4eCwgYWxsb2NhdGUuY3h4LCBsYW5nLmN4eCBvciBlbHNld2hlcmUuCgkgICAgCgkgICAgQmVzaWRlcyBkZWJ1Z2dpbmcgcG9ycHVzZXMsIHRoZXNlIG9wdGlvbnMgYXJlIHZlcnkgdXNlZnVsCgkgICAgaWYgeW91IHBsYW4gdG8gdXNlICVyZW5hbWUgaW4gYW4gImFkdmFuY2Ugd2F5Iiwgc2luY2UgaXQKCSAgICBzaG93cyBvbmx5IGFuZCBhbGwgdGhlIG5vZGUncyBhdHRyaWJ1dGVzIHlvdSBjYW4gdXNlCgkgICAgaW5zaWRlIHRoZSBtYXRjaCBydWxlcy4KCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBwcmVkaWNhdGVzIHRvICVyZW5hbWUsIHNvLCB5b3UgZG9uJ3QgbmVlZCB0bwoJICAgICAgcmVtZW1iZXIsIGZvciBleGFtcGxlLCBob3cgdG8gbWF0Y2ggYSBtZW1iZXIgZnVuY3Rpb24uCgoJICAgICAgTm93IGl0IGlzIGVhc3ksIGZvciBleGFtcGxlIHRvIHVzZSB0aGUgJ3V0aXRsZScgZW5jb2RlciAKCSAgICAgIGluIGFsbCB0aGUgbWVtYmVyIG1ldGhvZHMsIHlvdSB0eXBlOgoKCSAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJWlzZnVuY3Rpb24sJWlzbWVtYmVyKSAiIjsKCgkgICAgICBvciB0byBpZ25vcmUgYWxsIHRoZSBlbnVtaXRlbXMgaW4gYSBnaXZlbiBjbGFzczoKCgkgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCAlaXNlbnVtaXRlbSwgJWNsYXNzbmFtZT0iTXlDbGFzcyIpICIiOyAgCgoJICAgICAgQXZhaWxhYmxlIHByZWRpY2F0ZXMgYXJlIChzZWUgc3dpZy5zd2cpOgoKICAgICAgICAgICAgICAgICVpc2VudW0gICAgICAgICAKCQklaXNlbnVtaXRlbSAgICAgCgkJJWlzYWNjZXNzICAgICAgIAoJCSVpc2NsYXNzICAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2NvbnN0cnVjdG9yICAKCQklaXNkZXN0cnVjdG9yICAgCgkJJWlzbmFtZXNwYWNlICAgIAoJCSVpc3RlbXBsYXRlICAgICAKCQklaXNjb25zdGFudCAgICAgCgkJCQkJCgkJJWlzdW5pb24gICAgICAgIAoJCSVpc2Z1bmN0aW9uICAgICAKCQklaXN2YXJpYWJsZSAgICAgCgkJJWlzaW1tdXRhYmxlICAgIAoJCQkJCQoJCSVpc3N0YXRpYyAgICAgICAKCQklaXNmcmllbmQgICAgICAgCgkJJWlzdHlwZWRlZiAgICAgIAoJCSVpc3ZpcnR1YWwgICAgICAKCQklaXNleHBsaWNpdCAgICAgCgkJJWlzZXh0ZXJuICAgICAgIAoJCQkJCQoJCSVpc21lbWJlciAgICAgICAKCQklaXNnbG9iYWwgCgkJJWlubmFtZXNwYWNlCgoJCSVpc3B1YmxpYyAgICAKCQklaXNwcm90ZWN0ZWQgCgkJJWlzcHJpdmF0ZSAgIAoJCQkJICAgICAKCQklY2xhc3NuYW1lICAgCgogICAgICAgICAgICAgIFRoZXNlIHByZWRpY2F0ZXMgY29ycmVzcG9uZCB0byBzcGVjaWZpYyAnbWF0Y2gnCiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLCB3aGljaCBzb21ldGltZXMgYXJlIG5vdCBhcyBldmlkZW50IGFzIHRoZQogICAgICAgICAgICAgIHByZWRpY2F0ZXMgbmFtZXMuCgoKICAgICAgICAgICAgLSBBZGQgdGhlIG9yICd8JyBvcGVyYXRpb24gaW4gJXJlbmFtZSBtYXRjaCwgZm9yCiAgICAgICAgICAgICAgZXhhbXBsZSB0byBjYXBpdGFsaXplIGFsbCB0aGUgY29uc3RhbnRzICglY29uc3RhbnQgb3IKICAgICAgICAgICAgICBjb25zdCBjZGVjbCk6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIsbWF0Y2g9ImNkZWNsfGNvbnN0YW50IiwlaXNpbW11dGFibGUpICIiOwogICAgICAgICAgICAgICAgCgoKMDEvMTIvMjAwNjogbWdvc3NhZ2UKCSAgICAtCVBhcnRpYWwgZml4ZWQgb2YgZXJyb3JzIHVuZGVyIEM4OSwgYnVnICMxMzU2NTc0CgkgICAgCShjb252ZXJ0ZWQgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUpCgkgICAgLQlBZGRlZCBwYXRjaGVzIGZyb20gbmVvbWFudHJhQHVzZXJzLnNmLm5ldCAjMTM3OTk4OCBhbmQgIzEzODgzNDMKCSAgICAJbWlzc2luZyBhICdyZXR1cm4nIHN0YXRlbWVudCBmb3IgZXJyb3IgY29uZGl0aW9ucwoJICAgIAlhbHNvIHVwZGF0ZWQgdGhlICVpbml0IGJsb2NrIGJ1ZyAjMTM1NjU4NgoJCSAKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlICd1dGl0bGUnIGVuY29kZXIsIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZAoJICAgICAgeW91ciBvd24gZW5jb2Rlci4gSSBhZGRlZCB0aGUgZW5jb2RlciBtZXRob2QgaW4gbWlzYy5jIAoJICAgICAgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBvdGhlcnMsIHRoZSBzYW1lIHdheSwgaW5zaWRlIGFueQoJICAgICAgdGFyZ2V0IGxhbmd1YWdlLgoJICAgICAgCgkgICAgICBXZWxsLCAndXRpdGxlJyBpcyB0aGUgcmV2ZXJzZSBvZiAnY3RpdGxlJywgaWU6CgoJICAgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7ICAtPiBDYW1lbENhc2U7CgkgICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIikgQ2FtZWxDYXNlOyAgIC0+IGNhbWVsX2Nhc2U7CgkJIAoKMDEvMTAvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQogICAgICAgICAgICBVcGRhdGVkIFJ1YnkgRXhjZXB0aW9uIGhhbmRsaW5nLiAgQ2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhyb3dzIGNsYXVzZXMsIAogICAgICAgICAgICBvciBhcmUgbWFya2VkIGFzICVleGNlcHRpb25jbGFzcywgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSByYl9lUnVudGltZUVycm9yLiAKICAgICAgICAgICAgVGhpcyBhbGxvd3MgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgdG8gYmUgcmV0dXJuZWQgdG8gUnVieSBhcyBleGNlcHRpb25zLiAKICAgICAgICAgICAgVGh1cyBpZiBhIEMrKyBtZXRob2QgdGhyb3dzIGFuIGluc3RhbmNlIG9mIE15RXhjZXB0aW9uLCB0aGUgY2FsbGluZyBSdWJ5IAogICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQgYmFjayBhIE15RXhjZXB0aW9uIG9iamVjdC4gIFRvIHNlZSBhbiBleGFtcGxlLCAKICAgICAgICAgICAgbG9vayBhdCBydWJ5L2V4YW1wbGVzL2V4Y2VwdGlvbl9jbGFzcy4KCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIAogICAgICAgICAgICAtIEFkZCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlLCB3aGljaCBjb21wbGVtZW50cyB0aGUgJWV4Y2VwdGlvbgoJICAgIGRpcmVjdGl2ZSBpbiBhIG1vcmUgYXV0b21hdGljIHdheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEUxKTsKCiAgICAgICAgICAgIHN3aWcgZ2VuZXJhdGVzIHRoZSBwcm9wZXIgdHJ5L2NhdGNoIGNvZGUgdG8gZGlzcGF0Y2ggRTEuCgkgICAgCgkgICAgQnV0IGlmIHlvdSBoYXZlOgoKCgkgICAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKCSAgICAgICAgICAgICAgIHRocm93IEUxKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgdGhyb3cgRTIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGllLCB3aGVyZSB0aGVyZSBpcyBubyBleHBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiB0aGUgZGVjbCwgeW91IAoJICAgIGVuZCB1cCBkb2luZzoKCQkgIAogICAgICAgICAgICAgICAlZXhjZXB0aW9uIGJhcmZvbyB7CQkJCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFMSkgewkuLi4gfQkJCQkgIAoJICAgICAgICAgfSBjYXRjaChFMikgewkuLi4gfQkJCQkgIAoJICAgICAgIH0JCQkJCgkgICAgCgkgICAgd2hpY2ggaXMgdmVyeSB0ZWRpb3VzLiBXZWxsLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIGRlZmluZXMKCSAgICB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRvIGNhdGNoLCBhbmQgZnJvbSBzd2lnOgogCQoJICAgICAgICVjYXRjaGVzKEUxLEUyKSBiYXJmb28oaW50IGkpOwoJICAgICAgIGludCBiYXJmb28oaW50IGkpOwoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byAKCgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKCSAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSAlY2F0Y2hlcyBsaXN0IGRvZXNuJ3QgaGF2ZSB0bwoJICAgIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdQoJICAgIGhhdmU6CgoJCXN0cnVjdCBFIHt9OwoJCXN0cnVjdCBFMSA6IEUge307CgkJc3RydWN0IEUyIDogRSB7fTsKCiAgCSAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKICAgICAgICAgICAgeW91IGNhbiBkZWZpbmUKCSAgICAgICAgCgkJJWNhdGNoZXMoRSkgYmFyZm9vKGludCBpKTsKCQoJICAgIGFuZCBzd2lnIHdpbGwgZ2VuZXJhdGUgYW4gYWN0aW9uIGNvZGUgZXF1aXZhbGVudCB0bwoKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUgJl9lKSB7IAoJCSAgIDxyYWlzZSBfZT47CgkJIH0JCgogICAgICAgICAgICBPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHNhdGlzZnkgdGhlIEMrKyByZXN0cmljdGlvbnMsCgkgICAgYW5kIHRoZSBjYXRjaGVzIGxpc3QgbXVzdCBiZSBjb21wYXRpYmxlIChub3QgdGhlIHNhbWUpCgkgICAgYXMgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdHlwZXMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgoKCSAgICBBbHNvLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gY2F0Y2ggdGhlCgkgICAgdW5rbm93biBleGNlcHRpb24gJy4uLicsIGZvciBleGFtcGxlOgoKCSAgICAgICAlY2F0Y2hlcyhFMSxFMiwuLi4pIGJhcmZvbyhpbnQpOwoKCSAgICBJbiBhbnkgY2FzZSwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSB3aWxsIGVtaXQgdGhlCgkgICAgY29kZSB0byBjb252ZXJ0IGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBlcnJvci9leGNlcHRpb24KICAgICAgICAgICAgdXNpbmcgdGhlICd0aHJvd3MnIHR5cGVtYXAuCgoJICAgIEZvciB0aGUgJy4uLicgY2FzZSB0byB3b3JrLCB5b3UgbmVlZCB0bwoJICAgIHdyaXRlIHRoZSBwcm9wZXIgdHlwZW1hcCBpbiB5b3VyIHRhcmdldCBsYW5ndWFnZS4gSW4gdGhlCgkgICAgVVRMLCB0aGlzIGxvb2tzIGxpa2U6CgoJICAgICAgJXR5cGVtYXAodGhyb3dzKSAoLi4uKSB7CgkgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJ1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgIH0KCjAxLzA5LzIwMDY6IG11dGFuZGl6CgkgICAgW0FsbGVncm9jbF0KCiAgICAgICAgICAgIEZpeGVzIGEgbnVtYmVyIG9mIFNFR1ZzIHByaW1hcmlseSBpbiB0aGUgaGFuZGxpbmcgb2YKICAgICAgICAgICAgdmFyaW91cyBhbm9ueW1vdXMgdHlwZXMuIEZvdW5kIGluIGEgcGFzcyB0aHJvdWdoIHRoZQogICAgICAgICAgICBzd2lnIHRlc3Qtc3VpdGUuIFN0aWxsIG1vcmUgdG8gZG8gaGVyZSwgYnV0IHRoaXMgaXMgYQogICAgICAgICAgICBnb29kIGNoZWNrcG9pbnQuCgogICAgICAgICAgICBBZGRzIC1jd3JhcCBhbmQgLW5vY3dyYXAgYXMgYW4gYWxsZWdyb2NsIHNwZWNpZmljCiAgICAgICAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gQ29udHJvbHMgZ2VuZXJhdGluZyBvZiBhIEMKICAgICAgICAgICAgd3JhcHBlciBmaWxlIHdoZW4gd3JhcHBpbmcgQyBjb2RlLiBCeSBkZWZhdWx0IG9ubHkgYQogICAgICAgICAgICBsaXNwIGZpbGUgaXMgY3JlYXRlZCBmb3IgQyBjb2RlIHdyYXBwaW5nLgoKICAgICAgICAgICAgRG9jIHVwZGF0ZXMgZm9yIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBmaXhlcyBhcwogICAgICAgICAgICBwb2ludGVkIG91dCBvbiBzd2lnLWRldmVsCgowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHVuc2lnbmVkIGxvbmcgbG9uZyBhbmQgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYgdHlwZW1hcHMKICAgICAgICAgICAgLSBCdWcgIzEzOTgzOTQgIHdpdGggcGF0Y2ggZnJvbSBEcmllcyBEZWNvY2sKCjAxLzA2LzIwMDY6IG1tYXR1cwoJICAgIEFkZCAnbmFtZWQnIHdhcm5pbmcgY29kZXMsIG5vdyBpbiBhZGRpdGlvbiB0bzoKCSAgICAKCSAgICAgICV3YXJuZmlsdGVyKDgxMyk7CgkgICAKCSAgICB5b3UgY2FuIHVzZQoKCSAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX0pBVkFfTVVMVElQTEVfSU5IRVJJVEFOQ0UpOwoKCSAgICBqdXN0IHVzZSB0aGUgc2FtZSBjb2RlIG5hbWUgZm91bmQgaW4gIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmggCgkgICAgcGx1cyB0aGUgJ1NXSUcnIHByZWZpeC4KCgkgICAgSWYgYSBkZXZlbG9wZXIgYWRkcyBhIG5ldyB3YXJuaW5nIGNvZGUsIHRoZSBMaWIvc3dpZ3dhcm4uc3dnIGZpbGUKICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nIHRoZSB0b3AgbGV2ZWwgbWFrZS4KCjAxLzA1LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBSZWltcGxlbWVudGVkIG9iamVjdCB0cmFja2luZyBmb3IgUnVieS4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gd29ya3MKCSAgICBieSBleHBhbmRpbmcgdGhlIHN3aWdfY2xhc3Mgc3RydWN0dXJlIGZvciBSdWJ5IGJ5IGFkZGluZyBhIHRyYWNrT2JqZWN0cwoJICAgIGZpZWxkLiAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0L3Vuc2V0IHZpYSAldHJhY2tvYmplY3RzIGFzIGV4cGxhaW5lZAoJICAgIGluIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24uICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIGlzIG1vcmUgcm9idXN0CgkgICAgYW5kIHRha2VzIGxlc3MgY29kZSB0byBpbXBsZW1lbnQuCgkJCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWV4dGVuZCBhbmQgc3RhdGljIGNvbnN0IGludGVncmFsIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmFyID0gNDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluZm8gZm9yIG9sZCBhbmQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBlbnRpcmUgbm9kZSB0cmVlLCBpbmNsdWRpbmcgc3lzdGVtIG5vZGVzICAgIAogICAgIAkgICAgLWR1bXBfbW9kdWxlICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIG1vZHVsZSBub2RlIHRyZWUsIGF2b2lkaW5nIHN5c3RlbSBub2RlcyAgICAgCiAgICAgCSAgICAtZHVtcF9jbGFzc2VzICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kdW1wX3R5cGVkZWYgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBhbmQgdHlwZWRlZnMgZm91bmQgaW4gdGhlIGludGVyZmFjZQogICAgIAkgICAgLWR1bXBfdGFncyAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZGVidWdfdHlwZW1hcCAgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHR5cGVtYXBzCQkJICAgICAgIAogICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHRlbXBsYXRlcwkJCSAgICAgICAgCgoJICAtIEFkZCB0aGUgZmFrZXZlcnNpb24uIElmIHlvdSBoYXZlIGEgcHJvamVjdCB0aGF0IHVzZXMKICAgICAgICAgICAgY29uZmlndXJlL3NldHVwLnB5LCBvciBhbm90aGVyIGF1dG9tYXRpYyBidWlsZGluZyBzeXN0ZW0KICAgICAgICAgICAgYW5kIHJlcXVpcmVzIGEgc3BlY2lmaWMgc3dpZyB2ZXJzaW9uLCBsZXQgc2F5IDEuMy4yMiAKCSAgICB5b3UgY2FuIHVzZToKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIKCgkgICAgIG9yCiAKICAgICAgICAgICAgICAgc3dpZyAtZmFrZXZlcnNpb24gMS4zLjIyCgogICAgICAgICAgICAgYW5kIHRoZW4gc3dpZyAtdmVyc2lvbiB3aWxsIHJlcG9ydCAxLjMuMjIgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbi4KCgkgICAgIFR5cGljYWwgdXNlIHdvdWxkIGJlCgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiIC4vY29uZmlndXJlIAkgICAgIAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBvcHRpb24vZm9ybWF0IHN1cHBvcnQgdG8gJXJlbmFtZSBhbmQgJW5hbWV3YXJuLgkKCSAgICBOb3cgJW5hbWV3YXJuIGNhbiBmb3JjZSByZW5hbWluZywgZm9yIGV4YW1wbGU6CgoJICAgICAgJW5hbWV3YXJuKCIzMTQ6IGltcG9ydCBpcyBhIGtleXdvcmQiLHJlbmFtZT0iXyVzIikgImltcG9ydCI7CgkgICAgCgkgICAgYW5kIHJlbmFtZSBjYW4gYWxzbyBzdXBwb3J0IGZvcm1hdCBmb3JtczoKCgkgICAgICAgJXJlbmFtZSgic3dpZ18lcyIpIGltcG9ydDsKCgkgICAgTm93LCBzaW5jZSB0aGUgZm9ybWF0IGlzIHByb2Nlc3NlZCB2aWEgc3dpZyBQcmludGYsIHlvdQoJICAgIGNhbiB1c2UgZW5jb2RlcnMgYXMgZm9sbG93czoKCgkgICAgICAgJXJlbmFtZSgiJSh0aXRsZSlzIikgIGltcG9ydDsgICAgIC0+IEltcG9ydAoJICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIpICBpbXBvcnQ7ICAgICAtPiBJTVBPUlQKCSAgICAgICAlcmVuYW1lKCIlKGxvd2VyKXMiKSAgSW1wb3J0OyAgICAgLT4gaW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7IC0+IENhbWVsQ2FzZQoJICAgICAgIAoJICAgIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhZGQgbW9yZSBlbmNvZGVycywgYXMgdGhlIAoJICAgIGV4cGVjdGVkIG9uZSBmb3IgcmVndWxhciBleHByZXNzaW9ucy4gCgoJICAtIEFkZCB0aGUgYWJvdmUgJ2N0aXRsZScgZW5jb2Rlciwgd2hpY2ggZG9lcyB0aGUgY2FtZWwgY2FzZToKCgkgICAgICAgIGNhbWVsX2Nhc2UgLT4gQ2FtZWxDYXNlCiAgCgkgIC0gQWxzbywgd2hpbGUgd2UgZ2V0IHRoZSByZWdleHAgc3VwcG9ydCwgYWRkIHRoZSAnY29tbWFuZCcgZW5jb2RlciwKICAgICAgICAgICAgeW91IGNhbiB1c2UgaXQgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOnNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgKXMiKSBpbXBvcnQ7IAoKCSAgICB0aGVuIHN3aWcgd2lsbCBwb3BlbiB0aGUgY29tbWFuZAoJICAgIAoJCSJzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IGltcG9ydCIKCQkKICAgICAgICAgICAgc2VlIGJlbG93IGZvciBhbm9ueW1vdXMgcmVuYW1lcyBmb3IgYmV0dGVyIGV4YW1wbGVzLgkJCgogICAgICAgICAgLSBUaGUgcmVuYW1lIGRpcmVjdGl2ZSBub3cgYWxzbyBhbGxvd3M6CgoJICAgIC0gc2ltcGxlIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgYSB0eXBlIG1hdGNoCgkgICAgICBoYXBwZW4sIGZvciBleGFtcGxlCgoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaD0iZW51bWl0ZW0iKSBoZWxsbzsKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgkJIGludCBoZWxsbygpICAtPiAgaGVsbG87IAoKCSAgICAtIGV4dGVuZGVkIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgdGhlICdleHRlbmRlZCBhdHRyaWJ1dGUnIG1hdGNoCgkgICAgICBvY2N1cnJlZCwgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHNhbWUgYXMgc2ltcGxlIG1hdGNoIAkJCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgoJICAgICAgIE5vdGUgdGhhdCB0aGUgc3ltYm9sICckJyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYXR0cmlidXRlIG5hbWUgaW4KCSAgICAgICBhICdyZWN1cnNpdmUnIHdheSwgZm9yIGV4YW1wbGU6CgoJCSAvLyBtYXRjaCBvbmx5IGhlbGxvIGluICdlbnVtIEhlbGxvJwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAgLy8gbWF0Y2gKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoKICAgICAgICAgICAgICAgaGVyZSwgZm9yIEhlbGxvOjpoaSwgdGhlICJwYXJlbnROb2RlIiBpcyAiSGVsbG8iLCBhbmQgaXRzICJ0eXBlIgogICAgICAgICAgICAgICBpcyAiZW51bSBIZWxsbyIuCgkgICAgICAgCgkgICAgICAgCiAgICAgICAgICAgIC0gQW5vbnltb3VzIHJlbmFtZXM6IHlvdSBjYW4gdXNlICdhbm9ueW1vdXMnIHJlbmFtZSBkaXJlY3RpdmVzLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyBpbiBIZWxsbwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSAiIjsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgSGksIEhlbGxvICAgLy8gbWF0Y2ggYm90aAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgkJIAoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyAKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgIiI7IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGl0ZW1zIGluIGdpdmVuIGNvbW1hbmQgKHNsb29vb3csIGJ1dC4uLikKCQkgJXJlbmFtZSglKGNvbW1hbmQ6PG15IGV4dGVybmFsIGNtZD4pcykgIiI7IAoKCQoJICAgICAgQW5vbnltb3VzIHJlbmFtZXMgd2l0aCBjb21tYW5kcyBjYW4gYmUgdmVyeSBwb3dlcmZ1bCwgc2luY2UgeW91CgkgICAgICBjYW4gJ291dHNvdXJjZScgYWxsIHRoZSByZW5hbWluZyBtZWNoYW5pc20gKG9yIHBhcnQgb2YgaXQpIHRvIGFuCgkgICAgICBleHRlcm5hbCBwcm9ncmFtOgoJICAgICAgCgkgICAgICAgIC8vIFVwcGVyY2FzZSBhbGwgKGFuZCBvbmx5KSB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoICdpJwoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICcvXmkve3ByaW50IHRvdXBwZXIoJDEpfScgPDw8KXMiKSAiIjsgICAKCSAgICAgICAKCSAgICAgICAgaW50IGltcG9ydGVkKCkgLT4gSU1QT1JURUQ7CgkgICAgICAgIGludCBoZWxsbygpICAgIC0+IGhlbGxvCgoJICAgICAgTm90ZSB0aGF0IGlmIHRoZSAnY29tbWFuZCcgZW5jb2RlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgc3dpZwoJICAgICAgdW5kZXJzdGFuZHMgdGhhdCBubyByZW5hbWUgaXMgbmVjZXNzYXJ5LgoKCSAgICAgIEFsc28gbm90ZSB0aGF0ICVyZW5hbWUgJ3Bhc3NlcycgdGhlIG1hdGNoZWQgbmFtZS4gRm9yIGV4YW1wbGUsIGluCgkgICAgICB0aGlzIGNhc2UKCgkgICAgICAgIG5hbWVzcGFjZSBuczEgewoJCSAgaW50IGZvbygpOwoJCX0KCgkgICAgICAgIG5hbWVzcGFjZSBuczIgewoJCSAgaW50IGJhcigpOwoJCX0KCgkgICAgICB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBvbmx5IHJlY2VpdmVzICJmb28iIGFuZCAiYmFyIi4gSWYgbmVlZGVkLAoJICAgICAgaG93ZXZlciwgeW91IGNhbiByZXF1ZXN0IHRoZSAnZnVsbG5hbWUnIAoJICAgICAgIAkKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnYXdrICcvbnMxOjove2w9c3BsaXQoJDEsYSwiOjoiKTsgcHJpbnQgdG91cHBlcihhW2xdKX0nJyA8PDwpcyIsZnVsbG5hbWU9MSkgIiI7ICAgCiAgICAgICAgICAgICAgICAKCQluczE6OmZvbyAtPiBGT08KCQluczI6OmJhciAtPiBiYXIJCgkKCSAgICAtIE1peGluZyBlbmNvZGVycyBhbmQgbWF0Y2hpbmc6IG9mIGNvdXJzZSwgeW91IGNhbiBkbyBtaXggY29tbWFuZHMKCSAgICAgIGFuZCBtYXRjaCBmaWVsZHMsIGZvciBleGFtcGxlOgoKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZm5jcz4pIixtYXRjaD0iY2RlY2wiKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXM+KSIsbWF0Y2g9ImVudW1pdGVtIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zIGluc2lkZSBhIGNsYXNzPikiLG1hdGNoPSJlbnVtaXRlbSIsCgkJICAgICAgICBtYXRjaCRwYXJlbnROb2RlJHBhcmVudE5vZGUkbm9kZVR5cGU9ImNsYXNzIikgIiI7CgkJCgkgICAgICBVc2UgInN3aWcgLWR1bXBfcGFyc2VfbW9kdWxlIiB0byBzZWUgdGhlIGF0dHJpYnV0ZSBuYW1lcyB5b3UgY2FuIHVzZSB0bwoJICAgICAgbWF0Y2ggYSBzcGVjaWZpYyBjYXNlLgoJCiAgICAgICAgICAgIC0gJ3NvdXJjZWZtdCcgYW5kICd0YXJnZXRmbXQnOiBzb21ldGltZXMgeW91IG5lZWQgdG8KICAgICAgICAgICAgICBwcm9jZXNzIHRoZSAnc291cmNlJyBuYW1lIGJlZm9yZSBjb21wYXJpbmcsIGZvciBleGFtcGxlCgoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIpICJlbXB0eSI7CgoJICAgICAgdGhlbiBpZiB5b3UgaGF2ZQoKCSAgICAgICAgaW50IEVtcHR5KCk7ICAvLyAiRW1wdHkiIGlzIHRoZSBzb3VyY2UgCgkJCgkgICAgICB5b3Ugd2lsbCBnZXQgdGhlIGtleXdvcmQgd2FybmluZyBzaW5jZSAnRW1wdHknIHdpbGwgYmUKCSAgICAgIGxvd2VyIGNhc2VkLCB2aWEgdGhlIHNvdXJjZWZtdD0iJShsb3dlcilzIiBvcHRpb24sCgkgICAgICBiZWZvcmUgYmVlbiBjb21wYXJlZCB0byB0aGUgJ3RhcmdldCcgImVtcHR5Ii4KCgkgICAgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsICd0YXJnZXRmbXQnIG9wdGlvbiB0byBwcm9jZXNzIHRoZQoJICAgICAgJ3RhcmdldCcgYmVmb3JlIGNvbXBhcmluZy4KCgkgICAgLSBjb21wbGVtZW50aW5nICdtYXRjaCc6IHlvdSBjYW4gdXNlICdub3RtYXRjaCcsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiLG5vdG1hdGNoPSJuYW1lc3BhY2UiKSAiZW1wdHkiOwoKCSAgICAgIGhlcmUsIHRoZSBuYW1lIHdhcm5pbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3ltYm9scyBleGNlcHQgbmFtZXNwYWNlcy4KCSAgICAKICAgICAgCQoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZ2NqIGFuZCBKYXZhIC0+IDx0YXJnZXQgbGFuZ3VhZ2U+IG1lY2hhbmlzbS4KCgkgICAgU2VlCWV4YW1wbGVzIGluOiAgCgkgIAoJCUV4YW1wbGVzL3B5dGhvbi9qYXZhCgkJRXhhbXBsZXMvcnVieS9qYXZhCgkJRXhhbXBsZXMvdGNsL2phdmEKCiAgICAgICAgICAgIHRvIHNlZSBob3cgdG8gdXNlIGdjaitzd2lnIHRvIGV4cG9ydCBqYXZhIGNsYXNzZXMgaW50bwogICAgICAgICAgICBweXRob24vcnVieS90Y2wuCgkgICAgCgkgICAgVGhlIGlkZWEgaXMgdG8gcHV0IGFsbCB0aGUgY29tbW9uIGNvZGUgZm9yIGdjaiBpbnNpZGUKCgkgICAgICAgICAgTGliL2djagoKICAgICAgICAgICAgYW5kIGxvY2FsaXplIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMganN0cmluZywgYXMgY2FuIGJlIGZvdW5kCiAgICAgICAgICAgIGluCgoJICAgICAgICAgTGliL3B5dGhvbi9qc3RyaW5nLmkKCSAgICAgICAgIExpYi9ydWJ5L2pzdHJpbmcuaQoJICAgICAgICAgTGliL3RjbC9qc3RyaW5nLmkKCiAgICAgICAgICAgIFVzaW5nIHRoZSBVVEwsIHRoaXMgaXMgdmVyeSBlYXN5LCBhbmQgdGhlIHBlcmwgdmVyc2lvbiBmb3IKICAgICAgICAgICAganN0cmluZy5pIHdpbGwgYmUgbmV4dC4KCQkgCSAgICAKCjEyLzI5LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgY29weWN0b3IgZmVhdHVyZS9kaXJlY3RpdmUvb3B0aW9uIHRvIGVuYWJsZSB0aGUgYXV0b21hdGljCgkgICAgZ2VuZXJhdGlvbiBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIGFzIGluOgoKCSAgICAgICVjb3B5Y3RvciBBOwoKCSAgICAgIHN0cnVjdCBBIHsKCiAgICAgICAgICAgICAgfTsKCgkgICAgdGhlbiB0aGlzIHdpbGwgd29yawoKCSAgICAgIGExID0gQSgpOwoJICAgICAgYTIgPSBBKGExKTsKCgkgICAgQWxzbywgc2luY2UgaXQgaXMgYSBmZWF0dXJlLCBpZiB5b3UganVzdCB0eXBlCgoJICAgICAgJWNvcHljdG9yOwoKCSAgICB0aGF0IHdpbGwgIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gZm9yIGFsbCB0aGUKCSAgICBjbGFzc2VzLiBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgc3dpZyAtY29weWN0b3IgLWMrKyAuLi4KCgkgICAgTm90ZXM6IAoKCSAgICAxLi0gVGhlIGZlYXR1cmUgb25seSB3b3JrcyBpbiBDKysgbW9kZS4KCgkgICAgMi4tIFRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgdGhlIGNvcHkgY29uc3RydWN0b3Igd2lsbAoJICAgICAgICB1c3VhbGx5IHByb2R1Y2Ugb3ZlcmxvYWRpbmcuIEhlbmNlLCBpZiB0aGUgdGFyZ2V0CgkgICAgICAgIGxhbmd1YWdlIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGluZywgYSBzcGVjaWFsIG5hbWUKCSAgICAgICAgd2lsbCBiZSB1c2VkIChBX2NvcHkpLgoJICAgIAoJICAgIDMuLSBGb3IgdGhlIG92ZXJsb2FkaW5nIHJlYXNvbnMgYWJvdmUsIGl0IGlzIHByb2JhYmx5IG5vdAogICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBmbGFnIHdoZW4sIGZvciBleGFtcGxlLCB5b3UgYXJlCgkJdXNpbmcga2V5d29yZHMgaW4gUHl0aG9uLgoKICAgICAgICAgICAgNC4tIFRoZSBjb3B5Y3RvciBhdXRvbWF0aWMgbWVjaGFuaXNtIGZvbGxvd3MgbW9yZSBvciBsZXNzCgkgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG1lY2hhbmlzbSwKCSAgICAgICAgaS5lLiwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZQoJICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCBvciBpZiB0aGVyZSBpcyBhIHBlcnRpbmVudCBub24tcHVibGljIAoJCWNvcHkgY3RvciBpbiB0aGUgY2xhc3Mgb3IgaXRzIGhpZXJhcmNoeS4KCgkJSGVuY2UsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGNvbXBsZXRlIHRoZQoJCWNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByb3BlciBub24tcHVibGljIGNvcHkgY3RvcgoJCXRvIGF2b2lkIGEgd3JvbmcgY29uc3RydWN0b3IgYWRkaXRpb24uCgkJCiAgICAgICAgICAtIEZpeCBmZWF0dXJlcy9yZW5hbWUgZm9yIHRlbXBsYXRlcyBjdG9yL2R0b3IgYW5kIG90aGVyCiAgICAgICAgICAgIHRoaW5ncyBhcm91bmQgd2hpbGUgYWRkaW5nIHRoZSBjb3B5Y3RvciBtZWNoYW5pc20uCgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICdtYXRjaCcgb3B0aW9uIHRvIHR5cGVtYXBzLiBBc3N1bWUgeW91IGhhdmU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoKCSAgICB0aGVuIGlmIHlvdSBkbwogCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CgoJICAgIHN3aWcgd2lsbCAnb3ZlcmxvYWQgdGhlICdpbicgdHlwZW1hcCwgYnV0IHRoZSAnZnJlZWFyZycgCgkgICAgdHlwZW1hcCB3aWxsIGJlIGFsc28gYXBwbGllZCwgZXZlbiB3aGVuIHRoaXMgaXMgd3JvbmcuIFRoZSBvbGQKCSAgICBzb2x1dGlvbnMgaXMgdG8gd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQogIAkgICAgICAldHlwZW1hcChmcmVlYWcpIEEgKiAiIjsKCgkgICAgb3ZlcmxvYWQgJ2ZyZWVhcmcnIHdpdGggYW4gZW1wdHkgZGVmaW5pdGlvbi4KCgkgICAgVGhlIHByb2JsZW0gaXMsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHlvdSBuZWVkCgkgICAgdG8gZG8gdGhhdCB1bnRpbCB5b3Ugc3RhcnQgZ2V0dGluZyBicm9rZW4gQysrIGNvZGUsIG9yCgkgICAgd29yc2UsIGJyb2tlbiBydW50aW1lIGNvZGUuCgoJICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGluZmFtb3VzICd0eXBlY2hlY2snIHR5cGVtYXAsCgkgICAgd2hpY2ggYWx3YXlzIGNvbmZ1c2VzIHBlb3BsZSwgc2luY2UgdGhlIGZpcnN0IHRoaW5nIHlvdSBkbwoJICAgIGlzIHRvIGp1c3Qgd3JpdGUgdGhlICdpbicgdHlwZW1hcC4KCgkgICAgVGhlICdtYXRjaCcgb3B0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSwgYW5kIGlmIGluc3RlYWQgeW91IHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoJICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLG1hdGNoPSJpbiIscHJlY2VkZW5jZS4uLikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoJICAgIGl0IHdpbGwgdGVsbCBzd2lnIHRvIGFwcGx5IHRoZSAnZnJlZWFyZy90eXBlY2hlY2snCgkgICAgdHlwZW1hcHMgb25seSBpZiB0aGV5ICdtYXRjaCcgdGhlIHR5cGUgb2YgdGhlICdpbicKCSAgICB0eXBlbWFwLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB3aXRoIG90aGVyIHR5cGVtYXBzIGFzOgoKCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yb3V0KSBTV0lHVFlQRSAqIHsuLi59CgkgICAgICAldHlwZW1hcChkaXJlY3RvcmZyZWUsbWF0Y2g9ImRpcmVjdG9yb3V0IikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uL21vZGUvZmVhdHVyZSB0byB0cmVhdCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCBpZSwgc2ltaWxhciB0byB0aGUgZ2xvYmFsCgkgICAgdmFyaWFibGUgYmVoYXZpb3IuCgoJICAgIFlvdSBjYW4gdXNlIGl0IGluIGEgZ2xvYmFsIHdheSB2aWEgdGhlIGNvbW1hbmQgbGluZQoKCSAgICAgIHN3aWcgLW5hdHVyYWx2YXIgLi4uCgoJICAgIG9yIHRoZSBtb2R1bGUgbW9kZSBvcHRpb24KIAoJICAgICAgJW1vZHVsZShuYXR1cmFsdmFyPTEpCgoJICAgIGJvdGggZm9ybXMgbWFrZSBzd2lnIHRyZWF0IGFsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUKCSAgICBzYW1lIHdheSBpdCB0cmVhdHMgZ2xvYmFsIHZhcmlhYmxlcy4gCgoJICAgIEFsc28sIHlvdSBjYW4gdXNlIGl0IGluIGEgY2FzZSBieSBjYXNlIGFwcHJvYWNoIGZvcgoJICAgIHNwZWNpZmljIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICVuYXR1cmFsdmFyIEJhcjo6czsKCSAgICAKCSAgICBUaGVuLCBpbiB0aGUgZm9sbG93aW5nIGNhc2UgZm9yIGV4YW1wbGU6CgoJICAgICAgIHN0ZDo6c3RyaW5nIHM7CgkgICAgICAgc3RydWN0IEJhciB7CgkJIHN0ZDo6c3RyaW5nIHM7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB5b3UgY2FuIGRvOiAgCgoJICAgICAgIGIgPSBCYXIoKQoJICAgICAgIGIucyA9ImhlbGxvIgoJICAgICAgIGN2YXIucyA9ICJoZWxsbyIKCSAgICAgICAKCSAgICAgICBpZiAoYi5zICE9IGN2YXIucyk6CgkgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCgoJCSAgCiAgICAgICAgICAgIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGZvcmNpbmcgdGhlIHVzZSBvZiB0aGUgCiAgICAgICAgICAgIGNvbnN0IFNXSUdUWVBFJiAoQysrKS9TV0lHVFlQRSAoQykgdHlwZW1hcHMgZm9yIHRoZQogICAgICAgICAgICBnZXQvc2V0IG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgU1dJR1RZUEUgKiB0eXBlbWFwcy4KCSAgICBIZW5jZSwgZm9yICduYXR1cmFsdmFyJyB0byB3b3JrLCBlYWNoIHRhcmdldCBsYW5ndWFnZQoJICAgIG11c3QgaW1wbGVtZW50ICd0eXBlbWFwKGluL291dCkgY29uc3QgVHlwZSYnIHByb3Blcmx5LgoKCSAgICBUaGUgJ25hdHVyYWx2YXInIG9wdGlvbiByZXBsYWNlcyBvciBtYWtlcyB3b3JrYXJvdW5kcyBzdWNoICBhczoKCSAgICAKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICB1bm5lY2Vzc2FyeS4KCgkgICAgTm90ZTE6IElmIHlvdXIgaW50ZXJmYWNlIGhhcyBvdGhlciBraW5kcyBvZiB3b3JrYXJvdW5kcyB0bwoJICAgIGRlYWwgd2l0aCB0aGUgb2xkICd1bm5hdHVyYWwnIHdheSB0byBkZWFsIHdpdGggbWVtYmVyCgkgICAgdmFyaWFibGVzIChyZXR1cm5pbmcvZXhwZWN0aW5nIHBvaW50ZXJzKSwgdGhlCgkgICAgJ25hdHVyYWx2YXInIG9wdGlvbiBjb3VsZCBicmVhayB0aGVtLgoJICAgIAoJICAgIE5vdGUyOiB0aGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdW5uYW1lZCB0eXBlcywgc3VjaAoJICAgIGFzIHVubmFtZWQgbmVzdGVkIHVuaW9ucy4KCSAgICAKCSAgCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBtb3JlICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzIGZvciB0aGUgdHlwZW1hcAogICAgICAgICAgICBsaWJyYXJpZXMuCgoJICAgIEluIHRoZSBwYXN0LCBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcywgeW91IHdvdWxkIGRvIGNoZWNraW5nIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIGlmIChDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncykgIT0gLTEpIHsKCSAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGVycm9yCgkgICAgICB9CgoJICAgIE5vdyB0aGUgcmVzdWx0IHN0YXRlIGNhbiBjYXJyeSBtb3JlIGluZm9ybWF0aW9uLAoJICAgIGluY2x1ZGluZzoKCgkgICAgICAtIEVycm9yIHN0YXRlOiBsaWtlIHRoZSBvbGQgLTEvMCwgYnV0IHdpdGggZXJyb3IgY29kZXMgZnJvbSBzd2lnZXJyb3JzLnN3Zy4KCgkgICAgICAgICBpbnQgcmVzID0gQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpOwoJCSBpZiAoU1dJR19Jc09LKHJlcykpIHsKCQkgICAvLyBzdWNjZXNzIGNvZGUKICAgICAgICAgICAgICAgICB9IGVsc2UgewoJCSAgIFNXSUdfRXJyb3IocmVzKTsgLy8gcmVzIGNhcnJpZXMgdGhlIGVycm9yIGNvZGUKICAgICAgICAgICAgICAgICB9CgoJICAgICAgLSBDYXN0IHJhbms6IHdoZW4gcmV0dXJuaW5nIGEgc2ltcGxlIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGNvbnZlcnNpb24sIHlvdSBqdXN0IHJldHVybiBTV0lHX09LLCBidXQgaWYgeW91IG5lZWQKICAgICAgICAgICAgICAgIHRvIGRvIGEgJ2Nhc3QnLCB5b3UgY2FuIGFkZCB0aGUgY2FzdGluZyByYW5rLCBpZToKCQkKCQkgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CgkJICAgIHJldHVybiBTV0lHX09LOwoJCSAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gKGRvdWJsZSkgUHlJbnRfQXNMb25nKG9iaik7CgkJICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CQkgICAgCiAgICAgICAgICAgICAgICAgIH0KCQkKCQlsYXRlciwgdGhlIGNhc3RpbmcgcmFuayBpcyB1c2VkIHRvIHByb3Blcmx5IGRpc3BhdGNoCgkJdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb24sIGZvciBleGFtcGxlLiBUaGlzIG9mIGNvdXJzZQoJCXJlcXVpcmVzIHlvdXIgbGFuZ3VhZ2UgdG8gc3VwcG9ydCBhbmQgdXNlIHRoZSBuZXcKCQlkaXNwYXRjaCBjYXN0L3JhbmsgbWVjaGFuaXNtIChOb3cgbWFpbmx5IHN1cHBvcnRlZCBpbgoJCXBlcmwgYW5kIHB5dGhvbiwgYW5kIGVhc2lseSBleHBhbmRhYmxlIHRvIHJ1YnkgYW5kIHRjbCkuCgkgICAgICAKCSAgLSBbVVRMXSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcy4KCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrIGltcGxpY2l0IGNvbnZlcnNpb24gbWVjaGFuaXNtLCB3aGljaAogICAgICAgICAgICByZXF1aXJlZCBzb21lIG1vZGlmaWNhdGlvbnMgaW4gcGFyc2VyLnkgKHRvIHJlY29nbml6ZQogICAgICAgICAgICAnZXhwbGljaXQnKSBhbmQgb3ZlcmxvYWQuY3h4ICh0byByZXBsYWNlICRpbXBsaWNpdGNvbnYgYXMKICAgICAgICAgICAgbmVlZGVkKS4KCSAgICAKCSAgICBTdGlsbCwgcmVhbCBzdXBwb3J0IGluIGVhY2ggdGFyZ2V0IGxhbmd1YWdlIHJlcXVpcmVzIGVhY2gKCSAgICB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgbW9kaWZpZWQuIFB5dGhvbiBwcm92aWRlcyBhbiBleGFtcGxlLAogICAgICAgICAgICBzZWUgYmVsb3cuCgoKCSAgLSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9ucywgaWUsIGlmIHlvdQogICAgICAgICAgICBoYXZlCgoJICAgICAgICAlaW1wbGljaXRjb252IEE7CgoJICAgICAgICBzdHJ1Y3QgQSB7CgkJICAgaW50IGlpOwoJCSAgIEEoKSB7aWkgPSAxO30KCQkgICBBKGludCkge2lpID0gMjt9CgkJICAgQShkb3VibGUpIHtpaSA9IDM7fQoJCSAgIGV4cGxpY2l0IEEoY2hhciAqcykge2lpID0gNDt9CgkJfTsKCQkKCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgogICAgICAgICAgICB5b3UgY2FuIGNhbGw6CgoJICAgICAgICBhID0gQSgpCgkgICAgICAgIGFpID0gQSgxKQoJICAgICAgICBhZCA9IEEoMS4wKQoJICAgICAgICBhcyA9IEEoImhlbGxvIikKCQkKCQkjIG9sZCBmb3JtcwoJICAgICAgICBnZXQoYSkgIC0+IDEKCSAgICAgICAgZ2V0KGFpKSAtPiAyCgkgICAgICAgIGdldChhZCkgLT4gMwoJICAgICAgICBnZXQoYXMpIC0+IDQKCQkKCQkjaW1wbGljaXQgY29udmVyc2lvbnMKCSAgICAgICAgZ2V0KDEpICAgICAgIC0+IDIKCSAgICAgICAgZ2V0KDEuMCkgICAgIC0+IDMKCSAgICAgICAgZ2V0KCJoZWxsbyIpIC0+IEVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKICAgICAgICAgICAgQWxzbywgYXMgaW4gQysrLCBub3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBpbgogICAgICAgICAgICB2YXJpYWJsZSBhc3NpZ21lbnRzLCBhbmQgaWYgeW91IGhhdmU6CgoJICAgICAgQSBnYTsKCSAgICAgIHN0cnVjdCBCYXIgewoJICAgICAgICBBIGE7CiAgICAgICAgICAgICAgfTsKCgkgICAgeW91IGNhbiBkbzoKCgkgICAgICBjdmFyLmdhID0gQSgxKQoJICAgICAgY3Zhci5nYSA9IDEKCSAgICAgIGN2YXIuZ2EgPSAxLjAKCSAgICAgIGN2YXIuZ2EgPSBBKCJoZWxsbyIpIAoJICAgICAgY3Zhci5nYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgICAgYiA9IEJhcigpCgkgICAgICBiLmEgPSBBKCJoZWxsbyIpCgkgICAgICBiLmEgPSAxCgkgICAgICBiLmEgPSAxLjAKCSAgICAgIGIuYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBjYXNlLCBhc3NpZ25pbmcgYSBtZW1iZXIgdmFyIGRpcmVjdGx5LCAKCSAgICBhbHNvIHJlcXVpcmVzIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uLgoKCSAgICBUaGlzIHN1cHBvcnQgbm93IG1ha2VzIHRoZSBvbGQgJyVpbXBsaWNpdCcgbWFjcm8sIHdoaWNoCgkgICAgd2FzIGZvdW5kIGluICdpbXBsaWNpdC5pJyBhbmQgaXQgd2FzIGZyYWdpbGUgaW4gbWFueSB3YXlzLAoJICAgIG9ic29sZXRlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlIG5ldyAnJWltcGxpY2l0Y29udicKCSAgICBkaXJlY3RpdmUgaW5zdGVhZC4KCgkgICAgTm90ZSB0aGF0IHdlIGZvbGxvdyB0aGUgQysrIGNvbnZlbnRpb25zLCBpZSwgaW4gdGhlCgkgICAgZm9sbG93aW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGFsbG93ZWQ6CgoJCWludCBnZXQoQSBhKSB7cmV0dXJuIGEuaWk7fQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCSAgICAKCSAgICBidXQgbm90IGluIHRoZXNlIGNhc2VzOgoKCQlpbnQgZ2V0KEEgKmEpIHtyZXR1cm4gYS0+aWk7fQoJCWludCBnZXQoQSYgYSkge3JldHVybiBhLmlpO30KCQkKCSAgICBBbHNvLCBpdCB3b3JrcyBmb3IgZGlyZWN0b3IgbWV0aG9kcyB0aGF0IHJldHVybiBhIGJ5IHZhbHVlCgkgICAgcmVzdWx0LCBpZSwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CgogICAgICAgICAgICAgICAgdmlydHVhbCBBIGdldF9hKCkgPSAwOwoKCQlkZWYgZ2V0X2Eoc2VsZik6CgkJICAgcmV0dXJuIDEKCiAgICAgICAgICAgIGJ1dCBub3QgaW4gdGhpcyBjYXNlOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc3QgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBKiBnZXRfYSgpID0gMDsKCSAgICAKCSAgTm90ZXM6CgoJICAtIHRoZSBpbXBsaWNpdGNvbnYgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5CgkgICAgY2FsbGluZy9kaXNwYXRjaGluZyB0aGUgcHl0aG9uIGNvbnN0cnVjdG9yLCB0cmlnZ2VyaW5nIGEKCSAgICBjYWxsIHRvIHRoZSBfX2luaXRfX21ldGhvZC4gSGVuY2UsIGlmIHlvdSBleHBhbmRlZCB0aGUKCSAgICBfX2luaXRfXyBtZXRob2QsIGxpa2UgaW46CgoJICAgICAgICBjbGFzcyBBOgoJCSAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgoJCSAgICAgIDxzd2lnIGNvZGU+CgkJICAgICAgPG15IGNvZGUgaGVyZT4KCiAgICAgICAgICAgIHRoZW4gJ215IGNvZGUnIHdpbGwgYWxzbyBiZSBleGVjdXRlZC4KCSAgICAKCSAgLSBTaW5jZSB0aGUgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgaXMgYSBTV0lHIGZlYXR1cmUsIGlmIHlvdSB0eXBlOgoJICAgIAogIAkgICAgICAgJWltcGxpY2l0Y29udjsgIAoKCSAgICB0aGF0IHdpbGwgZW5hYmxlIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGFsbCB0aGUgY2xhc3NlcyBpbgoJICAgIHlvdXIgbW9kdWxlLgoKCSAgICBCdXQgaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBtYXliZSB0aGF0IHdpbGwgYmUKCSAgICB0b28gbXVjaCwgZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBvdmVybG9hZGVkIG1ldGhvZHMsIHNpbmNlCgkgICAgdG8gcmVzb2x2ZSB0aGUgZGlzcGF0Y2hpbmcgcHJvYmxlbSwgcHl0aG9uIHdpbGwgZWZlY3RpdmVseQoJICAgIHRyeSB0byBjYWxsIGFsbCB0aGUgaW1wbGljaXQgY29uc3RydWN0b3JzIGFzIG5lZWRlZC4KCgkgIC0gRm9yIHRoZSBzYW1lIHJlYXNvbiwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAgICAgICAgICB0aGUgbmV3ICdjYXN0bW9kZScgd2hlbiBtaXhpbmcgaW1wbGljaXQgY29udmVyc2lvbiBhbmQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcuCgoJIC0gW3B5dGhvbl0gVGhlICVpbXBsaWNpdCBkaXJlY3RpdmUgaXMgZGVjbGFyZWQgb2Jzb2xldGUsIGFuZAogICAgICAgICAgIHlvdSBzaG91bGQgdXNlICVpbXBsaWNpdGNvbnYgaW5zdGVhZC4gSWYgeW91IGluY2x1ZGUKCSAgIHRoZSBpbXBsaWNpdC5pIGZpbGUsIGEgd2FybmluZyB3aWxsIHJlbWluZCB5b3Ugb2YgdGhpcy4KCgkgICBOb3RlOiBTaW5jZSAlaW1wbGljaXQgaXMgZnJhZ2lsZSwganVzdCByZXBsYWNpbmcgaXQgYnkKCSAgICVpbXBsaWNpdGNvbnYgY291bGQgbGVhZCB0byBkaWZmZXJlbnQgYmVoYXZpb3IuIEhlbmNlLCB3ZQoJICAgZG9uJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggZnJvbSB0byB0aGUgb3RoZXIsIGFuZCB0aGUgdXNlcgoJICAgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgbWFudWFsbHkuCgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBNb2RpZnkgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgdG8gdXNlIHN0ZDo6dmVjdG9yOjp2YWx1ZV90eXBlIGFzIHRoaXMgaXMKICAgICAgICAgICAgY2xvc2VyIHRvIHRoZSByZWFsIFNUTCBkZWNsYXJhdGlvbnMgZm9yIHNvbWUgbWV0aG9kcywgZWcgZm9yIHB1c2hfYmFjaygpLgogICAgICAgICAgICBGaXhlcyBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBmb3Igc29tZSBjb21waWxlcnMgZWcgd2hlbiB0aGUgdGVtcGxhdGVkCiAgICAgICAgICAgIHR5cGUgaXMgYSBwb2ludGVyLgoKICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyAtIGEgZmV3IG1vcmUgbWV0aG9kcyBhcmUgd3JhcHBlZCBhbmQgc3BlY2lhbGl6YXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcmVxdWlyZWQuIFRoZSBzcGVjaWFsaXplX3N0ZF92ZWN0b3IgbWFjcm8gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoYQogICAgICAgICAgICB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGl0KS4KCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgQWRkIGluIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzLiBUaGlzIGFsc28gZW5hYmxlcyBvbmUgdG8gZWFzaWx5IHdyYXAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gd2hlcmUgVCBpcyBhIHBvaW50ZXIuCgoxMi8yNC8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFRoZSBjZmZpIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEZ1bGx5IHN1cHBvcnRzIEMsIGJ1dCBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnRzIGZvciBDKyssIGluCiAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgQysrIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgb3ZlcmxvYWRpbmcgbmVlZHMgdG8KICAgICAgICAgICAgICAgYmUgd29ya2VkIHVwb24uIAoKMTIvMjMvMjAwNTogbW1hdHVzCgkgICAgW3B5dGhvbl0gQWRkIHRoZSBjYXN0bW9kZSB0aGF0IGFsbG93cyB0aGUgcHl0aG9uCgkgICAgdHlwZSBjYXN0aW5nIHRvIG9jY3VyLgoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJ2ludCBmb28oaW50KScsIG5vdwoJICAgIAoJICAgICAgY2xhc3MgQWkoKToKCSAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLHgpOiAKCQkgICAgc2VsZi54ID0geAoJICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IAoJCSAgICByZXR1cm4gc2VsZi54CgoJICAgICAgZm9vKDEpICAgLy8gT2sKCSAgICAgIGZvbygxLjApIC8vIE9rCgkgICAgICBmb28oMS4zKSAvLyBFcnJvcgoJICAgICAgYSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNlc3NhcnkgY2FsbHMgdG8gU1dJR19UeXBlUXVlcnkgZm9yICdjaGFyIConCgkgICAgYW5kICd3Y2hhcl90IConLCBwcm9ibGVtIGZvdW5kIGJ5IENsYXkgQ3VsdmVyIHdoaWxlCgkgICAgcHJvZmlsaW5nIHRoZSBQeU9ncmUgcHJvamVjdC4KCgkgIAoJICBbUHl0aG9uXSAKCSAgLSBBZGQgdGhlIC1kaXJ2dGFibGUvLW5vZGlydnRhYmxlIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgYSBwc2V1ZG8gdmlydHVhbCB0YWJsZSB1c2VkIGZvciBkaXJlY3RvcnMsIGF2b2lkaW5nCgkgICAgdGhlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgcHl0aG9uIG1ldGhvZCBhdCBlYWNoIGNhbGwuCgkgICAgCgkgIC0gQWRkIHRoZSAtc2FmZWNzdHJpbmdzLy1ub3NhZmVjc3RyaW5ncyBvcHRpb25zIHRvCgkgICAgZW5hYmxlL2Rpc2FibGUgdGhlIHVzZSBvZiBzYWZlIGNvbnZlcnNpb25zIGZyb20gUHlTdHJpbmcKCSAgICB0byBjaGFyICouIFB5dGhvbiByZXF1aXJlcyB5b3UgdG8gbmV2ZXIgY2hhbmdlIHRoZSBpbnRlcm5hbAoJICAgIGJ1ZmZlciBkaXJlY3RseSwgYW5kIGhlbmNlICdzYWZlY3RyaW5ncycgd2FycmFudGllcyB0aGF0CgkgICAgYnV0IHJldHVybmluZyBhIGNvcHkgb2YgdGhlIGludGVybmFsIHB5dGhvbiBzdHJpbmcgYnVmZmVyLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcHJldmlvdXMgcmVsZWFzZXMsIGlzIHRvIHJldHVybiBhCgkgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIChub3NhZmVjc3RyaW5ncyksIHNvLCBpdCBpcyB0aGUgdXNlcidzCgkgICAgcmVzcG9uc2liaWxpdHkgdG8gYXZvaWQgaXRzIG1vZGlmaWNhdGlvbi4KCSAgICAKCSAgLSBBZGQgdGhlIC1PIG9wdGlvbiB0byBlbmFibGUgYWxsIHRoZSBvcHRpbWl6YXRpb24gb3B0aW9ucwoJICAgIGF0IG9uY2UsIGluaXRpYWxseSBlcXVpdmFsZW50IHRvCgoJICAgIC1tb2Rlcm4gLWZhc3RkaXNwYXRjaCAtZGlydnRhYmxlIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwKCjEyLzA4LzIwMDU6IG1tYXR1cyAKCgkgIC0gQWRkIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiAoZmFzdGRpc3BhdGNoIGZlYXR1cmUpLiBUaGlzCgkgICAgZW5hYmxlcyB0aGUgImZhc3QgZGlzcGF0Y2giIG1lY2hhbmlzbSBmb3Igb3ZlcmxvYWRlZAoJICAgIG1ldGhvZHMgcHJvdmlkZWQgYnkgU2FsdmFkb3IgRmFuZGl+bm8gR2FyYydpYSAoIzkzMDU4NikuCgoJICAgIFRoZSByZXN1bHRpbmcgY29kZSBpcyBzbWFsbGVyIGFuZCBmYXN0ZXIgc2luY2UgbGVzcyB0eXBlCgkgICAgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiBIb3dldmVyLCB0aGUgZXJyb3IgbWVzc2FnZXMgeW91CgkgICAgZ2V0IHdoZW4gdGhlIG92ZXJsb2FkaW5nIGlzIG5vdCByZXNvbHZlZCBjb3VsZCBiZQoJICAgIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCByZXR1cm5zLgoKCSAgICBXaXRoIHRoZSBvbGQgbWV0aG9kIHlvdSBhbHdheXMgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgCgoJICAgICAgICJObyBtYXRjaGluZyBmdW5jdGlvbiBmb3Igb3ZlcmxvYWRlZCAuLi4iCgogICAgICAgICAgICB3aXRoIHRoZSBuZXcgbWV0aG9kIHlvdSBjYW4gYWxzbyBnZXQgZXJyb3JzIHN1Y2ggYXMKCgkgICAgICAgIlR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiB0eXBlIC4uLiIKCgkgICAgU2VlIGJ1ZyByZXBvcnQgIzkzMDU4NiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAKICAJICAgIFNvLCB0aGlzIG9wdGltaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB1c2Vycy4KCgkgICAgVGhlIG5ldyBtZWNoYW5pc20gY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgIHN3aWcgLWZhc3RkaXNwYXRjaAoKICAgICAgICAgICAgb3IgdXNpbmcgdGhlIGZlYXR1cmUgZm9ybQoKCSAgICAgICVmZWF0dXJlKCJmYXN0ZGlzcGF0Y2giKSBtZXRob2Q7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgJWZhc3RkaXNwYXRjaCBtZXRob2Q7CgkgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMgCgogICAgICAgICAgLSBTZXZlcmFsIG1lbW9yeSBhbmQgc3BlZWQgaW1wcm92ZW1lbnRzLCBzcGVjaWFsbHkgZm9yCgkgICAgdGVtcGxhdGVzLiBOb3cgc3dpZyBpcyB1cCB0byAyMCBmYXN0ZXIgdGhhbiBiZWZvcmUgZm9yCgkgICAgbGFyZ2UgdGVtcGxhdGUgaW50ZXJmYWNlcywgc3VjaCBhcyB0aGUgc3RkX2NvbnRhaW5lcnMuaQoJICAgIGFuZCB0ZW1wbGF0ZV9tYXRyaXguaSBmaWxlcyBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUuCgoJICAgIE1lbW9yeSBmb290cHJpbnQgaXMgYWxzbyByZWR1Y2VkIGluIGNvbnNpZGVyYXRpb24gb2Ygc21hbGwKCSAgICBwY3MvYXJjaGl0ZWN0dXJlcy4KCgkgIC0gYWRkIGNvbW1hbmRsaW5lIG9wdGlvbnMgLWNwcGVycmFzd2FybiBhbmQgLW5vY3BwZXJyYXN3YXJuIiB0byBmb3JjZQogICAgICAgICAgICB0aGUgc3dpZyBwcmVwcm9jZXNzb3IgdG8gdHJlYXQgdGhlICNlcnJvciBkaXJlY3RpdmUgYXMgYSAjd2FybmluZy4KCSAgICAKCSAgICB0aGUgcHJhZ21hcwoKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0xCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MAoJICAgICAgIAoJICAgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IG1vcmUgcG9ydGFibGUsIGVzcGVjaWFsbHkKCSAgICBmb3IgV2luZG93cy4gRm9sbG93aW5nIAoKICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS93aW5kb3dzLmh0bWwKCiAgICAgICAgICAgIFB5X05vbmUgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBzdHJ1Y3R1cmUsIHBsdXMgb3RoZXIKICAgICAgICAgICAgdHJpY2tzIG1lbnRpb25lZCB0aGVyZS4KCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhyZWFkcyBiYXNlZCBpbiB0aGUKCSAgICBwcm9wb3NhbCBieSBKb3NlcGggV2luc3Rvbi4KCgkgICAgVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CgoJICAgIDEuLSB0aGUgbW9kdWxlIHRocmVhZCBzdXBwb3J0IGlzIGVuYWJsZSB2aWEgdGhlICJ0aHJlYWRzIiBtb2R1bGUKICAgICAgICAgICAgICAgIG9wdGlvbiwgaS5lLgoKICAgICAgICAgICAgICAgICAgJW1vZHVsZSgidGhyZWFkcyI9MSkKCiAgICAgICAgICAgIDIuLSBFcXVpdmFsZW50IHRvIHRoYXQsIGlzIHRoZSBuZXcgJy10aHJlYWRzJyBzd2lnIG9wdGlvbgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGhyZWFkcyAtcHl0aG9uIC4uLgoKICAgICAgICAgICAgMy4tIFlvdSBjYW4gcGFydGlhbGx5IGRpc2FibGUgdGhyZWFkIHN1cHBvcnQgZm9yIGEgZ2l2ZW4KICAgICAgICAgICAgICAgIG1ldGhvZCB1c2luZzoKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZCIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWQgbWV0aG9kOwoKICAgICAgICAgICAgICAgIGFsc28sIHlvdSBjYW4gZGlzYWJsZSBzZWN0aW9ucyBvZiB0aGUgdGhyZWFkIHN1cHBvcnQsIAogICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGJsb2NrIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGJsb2NrIG1ldGhvZDsKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGFsbG93IikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGFsbG93IG1ldGhvZDsKCiAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGlzYWJsZXMgdGhlIEMrKy9weXRob24gdGhyZWFkIHByb3RlY3Rpb24sIGFuZCB0aGUKICAgICAgICAgICAgICAgIHNlY29uZCBkaXNhYmxlcyB0aGUgcHl0aG9uL0MrKyB0aHJlYWQgcHJvdGVjdGlvbi4gCgogICAgICAgICAgICA0Li0gVGhlIGN1cnJlbnQgdGhyZWFkIHN1cHBvcnQgaXMgYmFzZWQgaW4gdGhlIFB5R0lMCiAgICAgICAgICAgICAgICBleHRlbnNpb24gcHJlc2VudCBpbiBweXRob24gdmVyc2lvbiAyLjMgb3IgbGF0ZXIsIGJ1dAogICAgICAgICAgICAgICAgeW91IGNhbiBwcm92aWRlIHRoZSB0aHJlYWQgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMgYnkKICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBtYWNyb3MgaW4gcHl0aHJlYWRzLnN3Zy4KCgkJSWYgeW91IGdldCBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gZm9yIG9sZGVyIHZlcnNpb25zLAoJCXBsZWFzZSBzZW5kIHVzIGEgcGF0Y2guCgogICAgICAgICAgICBGb3IgdGhlIGN1cmlvdXMgYWJvdXQgcGVyZm9ybWFuY2UsIGhlcmUgYXJlIHNvbWUgbnVtYmVycwogICAgICAgICAgICBmb3IgdGhlIHByb2ZpbGV0ZXN0LmkgdGVzdCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB0aGUgc3BlZWQKCSAgICBvZiB0aGUgd3JhcHBlZCBjb2RlOgoKCSAgICAgICAgbm90aHJlYWQgICAgICAgICAgIDkuNnMgIChubyB0aHJlYWQgY29kZSkKCQlub3RocmVhZGJsb2NrICAgICAxMi4ycyAgKG9ubHkgJ2FsbG93JyBjb2RlKQoJCW5vdGhyZWFkYWxsb3cgICAgIDEzLjZzICAob25seSAnYmxvY2snIGNvZGUpCiAgICAgICAgICAgICAgICBmdWxsIHRocmVhZCAgICAgICAxNS41cyAgKCdhbGxvdycgKyAnYmxvY2snIGNvZGUpCgkgICAgCgkgICAgaS5lLiwgZnVsbCB0aHJlYWQgY29kZSBkZWNyZWFzZXMgdGhlIHdyYXBwaW5nIHBlcmZvcm1hbmNlIGJ5CgkgICAgYXJvdW5kIDYwJS4gSWYgdGhhdCBpcyBpbXBvcnRhbnQgdG8geW91ciBhcHBsaWNhdGlvbiwgeW91CgkgICAgY2FuIHR1bmUgZWFjaCBtZXRob2QgdXNpbmcgdGhlIGRpZmZlcmVudCAnbm90aHJlYWQnLAoJICAgICdub3RocmVhZGJsb2NrJyBvciAnbm90aHJlYWRhbGxvdycgZmVhdHVyZXMgYXMKCSAgICBuZWVkZWQuIE5vdGUgdGhhdCBmb3Igc29tZSBtZXRob2RzIGRlYWN0aXZhdGluZyB0aGUKCSAgICAndGhyZWFkIGJsb2NrJyBvciAndGhyZWFkIGFsbG93JyBjb2RlIGlzIG5vdCBhbiBvcHRpb24sCgkgICAgc28sIGJlIGNhcmVmdWwuCgkgICAgCgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgdXNlIHN5c3RlbSBhbmdsZSBicmFja2V0cyBldmVyeXdoZXJlIGZvciAlaW5jbHVkZSwgZWcKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX2NvbW1vbi5pIgogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9jb21tb24uaT4KCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcyBoYXZlIGFuIGV4dHJhIGNvbnN0cnVjdG9yIHNvIHRoYXQgZW51bSBpdGVtIHZhbHVlcyB0aGF0CiAgICAgICAgICAgIGFyZSBpbml0aWFsaXNlZCBieSBhbm90aGVyIGVudW0gaXRlbSB2YWx1ZSBjYW4gYmUgd3JhcHBlZCB3aXRob3V0IGhhdmluZyB0byB1c2UgJWphdmFjb25zdHZhbHVlLwogICAgICAgICAgICAlY3Njb25zdHZhbHVlIGZvciB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkuIFN1Z2dlc3Rpb24gYnkKICAgICAgICAgICAgQm9iIE1hcmluaWVyL0RvdWdsYXMgUGVhcnNvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB4eXosCiAgICAgICAgICAgICAgICAgbGFzdCA9IHh5egogICAgICAgICAgICAgIH0gcmVwZWF0OwoKMTEvMjEvMjAwNTogbW1hdHVzCgkgICAgW3J1YnkgKyBweXRob25dCgoJICAgIEZpeGVzIGZvciBkaXJlY3RvcnMgKyBwb2ludGVycy4gVGhpcyBpcyBhbiB1Z2x5IHByb2JsZW0gd2l0aG91dCBhbiBlYXN5CgkgICAgc29sdXRpb24uIEJlZm9yZSB3ZSBpZGVudGlmaWVkIHRoaXMgY2FzZSBhcyBwcm9ibGVtYXRpYzoKCgkgICAgICAgICAgdmlydHVhbCBjb25zdCBNeUNsYXNzJiBteV9tZXRob2QoKTsKCiAgICAgICAgICAgIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBhbGwgdGhlIGNhc2VzIHdoZXJlIGEgcG9pbnRlciwgYXJyYXkgb3IKICAgICAgICAgICAgcmVmZXJlbmNlIGlzIHJldHVybmVkLCBhcmUgcHJvYmxlbWF0aWMsIGV2ZW4gZm9yIAoJICAgIHByaW1pdGl2ZSB0eXBlcyAoYXMgaW50LCBkb3VibGUsIGNoYXIqLCBldGMpLgoKCSAgICBUbyB0cnkgdG8gZml4IHRoZSBpc3N1ZSwgYSBuZXcgdHlwZW1hcCB3YXMgYWRkZWQsCgkgICAgJ2RpcmVjdG9yZnJlZScsIHdoaWNoIGlzIHVzZWQgdG8gJ2ZyZWUnIHRoZSByZXNvdXJjZXMKCSAgICBhbGxvY2F0ZWQgZHVyaW5nIHRoZSAnZGlyZWN0b3JvdXQnIHBoYXNlLiBBdCB0aGUgc2FtZQoJICAgIHRpbWUsIGEgcHJpbWl0aXZlIGdhcmJhZ2UgY29sbGVjdG9yIGVuZ2luZSB3YXMgYWRkZWQgdG8KCSAgICBkZWFsIHdpdGggb3JwaGFuZWQgYWRkcmVzc2VzLCB3aGVuIG5lZWRlZC4KCSAgICAKCSAgICBUaGUgc2l0dWF0aW9uIGlzIG11Y2ggYmV0dGVyIG5vdywgYnV0IHN0aWxsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKCSAgICBtZW1vcnkgZXhoYXVzdGF0aW9uIGlmIHJlY3Vyc2lvbiBpcyB1c2VkLgoKCSAgICBTbywgc3RpbGwgeW91IG5lZWQgdG8gYXZvaWQgcmV0dXJuaW5nIHBvaW50ZXJzLCBhcnJheXMgb3IKCSAgICByZWZlcmVuY2VzIHdoZW4gdXNpbmcgZGlyZWN0b3IgbWV0aG9kcy4KCgkgICAgLSBBZGRlZCBzdGRpbnQuaSAtIHR5cGVtYXBzIGZvciBsYXRlc3QgQzk5IGludGVncmFsIHR5cGVzIGZvdW5kIGluIHN0ZGludC5oLgoJICAgIAoxMS8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIHR5cGVzIGFkZGVkIHRvIHdpbmRvd3MuaSwgZWcgVUlOVDgsIFdPUkQsIEJZVEUgZXRjLiAKICAgICAgICAgICAgSW5jbHVkaW5nIHdpbmRvd3MuaSB3aWxsIGFsc28gZW5hYmxlIFNXSUcgdG8gcGFyc2UgdGhlIF9fZGVjbHNwZWMgTWljcm9zb2Z0CiAgICAgICAgICAgIGV4dGVuc2lvbiwgZWcgX19kZWNsc3BlYyhkbGxpbXBvcnQpLiBBbHNvIG90aGVyIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucwogICAgICAgICAgICBzdWNoIGFzIF9fc3RkY2FsbC4KCjExLzEwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgZm9yIFdpbmRvd3MgLSB3aW5kb3dzLmkuIFRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gdXNlZnVsIHR5cGUKICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHVzZXJzIHdobyBpbmNsdWRlIHdpbmRvd3MuaC4gSW5pdGlhbCBzdXBwb3J0IGlzIGZvciB0aGUKICAgICAgICAgICAgbm9uIElTTyBpbnRlZ3JhbCB0eXBlczogX19pbnQ4LCBfX2ludDE2LCBfX2ludDMyLCBfX2ludDY0IGFuZCB1bnNpZ25lZCB2ZXJzaW9ucy4KICAgICAgICAgICAgVGhlIHVuc2lnbmVkIHZlcnNpb25zIHByZXZpb3VzbHkgY291bGQgbm90IGJlIHBhcnNlZCBieSBTV0lHLiAgU0YgIzg3MjAxMy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gUG9ydGFiaWxpdHkgd2FybmluZyBmb3IgZmlsZXMgd2hpY2ggd2lsbCBvdmVyd3JpdGUgZWFjaCBvdGhlciBvbiBjYXNlCiAgICAgICAgICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBzdWNoIGFzIEZBVDMyL05URlMuIFRoaXMgd2lsbCBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdHdvCiAgICAgICAgICAgIGNsYXNzIG5hbWVzIGFyZSB0aGUgc2FtZSBiYXJyaW5nIGNhc2UuIFRoZSB3YXJuaW5nIGlzIGlzc3VlZCBvbiBhbGwgcGxhdGZvcm1zIGFuZAogICAgICAgICAgICBjYW4gYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSB1c3VhbCB3YXJuaW5nIHN1cHByZXNzaW9uIHRlY2huaXF1ZXMuIFNGIGJ1ZyAjMTA4NDUwNy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1weXRob24gLS13aXRoLXJ1YnkgLS13aXRoLXBlcmw1IGV0YyBlbmFibGUgdGhlc2UgbGFuZ3VhZ2VzLAogICAgICAgICAgICBpZSB0aGUgLS13aXRoLXh4eHggb3B0aW9ucywgd2hlcmUgbm8gcGF0aCBpcyBzcGVjaWZpZWQsIHdvcmsgdGhlIHNhbWUgYXMgaWYgCiAgICAgICAgICAgIHRoZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQgYXQgYWxsLiBCYXNlZCBvbiBwYXRjaGVzICMxMzM1MDQyICMxMzI5MDQ4ICMxMzI5MDQ3LgoKMTEvMDkvMjAwNTogZGFuY3kKCgkgICAgW0FsbGVncm9jbF0KCSAgICBBZGQgQysrIHN1cHBvcnQgdG8gdGhlIEFsbGVncm9jbCBtb2R1bGUuIEZ1cnRoZXIKCSAgICBlbmhhbmNlcyB0aGUgQyBzdXBwb3J0IGFzIHdlbGwuIFNvbWUgb2YgdGhlCgkgICAgZmVhdHVyZXM6CgoJICAgIC0gTVVDSCBiZXR0ZXIgZ2VuZXJhdGlvbiBvZiBmb3JlaWduIHR5cGVzIGJhc2VkIG9uCgkgICAgdGhlIEMvQysrIHR5cGVzIGZvciB1c2UgaW4gZGVmaW5pbmcgdGhlIEZGSSBvbgoJICAgIHRoZSBsaXNwIHNpZGUuIFdlIGRvbid0IHBhc3MgZXZlcnl0aGluZyBhcyBhICgqIDp2b2lkKQoJICAgIGFueSBsb25nZXIuCgoJICAgIC0gVXNlcyB0eXBlbWFwcyBmb3IgYmV0dGVyIGNvbnRyb2wgb2YgdHlwZSBjb252ZXJzaW9ucwoJICAgIGFuZCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBsaXNwIGFuZCBjKysgd3JhcHBlcgoJICAgIGNvZGUuCgoJICAgIC0gQ0xPUyB3cmFwcGluZyBvZiBwb2ludGVycyByZXR1cm5lZCBmcm9tIGZvcmVpZ24gc3BhY2UKCSAgICBtYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBwb2ludGVycyBpbiB1c2VyIGNvZGUuCgkgICAgVGhlIHdyYXBwaW5nIG9iamVjdHMgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byBGRiBjYWxscy4KCgkgICAgLSBEZWZ1biB3cmFwcGluZyBvZiBGRiBjYWxscywgYWxsb3dpbmcgZm9yIG1vcmUgbGlzcHkKCSAgICBpbnRlcmZhY2UuIENvbnZlcnNpb24sIEdDaW5nLCBvZiBsaXNwIG9iamVjdHMgdG8gCgkgICAgZm9yZWlnbiBvYmplY3RzIGNhbiBiZSBkb25lIGluIHRoZSB3cmFwcGluZyBkZWZ1biB2aWEKCSAgICB0aGUgdXNlIG9mIHR5cGVtYXBzLgoJICAgIAoJICAgIC0gb3ZlcmxvYWQgZGlzcGF0Y2hpbmcgaW1wbGVtZW50ZWQgb24gdGhlIGxpc3Agc2lkZQoJICAgIHVzaW5nIGdlbmVyaWMgZnVuY3Rpb25zLgoKCSAgICAtIFRlbXBsYXRlcyBhbmQgc3lub255bW91cyB0eXBlcyBzdXBwb3J0ZWQuCgoxMS8wNy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aS1pbmhlcml0YW5jZSBpbgoJICAgIHRoZSBweXRob24gc2lkZSwgaWUsIGlmIHlvdSBoYXZlIHR3byBDKysgd3JhcHBlZCBjbGFzcywgRm9vCgkgICAgYW5kIEJhciwgbm93OgoKCSAgICAgICBjbGFzcyBNeVB5dGhvbkNsYXNzKEZvbyxCYXIpOgoJICAgICAgICAgIC4uLi4KCiAgICAgICAgICAgIHdpbGwgcHJvcGVybHkgd29yaywgZXZlbiB3aXRoIGRpcmVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgRm9vLnRoaXMgYW5kIEJhci50aGlzIHdpbGwgZm9sbG93CiAgICAgICAgICAgIGNvcnJlY3RseS4gQmVmb3JlLCBhIGNsYXNzIGNvdWxkIG9ubHkgaGF2ZSBvbmUgJ3RoaXMnCiAgICAgICAgICAgIGluc3RhbmNlICh1bmxpa2UgQysrKSwgb25seSB0aGUgbGFzdCBiYXNlIGNsYXNzIHdhcwogICAgICAgICAgICBwcm9wZXJseSBkZWxldGVkLCBvciBkZXRlY3RlZCB3aXRoIGRpcmVjdG9ycy4KCgkgICAgTm93ICdzZWxmLnRoaXMnIGNhbiBiZSBhIGxpc3QsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgQysrCgkgICAgaW5zdGFuY2UgcG9pbnRlcnMgZm9yIGFsbCB0aGUgYmFzZSBjbGFzc2VzLgoJICAgIAoJICAgIEFsc28sIHN3aWcudGhpcyBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZSBDKysKCSAgICBpbnN0YW5jZShzKSwgYW5kIHRoZSBfX2RlbF9fIG1ldGhvZCBpcyBub3QgZW1pdHRlZCB1bmxlc3MKCSAgICB0aGUgdXNlciBwcmVwcGVuZC9hcHBlbmQgc29tZSBjb2RlIHRvIGl0LgoKCSAgLSBTd2lnIGNhbiBub3cgZGV0ZWN0IG1lbW9yeSBsZWFrcywgaWUsIGlmIHlvdSBzdGlsbAoJICAgIGRvbid0IHVzZSBwcm94eS9zaGFkb3cgY2xhc3NlcywgYW5kIHR5cGUgc29tZXRoaW5nIGxpa2UKCSAgICAKCSAgICAgICAgIGltcG9ydCBfZXhhbXBsZQoJICAgICAgICAgZiA9IF9leGFtcGxlLm5ld19Gb28oKQoKCSAgICBhbmQgZm9yZ2V0IHRvIGNhbGwgX2V4YW1wbGUuZGVsZXRlX0ZvbyhmKSwgdGhlbiBzd2lnIHdpbGwKCSAgICB0ZWxsIHlvdSB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsuCgoJICAgIE90aGVyd2lzZSwgaWYgeW91IGFsd2F5cyB1c2UgdGhlIHByb3h5IGNsYXNzZXMsIHlvdSBwcm9iYWJseQoJICAgIHlvdSB3aWxsIG5ldmVyIGV2ZXIgc2VlIHRoaXMgd2FybmluZyB1bmxlc3MgdGhlcmUgaXMKCSAgICBzb21ldGhpbmcgd3JvbmcgaW5zaWRlIHRoZSBzd2lnIHdyYXBwaW5nIGNvZGUuCgkgICAgICAgCgkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgSWYgeW91IG92ZXJsb2FkZWQgdGhlIF9fZGVsX18gbWV0aG9kLCBhbmQgY2FsbCB0aGUgYmFzZQoJICAgIG9uZQkgd2l0aG91dCBhIHRyeSBibG9jaywgYXMgaW4KCgkgICAgICAgICAgIGNsYXNzIE15Q2xhc3MoU3dpZ0NsYXNzKToKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgCiAgICAgICAgICAgIHB5dGhvbiBjb3VsZCBjb21wbGFpbiB0aGF0IHRoZSBtZXRob2QgU3dpZ0NsYXNzLl9fZGVsX18gaXMKICAgICAgICAgICAgdW5kZWZpbmVkLiBUcnkgdG8gdXNlIGluc3RlYWQ6CgkgICAgCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIHRyeTogU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICBleGNlcHQ6IHBhc3MKCgkgICAgb3Igc2ltcGx5IAkJICAKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIG1vcmUgZnVuIHRvIFNUTC9TVEQgY29udGFpbmVycywgbm93IHlvdQoJICAgIGNhbiBkbwoKCSAgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PFB5T2JqZWN0ICo+OwkJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3RvcjxQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8UHlPYmplY3QgKixQeU9iamVjdCAqPjsKCSAgICAgICAuLi4uCgoJICAgIFRoZSBzYW1lICBhcHBsaWVzIHRvIHN0ZDo6bGlzdCwgc3RkOjpkZXF1ZSwgc3RkOjptdWx0aXNldCwgZXRjLgoKCSAgICBUaGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUgeW91IGNhbiBkbyBub3c6CgoJICAgICAgICMgQysrIHN0ZDo6dmVjdG9yIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICB2ID0gcHl2ZWN0b3IoWzEsImhlbGxvIiwoMSwyKV0pCgkgICAgICAgcHJpbnQgdlsxXQoJICAgICAgID4+ICdoZWxsbycKCSAgICAgICBwcmludCB2WzJdCgkgICAgICAgPj4gKDEsMikKCSAgICAgICAJCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6c2V0IGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBzID0gcHlzZXQoKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCgxLDIpKQkJICAgCgkgICAgICAgcy5pbnNlcnQoMSkJCQkgICAKCSAgICAgICBzLmluc2VydCgiaGVsbG8iKQoJICAgICAgIHN1bT0oKQoJICAgICAgIGZvciBpIGluIHM6CgkgICAgICAgICBzdW0gKz0oaSwpCgkgICAgICAgcHJpbnQgc3VtCgkgICAgICAgPj4+ICgxLCAnaGVsbG8nLCAoMSwgMikpCgkgICAgICAgCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6bWFwIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBtID0gcHltYXAoKQkJCSAgIAoJICAgICAgIG1bImZvbyJdID0gImhlbGxvIgkJICAgCgkgICAgICAgbVsxXSA9ICgxLDIpCgkgICAgICAgcG0gPSB7fQoJICAgICAgIGZvciBrIGluIG06CSAgICAJICAgCgkgICAgICAgICBwbVtrXSA9IG1ba10KCSAgICAgICBwcmludCBwbQoJICAgICAgID4+PiB7MTogKDEsIDIpLCAnZm9vJzogJ2hlbGxvJ30KCgkgICAgaWUsIHRoZSBTVEQvU1RMIGNvbnRhaW5lcnMgd29yayBhcyByZWFsIG5hdGl2ZSBweXRob24KCSAgICBjb250YWluZXIsIHdpdGggYXJiaXRyYXJ5IGl0ZW0gdHlwZXMgYW5kIHNvLgoKCSAgICBCdXQgc2luY2Ugbm9ybWFsIEMrKyBjb250YWluZXJzIGRvIG5vdCBwcm9wZXJseSByZWYvdW5yZWYKCSAgICB0aGVpciBpdGVtcywgeW91IHNob3VsZCB1c2UgdGhlIHNhZmVyIHZlcnNpb25zOgoJICAgIAoJICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3Rvcjxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPHN3aWc6OlB5T2JqZWN0X3B0ciwgc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8c3dpZzo6UHlPYmplY3RfcHRyLHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAuLi4uCgoJICAgIHdoZXJlIHN3aWc6OlB5T2JqZWN0X3B0ciBpcyBhIFB5T2JqZWN0ICogZW52ZWxvcGUgY2xhc3MgcHJvdmlkZWQKCSAgICB0byBzYWZlbHkgaW5jcmVmL2RlY3JlZiB0aGUgcHl0aG9uIG9iamVjdC4gCgkgICAgCgkgICAgU28sIG5vdyB5b3UgY2FuIHVzZSBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBhcyBuYXRpdmUKCSAgICBQeXRob24gY29udGFpbmVycy4gCgoJICAgIE5vdGUgMTogc3RkOjptYXAsIHN0ZDo6c2V0IGFuZCB0aGUgb3RoZXIgJ29yZGVyZWQnCgkgICAgY29udGFpbmVycyB3aWxsIHByb3Blcmx5IHVzZSBQeU9iamVjdF9Db21wYXJlIGZvciBzb3J0aW5nLAoJICAgIHdoZW4gbmVlZGVkLgoKCSAgICBOb3RlIDI6IGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGhhdmUgYSBsaW1pdCBzaXplIG9mCgkgICAgU0laRV9NQVgsIGllLCB5b3UgY2FuIGhhdmUgbWFuYWdlIGNvbnRhaW5lcnMgbGFyZ2VyIHRoYW4KCSAgICBJTlRfTUFYLCB0aGUgcHl0aG9uIGxpbWl0LgoJICAgIAoJICAgICAgCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXQoJICAgIC0gYWRkICdpdGVyYXRvcigpJyBtZXRob2QgZm9yIGFsbCBzZXF1ZW5jZXMgYW5kIGFkZGl0aW9uYWxseQoJICAgICAgJ2tleV9pdGVyYXRvcigpJyBmb3IgbWFwcy4KCgkgICAgICAnaXRlcmF0b3IoKScgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLgoJICAgICAgQWRkaXRpb25hbGx5LCBpbiBtYXBzLCAna2V5X2l0ZXJhdG9yKCknIHdpbGwgcmV0dXJuIGEgcHl0aG9uCgkgICAgICBpdGVyYXRvciB1c2luZyBvbmx5IHRoZSBtYXAga2V5cy4KCSAgICAgIAoJICAgICAgSW4gZ2VuZXJhbCB0aGUgc2VxdWVuY2UgbWV0aG9kIF9faXRlcl9fIHdpbGwgY2FsbAoJICAgICAgJ2l0ZXJhdG9yKCknLCByZXR1cm5pbmcgdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IsIGJ1dCBpbgoJICAgICAgbWFwcyBpdCB3aWxsIGNhbGwgJ2tleV9pdGVyYXRvcigpJywgbWFpbnRhaW5pbmcKCSAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJICAgICAgSGVuY2UsIGZvciBzdGQ6Om1hcHMsIHlvdSBjYW4gcGxheSB0aGVuIHdpdGggdGhlIG5hdGl2ZQoJICAgICAgQysrIGl0ZXJhdG9yLCB3aGljaCB2YWx1ZSBpcyBhIChrZXksIHZhbHVlKSBwYWlyLCBieQoJICAgICAgY2FsbGluZyBtYXAuaXRlcmF0b3IoKSwgYXMgd2l0aCBtYXAuYmVnaW4oKSwgbWFwLmVuZCgpLCBldGMuCgoJICAgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtYXAuaXRlcmF0b3IoKSByZXR1cm5zIGEgc2FmZQoJICAgICAgJ2Nsb3NlZCcgaXRlcmF0b3IsIHdoaWxlIG1hcC5iZWdpbigpIGFuZCBtYXAuZW5kKCkgYXJlCgkgICAgICAnb3BlbicgaXRlcmF0b3JzLgoKCSAgICAgIEEgJ2Nsb3NlZCcgaXRlcmF0b3Iga25vd3MgdGhlIGJlZ2luIGFuZCB0aGUgZW5kIG9mIHRoZQoJICAgICAgc2VxdWVuY2UsIGFuZCBpdCBuZXZlciBjYW4gc2VnLiBmYXVsdC4gQW4gJ29wZW4nCgkgICAgICBpdGVyYXRvciwgYXMgaW4gQysrLCBjYW4gc2VnLiBmYXVsdCBhdCB0aGUgQysrIHNpZGUuCgoJICAgICAgICAgIyBhIGNsb3NlZCBpdGVyYXRvciBpcyBzYWZlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KCQkgIyB0aGUgbmV4dCgpIG1ldGhvZCB3aWxsIHRocm93IGEgU3RvcEl0ZXJhdGlvbgoJICAgICAgICAgIyBleGNlcHRpb24gYXMgbmVlZGVkCgkKCSAgICAgICAgIGkgPSBzZXEuaXRlcmF0b3IoKQoJCSB0cnk6CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgoJCSAgICAgICAgc3VtICs9IGkubmV4dCgpCgkJIGV4Y2VwdDogcGFzcwoJCSAKCQkgIyBhbiBvcGVuIGl0ZXJhdG9yIGFsd2F5cyBuZWVkIHRvIGJlIGNoZWNrZWQsCgkJICMgb3IgaXQgd2lsbCBjcmFzaCBhdCB0aGUgQysrIHNpZGUKCgkgICAgICAgICBjdXJyZW50ID0gc2VxLmJlZ2luKCkKICAgICAgICAgICAgICAgICBlbmQgPSBzZXEuZW5kKCkKCQkgd2hpbGUgKGN1cnJlbnQgIT0gZW5kKToKCQkgICAgc3VtICs9IGN1cnJlbnQubmV4dCgpCgkgICAgICAKCSAgICAgIAoJICAgIFtQeXRob25dCgkgICAgLSBGaW5hbGx5LCB3aGVuIHdlIGNhbGwgCgoJICAgICAgICBmID0gRm9vKCkKCgkgICAgICB0aGUgY29uc3RydWN0aW9uIGlzICdvbmUtd2F5Jy4gQmVmb3JlIGNvbnN0cnVjdGlvbiAgd2FzIGRvbmUKCSAgICAgIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykgCiAgICAgICAgICAgICAgICAgIG5ld19Gb28oKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKSAKICAgICAgICAgICAgICAgICAgRm9vUHRyKCkgKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgd2FzIGRvbmUgbGlrZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pCiAgICAgICAgICAgICAgICAgIEZvb1B0cihweXRob24pIC0+IEZvbygpIChweXRob24pCiAgICAgICAgICAgICAgICAgIAkJICAKCgkgICAgICBpZSwgd2Ugd2hlbiBnb2luZyBiYWNrIGFuZCBmb3J3YXJkIGJldHdlZW4gdGhlIEMrKyBhbmQKCSAgICAgIHB5dGhvbiBzaWRlLgoKCSAgICAgIE5vdyBzaW5jZSB0aGVyZSBpcyBubyBGb29QdHIgdGhlIGNvbnN0cnVjdGlvbiBwcm9jZXNzIGlzCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykKICAgICAgICAgICAgICAgICAgX25ld19Gb28oKSAoQysrKSAtPiBOZXdQb2ludGVyT2JqKCkgKEMrKykgKG5vIHNoYWRvdyBjbGFzcykKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgaXMgZG9uZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspICh3aXRoIHNoYWRvdyBjbGFzcykgLT4gTmV3SW5zdGFjZU9iaigpIChDKyspCgoJICAgICAgd2hlcmUgTmV3SW5zdGFuY2VPYmogY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRob3V0CgkgICAgICBjYWxsaW5nIF9faW5pdF9fIGFuZCBpdCBkb2Vzbid0IGdvICdiYWNrJyB0byBweXRob24sIGlzCgkgICAgICAncHVyZScgQyBBUEkuCgoJICAgICAtIFdpdGggdGhpcyBjaGFuZ2UsIGFuZCB0aGUgb3RoZXIgb25lcyBpbiB0aGUKICAgICAgICAgICAgICAgUHlTd2lnT2JqZWN0IHR5cGUsIHdoaWNoIG5vdyBjYXJyaWVzIHRoZSB0aGlzb3duIGFuZAogICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyBwb2ludGVyLCB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGJlIGFzCiAgICAgICAgICAgICAgIGZhc3QgYXMgYm9vc3Q6OlB5dGhvbiBhbmQvb3IgdGhlIG90aGVyIHB5dGhvbiB3cmFwcGVycwogICAgICAgICAgICAgICBiYXNlZCBpbiBwdXJlIFB5dGhvbi9DIEFQSSBjYWxscy4KCgkgICAgICAgQXMgYSByZWZlcmVuY2UsIHRoZSBwcm9maWxldGVzdF9ydW5tZS5weSBleGFtcGxlLCB3aGljaAoJICAgICAgIGRvZXMgYSBzaW1wbGUgY2FsbCBmdW5jdGlvbiBtYW55IHRpbWVzLCBzdWNoIGFzIHRoaXMgY29kZToKCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGV0ZXN0ICAgICAgIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJICAgIGEgPSBwcm9maWxldGVzdC5BKCkgICAgICAKCQkgICAgYiA9IHByb2ZpbGV0ZXN0LkIoKSAgICAgIAoJCSAgICBmb3IgaSBpbiByYW5nZSgwLDEwMDAwMDApCgkgICAgICAgICAgICAgIGEgPSBiLmZuKGEpICAgICAgICAgICAgCgoKCSAgICAgICB3aGVyZSBmbiBpcyBkZWZpbmVkIGFzICdBKiBCOjpmbihBICphKSB7cmV0dXJuIGE7fScsCgkgICAgICAgcHJvZHVjZXMgIHRoZSBmb2xsb3dpbmcgdGltZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub21vZGVybiAgICBtb2Rlcm4KCSAgICAgICAgIHN3aWctMS4zLjI2ICAgIDE5LjcwcyAgICAgIDUuOThzCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuOTlzICAgICAgMC45OHMKCSAgICAgICAKCgkgICAgICAgQ2xlYXJseSwgdGhlcmUgaXMgYSBsYXJnZSBpbXByb3ZlbWVudCBmb3IgdGhlIHB5dGhvbgoJICAgICAgICdub21vZGVybicgbW9kZS4gU3RpbGwsIHRoZSAnbW9kZXJuJyBtb2RlIGlzIGFyb3VuZAoJICAgICAgIDYgdGltZXMgZmFzdGVyIHRoYW4gYmVmb3JlLiBGb3IgdGhlIHNhbWUgdGVzdCwgYnV0CgkgICAgICAgdXNpbmcgdGhlIG5vbi1zaGFkb3cgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCB3ZSBnZXQKCgkgICAgICAgICAgICAgICAgICAgICAgIF9wcm9maWxldGVzdCAobm9uLXNoYWRvdykKCSAgICAgICAgIHN3aWctMS4zLjI2ICAgICAwLjgwcyAKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC42MHMgCgoJICAgICAgIEhlbmNlLCBub3cgZm9yIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIHByb3h5IG92ZXJoZWFkCgkgICAgICAgaXMgaW5zaWduaWZpY2FudC4KCgkgICAgICAgTm90ZSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBudW1iZXJzIHdlIGFyZSBzaG93aW5nIGlzIGZvcgoJICAgICAgIGEgc2ltcGxlIG1vZHVsZSAodHdvIHR5cGVzKSBhbmQgYSBzaW1wbGUgZnVuY3Rpb24gKG9uZQoJICAgICAgIGFyZ3VtZW50KS4gRm9yIHJlYWwgc2l0dWF0aW9ucywgZm9yIG1vZHVsZXMgd2l0aCBtYW55CgkgICAgICAgbW9yZSB0eXBlcyBhbmQvb3IgZnVuY3Rpb25zIHdpdGggbWFueSBtb3JlIHBhcmFtZXRlcnMsCgkgICAgICAgeW91IHdpbGwgc2VlIGV2ZW4gYmV0dGVyIHJlc3VsdHMuCgkgICAgICAgCgkJICAJICAgICAgCjEwLzMxLzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dCgoJICAgIC0gRmluYWxseSwgbm8gbW9yZSBDbGFzc1B0ciBwcm94eSBjbGFzc2VzLiBZb3Ugd2lsbCBzZWUKCSAgICAgIG9ubHkgYSBjbGVhbiBDbGFzcyBwcm94eSBjbGFzcyBpbiB0aGUgLnB5IGZpbGUuCgoJICAgIC0gTm8gbW9yZSAncmVhbCcgdGhpc293biBhdHRyaWJ1dGUgZWl0aGVyLCB0aGUgUHlTd2lnT2JqZWN0IG5vdwogICAgICAgICAgICAgIGNhcnJpZXMgdGhlIG93bmVyc2hpcCBpbmZvLgoKCSAgICAgIFlvdSBjYW4gYWxzbyBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoJCSAgCgkJICBzZWxmLnRoaXMuZGlzb3duKCkKCQkgIHNlbGYudGhpcy5vd24oMCkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzLmFjcXVpcmUoKQoJCSAgc2VsZi50aGlzLm93bigxKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgoJICAgICAgU3RpbGwgdGhlIG9sZCB3YXksCgkgICAgICAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgoJCSAgc2VsZi50aGlzb3duID0gMAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpc293biA9IDEKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgogICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCwgYW5kIHB5dGhvbiBkaXNwYXRjaGVzIHRoZSBwcm9wZXIgbWV0aG9kCiAgICAgICAgICAgICAgY2FsbHMgYXMgbmVlZGVkLiAJCSAgCgkgICAgICAgCgoJICAgIC0gU3VwcG9ydCBmb3IgaXRlcmF0b3JzIGluIFNUTC9TVEQgY29udGFpbmVycywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZTxzZXRfc3RyaW5nPiBzdGQ6OnNldDxzdGQ6OnN0cmluZz47CgkgICAgICAgICAgCiAgICAgICAgICAgICAgIHlvdSBjYW4gdXNlIHRoZSBDKysgaXRlcmF0b3JzIGFzOiAgCgogICAgICAgICAgICAgICAgICAgICBzID0gc2V0X3N0cmluZygpCgkJICAgICAgICAgICAgICAgICAgICAgCgkJICAgICBzLmFwcGVuZCgiYyIpICAgCgkJICAgICBzLmFwcGVuZCgiYSIpICAgCgkgICAgICAgICAgICAgcy5hcHBlbmQoImIiKQoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImFiYyIgCgoJCWFkdmFuY2UgdGhlIGl0ZXJhdG9yIGFzIGluIEMrKwoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgY3VycmVudCArPSAxCiAgICAgICAgICAgICAgICAgICAgIHByaW50IGN1cnJlbnQudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgCgkJbm93IHVzaW5nIHRoZSByZXZlcnNlIG9wZXJhdG9ycwoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMucmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLnJlbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCgkgICAgICAgIG9yIHRoZSAncHJldmlvdXMnIG1ldGhvZAoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGUucHJldmlvdXMoKQogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCiAgICAgICAgICAgICAgICBvciBqdXN0IGFzIGluIGEgcHl0aG9uIGZhc2hpb24KCiAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgTm90ZSAxOiBJdGVyYXRvcnMgaW4gQysrIGFyZSB2ZXJ5IHBvd2VyZnVsLCBidXQKICAgICAgICAgICAgICAgIGRhbmdlcm91cyB0b28uIEFuZCBpbiBweXRob24geW91IGNhbiBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdAogICAgICAgICAgICAgICAganVzdCBsaWtlIGluIEMrKywgc28sIGJlIGNhcmVmdWwuCgkJCgkJTm90ZSAyOiB0aGUgaXRlcmF0b3JzIGFyZSAnbGlnaHQnLCBpZSwgdGhleSBkbyBub3QKCQljb252ZXJ0IHNlcXVlbmNlIGVsZW1lbnRzIHVudGlsIHlvdSByZXF1ZXN0IHRvIGRvIHNvLCB2aWEKCQluZXh0KCksIHZhbHVlKCkgb3IgcHJldmlvdXMoKS4gSWYgeW91IGp1c3QgaW5jcmVtZW50L2RlY3JlbWVudCBvbmUKCQlubyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCSAgICAgICAgICAgICBiICs9IDEKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKCkKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKDIpCgkJICAgICBiLmRlY3IoMikKICAgICAgICAgICAgICAgICAgICAgYi5kZWNyKCkKICAgICAgICAgICAgICAgICAgICAgYiAtPSAxCgoJCSBvbmx5IHRoZSBpdGVyYXRvciBpcyBtb2RpZmllZCwgYW5kIG5vdCB2YWx1ZSB3cmFwcGVyCgkJIGlzIGdlbmVyYXRlZC4gT3RoZXIgdHlwaWNhbCBDKysgb3BlcmF0aW9ucyBhcmUgYWxzbyAKCQkgYXZhaWxhYmxlLCBzdWNoIGFzOgoKCQkgICAgIHByaW50IHMuZW5kKCkgLSBzLmJlZ2luKCkKCQkgICAgID4+PiAzCgkJICAgICBmID0gcy5iZWdpbigpICsgMQoJCSAgICAgcHJpbnQgZi52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICBsID0gcy5lbmQoKSAtIDEKCQkgICAgIHByaW50IGwudmFsdWUoKQoJCSAgICAgPj4+ICJjIgoJCSAKCQkgZXRjLiAgT2YgY291cnNlLCB0aGUgJ2ZpbmQnLCAnaW5zZXJ0JywgJ2VyYXNlJywgYW5kCgkJIHNvIG9uIG1ldGhvZHMgYWxzbyBzdXBwb3J0cyBpdGVyYXRvcnMgbm93LCBpZToKCgkJICAgICAgaSA9IHMuYmVnaW4oKQoJCSAgICAgIGkgKz0gMQoJCSAgICAgIHMuZXJhc2UoaSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaQoJCSAgICAgIHByaW50IHN1bQoJCSAgICAgID4+PiAiYWMiCgkJICAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGVyZSBpcyBubyBtb3JlICd0aGlzb3duJyBhdHRyaWJ1dGUuIElmIHlvdSB1c2UgaXQsIHB5dGhvbgoJICAgIHdpbGwgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnRoaXNvd24pOiAgID09PiAgIGlmIChzZWxmLnRoaXMub3duKCkpOgoJCXNlbGYudGhpc293biA9IDEgICAgID09PiAgIHNlbGYudGhpcy5vd24oMSkKICAgICAgICAgICAgICAgIHNlbGYudGhpc293biA9IDAgICAgID09PiAgIHNlbGYudGhpcy5vd24oMCkKCgkgICAgU3RpbGwsIG1heWJlIGluIHNvbWUgdW51c3VhbCBjYXNlcyB0aGUgdHJhbnNsYXRpb24gd2lsbCBub3QgYmUKCSAgICAxMDAlIGNvcnJlY3QsIHNvIGlmIHlvdSBoYXZlIGEgcHJvYmxlbSwgcGxlYXNlIHJlcG9ydCBpdAoJICAgIGFuZC9vciB1c2UgdGhlIG5ldyAnc2VsZi50aGlzLm93bigpJyBhY2Nlc3Nvci4KCSAgICAKCSAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgVGhlcmUgaXMgbm8gbW9yZSBDbGFzc1B0ciBjbGFzc2VzIGluIHRoZSBweXRob24gY29kZS4gSGVuY2UsCgkgICAgaWYgaW4gdGhlIHBhc3QgeW91IG5lZWRlZCB0byByZXNvcnQgdG8gc29tZSBraW5kIG9mIHRyaWNrZXJ5CgkgICAgd2l0aCB0aGVtLCBvciBvdmVyY29tZSB0aGVpciBwcmVzZW5jZSwgaXQgaXMgbm8gbG9uZ2VyCgkgICAgcmVxdWlyZWQsIGJ1dCB0aGUgZXh0cmEgY29kZSB5b3UgYWRkZWQgY291bGQgbm93IGJyZWFrCgkgICAgdGhpbmdzLgoKCSAgICBJZiBuZWVkZWQsIHlvdSBjYW4gdXNlIHRoZSBvcHRpb24gLWNsYXNzcHRyLCBpLmUuLAoKICAgICAgICAgICAgICAgc3dpZyAtY2xhc3NwdHIgLXB5dGhvbiAuLi4KCgkgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBDbGFzc1B0ciBjbGFzc2VzLgoKCjEwLzMwLzIwMDU6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBNYWtlIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGxpbmthZ2Ugb2YgU1dJR19pbml0IGNvbnNpc3RlbnQuICAKCSAgICBSZXBvcnRlZCBieSBTdGV2ZW4gRy4gSm9obnNvbiAoU0YgcGF0Y2ggMTMxNTQ5OCkuCgoxMC8yNi8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIGdsb2JhbCBsaWJyYXJ5IGRpcmVjdG9yLgoJICAgIE5vdyBpdCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCB1c2UKCSAgICB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgYXMgd2VsbC4KCgkgICAgU28sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAlaW5jbHVkZSBhdHRyaWJ1dGUuaQoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZShBLCBpbnQsIGEsIGdldF9hLCBzZXRfYSk7CgkgICAgICAgCQkJCSAgICAgIAkgIAoJICAgICAgIHN0cnVjdCBBCQkJICAgICAgCSAgCgkgICAgICAgeyAgICAJCQkJICAKCSAgICAgICAgIGludCBnZXRfYSgpIGNvbnN0OyAJCSAgCgkgICAgICAgICB2b2lkIHNldF9hKGludCBhYSk7IAkJICAKCSAgICAgICB9OwkJCQkgIAoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQiwgaW50LCBjKTsKCSAgICAgICAJCQkJCgkgICAgICAgc3RydWN0IEIJCQkKCSAgICAgICB7ICAgIAkJCQoJICAgICAgICAgaW50JiBjKCk7IAkJCgkgICAgICAgfTsgCgoJICAgIHRoZW4gaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0aGUgJ0EuYScgYW5kICdCLmMnIGF0dHJpYnV0ZXMgd2lsbAoJICAgIGJlIHZpc2libGUsIGllLCB5b3UgY2FuIGFjY2VzcyB0aGVtIGFzIHBsYWluIHZhcmlhYmxlczoKCiAgICAgICAgICAgICAgIGYgICA9IEEoKQogICAgICAgICAgICAgICBmLmEgPSAzCiAgICAgICAgICAgICAgIGcgICA9IEIoKQogICAgICAgICAgICAgICBnLmMgPSAzIAogICAgICAgICAgIAoJICAgICAgIGggICA9IGYuYSArIGcuYwoKCSAgICBhbmQgdGhlIHByb3BlciBnZXQvc2V0IG1ldGhvZHMgd2lsbCBiZSBkaXNwYXRjaGVkLiBTZWUKCSAgICBhdHRyaWJ1dGUuaSBmb3IgbW9yZSBpbmZvLgogICAKICAgICAgICAgIC0gTW9yZSBjbGVhbnVwcyBhcm91bmQgYW5kIGFkZGluZyBtb3JlIHRlc3QtY2FzZXMuIFRoZQogICAgICAgICAgICBESVNPV04gdHlwZW1hcCBub3cgaXMgdGVzdGVkIGFuZCB3b3JraW5nIGluIGFsbCB0aGUKICAgICAgICAgICAgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaWUsIHRjbCwKICAgICAgICAgICAgcnVieSwgcGVybCBhbmQgcHl0aG9uLgoJICAgIAoKMTAvMjUvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCwgY29tcGxldGUgdGhlIERJU09XTiB0eXBlbWFwLgoJICAgIAoJICAgIC0gYWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIHVuaWZpZWQgdHlwZW1hcAogICAgICAgICAgICAgIGxpYnJhcnkgKGJlZm9yZSB3YXMgb25seSB1c2FibGUgZnJvbSBweXRob24pLgoKCSAgICAtIHVuaWZ5IHRoZSBuYW1lcyBmb3IgdGhlIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgaW4KCSAgICAgIHBlcmwsdGNsLHJ1YnkgYW5kIHB5dGhvbiwgc28sIHRoZSBhdHRyaWJ1dGUuaSBsaWJyYXJ5CgkgICAgICBjYW4gd29yayBhY3Jvc3MgdGhlbS4KCSAgICAgIAoJICAgIC0gc2VlIHRoZSBsaV9hdHRyaWJ1dGUuaSB0ZXN0LWNhc2Ugb3IgdGhlIGxpYnJhcnkgZmlsZQoKIAkgICAgICAgIExpYi90eXBlbWFwcy9hdHRyaWJ1dGUuc3dnCgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm8gYWJvdXQgaG93IHRvIHVzZSBpdC4KCiAKCSAgICAgIAoKMTAvMjQvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCBub3cgdXNlcyB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkuCgoJICAgIC0gQ2hhbmdlcyBpbiBydWJ5IHRvIHVzZSB0aGUgJHRyYWNrIG9wdGlvbiBpbiB0eXBlbWFwcy4KCgkgICAgLSBDaGFuZ2VzIGluIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSB0byBmb2xsb3cgdGhlCgkgICAgICBjb252ZW50aW9uIHRoYXQgYWxsIG1hY3JvcyB0aGF0IGFyZSBub3QgdXNlZCBpbiB0aGUKCSAgICAgIEMvQysrIHNpZGUgc3RhcnRzIHdpdGggJSwgc3VjaCBhcwoKCSAgICAgICAgICAgJWRlbGV0ZQoJCSAgICVuZXdfYXJyYXkKCiAgICAgICAgICAgICAgZXRjLgoJICAgICAgCgkgICAgLSBEb2N1bWVudGluZyBmcmFnbWVudHMsIHNlZSBmcmFnbWVudHMuc3dnLgoKCSAgICAtIENsZWFuZXIgd2F5IHRvIHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGluY2x1ZGUKCSAgICAgIGp1c3QgPHR5cGVtYXBzL3N3aWd0eXBlcy5zd2c+LgoKCSAgICAgIENoZWNrIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IHBlcmwsIHRjbCwgcnVieSwKCSAgICAgIHB5dGhvbi4KCgkgICAgICBBbHdheXMgc3RhcnQgd2l0aCB0aGUgaGVhZCBmaWxlLCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dGhvbi5zd2cKCSAgICAgICAgIHRjbC90Y2w4LnN3ZwoJICAgICAgICAgcnVieS9ydWJ5LnN3ZwoJICAgICAgICAgcGVybDUvcGVybDUuc3dnCgogICAgICAgICAgICAgIGFuZCB0aGUgcHJpbmNpcGFsIGZpbGUgdGhhdCBpbnZva2VzIHRoZSB1bmlmaWVkIGxpYnJhcnksIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgdGNsL3RjbHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBydWJ5L3J1Ynl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcGVybC9wZXJsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAKCSAgICAgIFRoZSBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIGVhY2gKCSAgICAgIGxhbmd1YWdlIGFyZSB0aGUgb25lIHRoYXQgcHJvdmlkZXMgdGhlIGJhc2ljIHR5cGVzOgoKCSAgICAgICAgIHB5dGhvbi9weXByaW10eXBlcy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgdGNsL3RjbHByaW10eXBlcy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJscHJpbXR5cGVzLnN3ZwoKCSAgICAgIGFuZCB0aGUgc3RyaW5nIG1hbmlwdWxhdGlvbjogIAkgCgkgICAgCgkgICAgICAgICBweXRob24vcHlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXN0cmluZ3Muc3dnCQoJICAgICAgICAgdGNsL3RjbHN0cmluZ3Muc3dnCQoJICAgICAgICAgcGVybDUvcGVybHN0cmluZ3Muc3dnCgoJCSAKCSAgICAgIFRoZSByZXN0IG9mIHRoZSBmaWxlcywgc3VjaCBhcyBjYXJyYXkuaSwgYXJlIG1vc3RseSBvbmUgCgkgICAgICBsaW5lIGZpbGVzIHRoYXQgaW5jbHVkZSB0aGUgcHJvcGVyIHR5cGVtYXAgbGlicmFyeQoJICAgICAgdmVyc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFBlcmwgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBleHBlY3RlZCBiZWhhdmlvciBpbiBQZXJsLgoKMTAvMjMvMjAwNTogd3V6emViCiAgICAgICAgICAgIENoaWNrZW46CiAgICAgICAgICAgICAgKyBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGZpbmFsbHkgd29yayBwcm9wZXJseQogICAgICAgICAgICAgICsgYWRkIHRlc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNwcF9iYXNpYy5pCgoxMC8yMC8yMDA1OiBkYW5jeQoJICAgIFthbGxlZ3JvY2xdIEFkZGVkIEMrKyBzdXBwb3J0LiBMYXJnZSB1cGRhdGUsIG1hbnkgY2hhbmdlcy4gU2VlCgkgICAgbmV3bHkgYWRkZWQgQWxsZWdybyBDb21tb24gTGlzcCBzZWN0aW9uIGluIGxpc3AuaHRtbAoKMTAvMjAvMjAwNTogbW1hdHVzCgkgICAgUnVieSwgVGNsLCBQeXRob246CgoJICAgIC0gVW5pZm9ybSB3YXkgdG8gZmFpbCAobGFiZWwgZmFpbDopLCBub3cgZmluYWxseQoJICAgICAgU1dJR19leGNlcHRpb24gd29ya3MgYWNyb3NzIHRoZSB0aHJlZSBsYW5ndWFnZXMgYW5kIGFsbAoJICAgICAgdGhlIHR5cGVtYXBzLgoKCSAgICAtIEFkZCBwcm9wZXIgY2xlYW51cCBjb2RlIHRvIHJ1YnkKCgkgICAgLSBNb3JlIHZhbGdyaW5kIGZpeGVzCgoJICAgIC0gU2ltcGxpZnkgdGhlIGlubGluZSB1c2UsIGl0IHNlZW1zIGEgc21hbGwgaW50ZXJmYWNlIG9mCgkgICAgICAyMCwwMDAgbGluZXMgKHBsdXMgbWFueSBtYW55IHRlbXBsYXRlcykgY2FuIGJyZWFrIAoJICAgICAgZ2NjIC1PMyBlYXNpbHkuCgoJICAgIC0gRmluYWxpemUgdGhlIHR5cGVtYXBzIGxpYnJhcnkuIEFsbCB0aGUgb2xkICAqLmkgZmlsZXMKCSAgICAgIChjYXJyYXkuaSwgY3BvaW50ZXIuaSwgZXhjZXB0aW9uLmkpIGhhZCBiZWVuIGltcGxlbWVudGVkCgkgICAgICBpbiB0aGUgbmV3IHR5cGVtYXBzIGxpYnJhcnkuCgkgICAgCgoxMC8xOS8yMDA1OiB3dXp6ZWIKCSAgICBVcGRhdGUgdGhlIFJ1bnRpbWUgVHlwZW1hcCBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwKCjEwLzE4LzIwMDU6IHd1enplYgoJICAgIENoaWNrZW46CgkgICAgICAtIENvcnJlY3RseSBoYW5kbGUgJWlnbm9yZWQgY2xhc3NlcwogICAgICAgICAgICAgIC0gQ29ycmVjdGx5IGNvbnZlcnQgbG9uZywgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nLCBldGMKICAgICAgICAgICAgICAgIHRvIGNoaWNrZW4gcHJpbWl0aXZlcy4gKFRoYW5rcyB0byBGZWxpeCBXaW5rZWxtYW5uKQogICAgICAgICAgICAgIC0gVXNpbmcgYXJnb3V0IHBhcmFtZXRlcnMgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIHdhcyBhCiAgICAgICAgICAgICAgICB3cmFwcGVkIHBvaW50ZXIgY2F1c2VkIGEgbWVtb3J5IGNvcnJ1cHRpb24uICBUaGUgY2hpY2tlbgogICAgICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3IgbW92ZWQgYSBwb2ludGVyIG91dCBmcm9tIHVuZGVyIHVzLgogICAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYnkgcnVubmluZyBhbGwgdGhlIHByb3h5IGNyZWF0aW9uCiAgICAgICAgICAgICAgICBmdW5jdGlvbnMgYXMgY29udGludWF0aW9ucyBhZnRlciB0aGUgd3JhcHBlciBmdW5jdGlvbgogICAgICAgICAgICAgICAgcmV0dXJucy4gIEFzIHBhcnQgb2YgdGhpcywgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlCiAgICAgICAgICAgICAgICBjaGlja2VuZmFzdHByb3h5IGZsYWcgb24gb3V0cHV0IHR5cGVtYXBzLgogICAgICAgICAgICAgIC0gdXNpbmcgLXByb3h5IGFuZCAtbm9jb2xsZWN0aW9uIHRvZ2V0aGVyIHdvcmtzIG5vdwogICAgICAgICAgICAgICAgQmVmb3JlLCBpdCB3YXMgbm90IGV4cG9ydGluZyB0aGUgZGVzdHJ1Y3RvciBpbiB0aGUgcHJveHkKICAgICAgICAgICAgICAgIHdyYXBwZXIuCgoxMC8xOC8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBBZGRlZCB0aGUgVW5pZmllZCBUeXBlbWFwIExpYnJhcnkgKFVUTCkuIEl0IHVuaWZpZXMgdGhlIHR5cGVtYXBzIGZvcgoKIAkgICAgICAgIHB5dGhvbiwgcnVieSwgdGNsCgoJICAgIGFuZCBpbiB0aGUgcHJvY2VzcywgZml4ZXMgc2V2ZXJhbCBwcm9ibGVtcyBpbiBlYWNoIG9mIHRoZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0byB3b3JrIGluIGEgImNhbm9uaWNhbCIgd2F5IG5vdyBlc3RhYmxpc2hlZCBpbgoJICAgIHRoZSB0eXBlbWFwIGxpYnJhcnkKCSAgICAKCSAgICAgICBTV0lHL0xpYi90eXBlbXBhcwoKCSAgICBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVuaWZpY2F0aW9uIGlzIHRoYXQgZXZlcnl0aGluZwoJICAgIGNvbXBpbGVzIGFuZCBydW5zIGluc2lkZSB0aGUgdGVzdC1zdWl0ZSBhbmQgZXhhbXBsZXMKCSAgICBkaXJlY3Rvcmllcy4gQW5kIGZvciB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRoYW4gcGFzcyB0aGUgcHJpbWl0aXZlX3R5cGVzLmkgY2FzZS4KCgkgICAgQWxzbywgd2UgaGF2ZSBhIHVuaWZvcm0gd2F5IHRvIHRyZWF0IHRoZSBlcnJvcnMsIGZvciBleGFtcGxlCgkgICAgaWYgeW91IGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgPj4+IGZyb20gcHJpbWl0aXZlX3R5cGVzIGltcG9ydCAqCiAgICAgICAgICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMCkKICAgICAgICAgICAgICAxMAoJICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMDAwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToJCSAgICAgIAoJICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CQkJICAgIAoJICAgICAgT3ZlcmZsb3dFcnJvcjogaW4gYXJndW1lbnQgMSBvZiB0eXBlICd1bnNpZ25lZCBjaGFyJwoKCSAgICB5b3UgZ2V0IHRoZSBzYW1lIGV4Y2VwdGlvbiBpbiBhbGwgdGhlIHRocmVlIGxhbmd1YWdlcy4KCSAgICAKCSAgICBBbmQgd2VsbCwgbWFueSBtb3JlIGdvb2QgdGhpbmdzIHdpbGwgY29tZSBmcm9tIHRoaXMKCSAgICB1bmlmaWNhdGlvbiwgZm9yIGV4YW1wbGUsIHByb3BlciBzdXBwb3J0IG9mIHRoZSBTVEwvU1REIGNsYXNzZXMKCSAgICBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCBob3BlZnVsbHksIHdlIGNhbiBrZWVwCgkgICAgYWRkaW5nIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgVGhlIGhhcmRlc3QgcGFydCwgd3JpdGluZyBhIGNvbW1vbiB0eXBlbWFwIGxpYnJhcnkKCSAgICB0aGF0IHN1aXRlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGxhbmd1YWdlcywgaXMgZG9uZSwKCSAgICBhbmQgYWRkaW5nIGFub3RoZXIgbGFuZ3VhZ2Ugc2hvdWxkIG5vdyBiZSBlYXN5LiAKCgkgICAgU3RpbGwgdGhlIGdsb2JhbCB1bmlmaWNhdGlvbiBpcyBub3QgY29tcGxldGUsIHRoZSBTVEwvU1REIAoJICAgIHBhcnQgaXMgbmV4dCwgYW5kIHByb2JhYmx5IGFzIHdlbGwgYXMgYWRkaW5nIG9uZSBvciB0d28gbW9yZQoJICAgIGxhbmd1YWdlcy4KCgkgICAgSWYgeW91IGFyZSBjdXJpb3VzLCBsb29rIGF0IHRoZSBweXRob24sIHJ1YnkgYW5kL29yIHRjbAoJICAgIGRpcmVjdG9yaWVzIHRvIHNlZSB3aGF0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBuZXcKCSAgICBjb21tb24gdHlwZW1hcHMgbGlicmFyeS4gIFN0aWxsLCB0aGUgZmluYWwgd2F5IHRvCgkgICAgaW50ZWdyYXRlIGEgbmV3IGxhbmd1YWdlIGNvdWxkIGNoYW5nZSBhcyB3ZSBtb3ZlIHRvCgkgICAgaW50ZWdyYXRlIHRoZSBTVEQvU1RMLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUnVieS9UY2wgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBiZWhhdmlvciwgc3BlY2lhbGx5IGluIHJ1YnkgYW5kIHRjbC4KClZlcnNpb24gMS4zLjI3IChPY3RvYmVyIDE1LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHR5cGVzYWZlIGVudW0gd3JhcHBpbmcgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwogICAgICAgICAgICBvdmVybG9hZCBhIG1ldGhvZCB3aXRoIDIgZGlmZmVyZW50IGVudW0gdHlwZXMuCgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVmZWF0dXJlKCJpbW11dGFibGUiLCIwIikgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBzZXR0ZXJzCiAgICAgICAgICAgIGZvciBjb25zdGFudHMuCgogICAgICAgICAgICBSZXN0b3JlZCAlaW1tdXRhYmxlIGFuZCAlbWFrZWRlZmF1bHQgdG8gY2xlYXIgdGhlIGZlYXR1cmUgYXMgaXQKICAgICAgICAgICAgYmVoYXZlZCBpbiBTV0lHLTEuMy4yNSBhbmQgZWFybGllci4KCjEwLzE0LzIwMDU6IG1tYXR1cwogICAgICAgICAgICBGaXggYnVnIGluIGFub255bW91cyB0eXBlZGVmIHN0cnVjdHVyZXMgd2hpY2ggd2FzIGxlYWRpbmcgdG8KICAgICAgICAgICAgc3RyYW5nZSBiZWhhdmlvdXIuCgoxMC8xMy8yMDA1OiBtbWF0dXMKCSAgICBTZXZlcmFsIG1pbm9yIGNoYW5nZXM6CgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSB3Y2hhcl90IHR5cGUgc3VwcG9ydAoJICAgIC0gQWRkIGEgd2FybmluZyBmb3Igd2hlbiB5b3UgZGVmaW5lIHRoZSAnaW4nIHR5cGVtYXAgYnV0CgkgICAgICB5b3UgZG9uJ3QgZGVmaW5lIHRoZSAndHlwZWNoZWNrJyBvbmUuIFZlcnkgY29tbW9uIG1pc3Rha2UuCgkgICAgLSBBZGQgcHJvcGVyIGRlZmF1bHQgcnVsZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMsIG5vdyB5b3UKCSAgICAgIGNhbiBkZWZpbmUgYSB0eXBlbWFwIHN1Y2ggYXM6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICgoKikoQU5ZKSkgey4uLn0KCgkgICAgICBUaGF0IHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBwb2ludGVyIHRvIGZ1bmN0aW9ucy4gVGhlCgkgICAgICBydWxlIGluIEMrKyBhbHNvIGFwcGx5IHRvIHRoZSBmdW5jdGlvbiAncmVmZXJlbmNlJywgaWUsCgkgICAgICBpbiBib3RoIGNhc2VzCgoJICAgICAgICB0eXBlZGVmICBpbnQgKCpmcHRyKShpbnQgYSk7CgkgICAgICAgIHR5cGVkZWYgIGludCAoZnVuYykoaW50IGEpOwoKCSAgICAgIFRoaXMgd2FzIG5lZWRlZCBzaW5jZSBpdCBzZWVtcyB0byBiZSAnaWxsZWdhbCcgaW4gQysrIHRvCgkgICAgICBkbyBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGZwdHIpOwoKCSAgICAgIGFuZCBwcm9iYWJseSwgYXMgZm9yIG1lbWJlciBmdW5jdGlvbnMsIGl0IGlzIG5vdAoJICAgICAgd2FycmFudGllZCB0aGF0IHRoZSBwb2ludGVyIHNpemVzIHdpbGwgbWF0Y2guCgoJICAgIC0gQWRkIHRoZSAjZXJyb3IvI3dhcm5pbmcgZGlyZWN0aXZlcyB0byBzd2lnJ3MgY3BwLgoKCSAgICAtIEFkZCB0aGUgbm9ibG9jayBvcHRpb24gZm9yIHR5cGVtYXBzLCB3aGljaCBpcyB1c2VkIGFzCiAgICAgICAgICAgICAgZm9sbG93czogc3VwcG9zZWQgeW91IGEgdHlwZW1hcCwgbGlrZSB0aGlzCgoJICAgICAgCgkgICAgICAldHlwZW1hcChpbixub2Jsb2NrPTEpIEhlbGxvIHsJCQkgICAKCSAgICAgICAgIC4uLi4KICAgICAgICAgICAgICB9CgoJICAgICAgdGhlbiB0aGUgdHlwZW1hcCB3aWxsIGJlIGluc2VydGVkIHdpdGhvdXQgdGhlIGJsb2NrCgkgICAgICBpbXBvc2VkIGJ5IHRoZSBicmFja2V0cywgc2ltaWxhciB0bwoKCSAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIi4uLiI7CgoJICAgICAgU28sIHdoeSB5b3UgZG9uJ3QganVzdCB1c2UgdGhlIHF1b3RlIHN0eWxlPywgYmVjYXVzZToKCSAgICAgIAoJICAgICAgICAgMS4tIFRoZSBxdW90ZSBzdHlsZSBkb2Vzbid0IGdldCBwcmVwcm9jZXNzZWQsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMT0gU1dJR19tYWNybygkMSk7IjsKCSAgICAgIAoJICAgICAgICAgICAgIGhlcmUsIFNXSUdfbWFjcm8gZG9lc24ndCBnZXQgZXhwYW5kZWQKCiAgICAgICAgICAgICAgICAgMi4tIEluc2lkZSBhIHF1b3RlIHR5cGVtYXAsIHlvdSBoYXZlIHRvIHVzZSAKICAgICAgICAgICAgICAgICAgICAgcXVvdGVzIGNhcmVmdWxseQoKCQkgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxID0gXCJoZWxsb1wiICI7CgoJCSAzLi0gWW91IGNhbid0IG1ha2UgZW1hY3MgYW5kL29yIG90aGVyIGVkaXRvcnMKCQkgICAgIHRvIGluZGVudCBpbnNpZGUgYSBzdHJpbmchLiAKCgoJICAgICAgU28sIHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJsb2NrPywgYmVjYXVzZSBhbiBleHRyYQoJICAgICAgYmxvY2sgd2hlbiBub3QgbmVlZGVkIChubyBsb2NhbCB2YXJpYWJsZXMgaW4gaXQpOgoKCSAgICAgICAgICAxLi0gbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQKICAgICAgICAgICAgICAgICAgMi4tIG1ha2VzIHRoZSBjb2RlIGxhcmdlcgogICAgICAgICAgICAgICAgICAzLi0gb3IgaW4gc2hvcnQsIGZvciB0aGUgc2FtZSByZWFzb24gd2UgaGF2ZSB0aGUgcXVvdGUgc3R5bGUuCgpWZXJzaW9uIDEuMy4yNiAoT2N0b2JlciA5LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkZWQgJ3Rocm93cycgdHlwZW1hcHMuCgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlCiAgICAgICAgICAgIGZpcnN0IG5vbi1pZ25vcmVkIGNsYXNzIGluIHRoZSBwdWJsaWMgYmFzZSBjbGFzcyBsaXN0IGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlLgogICAgICAgICAgICBieSB0aGUgcHJveHkgY2xhc3MuIFByZXZpb3VzbHksIGlmIHRoZSBmaXJzdCBjbGFzcyBpbiB0aGUgbGlzdCB3YXMgaWdub3JlZCwgdGhlbgogICAgICAgICAgICB0aGUgcHJveHkgY2xhc3Mgd291bGRuJ3QgaGF2ZSBhbnkgYmFzZSBjbGFzc2VzLgoKMTAvMDcvMjAwNTogbW1hdHVzCgkgICAgIFVwZGF0ZSBtb3JlIGZlYXR1cmVzIHRvIGZvbGxvdyBuZXcgY29udmVudGlvbiwgaW5jbHVkaW5nOgoKCSAgICAgICBjYWxsYmFjawoJICAgICAgIHJlZi91bnJlZgoJICAgICAgIGV4Y2VwdAoJICAgIAoJICAgICBBbGwgb2YgdGhlbSB1c2Ugbm90IG9ubHkgdGhlIGZlYXR1cmUgYXMgYSBmbGFnLCBidXQgYWxzbwoJICAgICBhcyBjb2RlIHZhbHVlLiBUbyBkZWFsIHdpdGggdGhvc2UgZmVhdHVyZXMsIHdlIHVzZSBub3cKCSAgICAgR2V0RmxhZ0F0dHIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gR2V0RmxhZywgYnV0IGluc3RlYWQgb3IKCSAgICAgcmV0dXJuaW5nIDEgb3IgMCwgaXQgcmV0dXJucyB0aGUgYXR0ciB2YWx1ZSwgaWYgaGFwcGVucwoJICAgICB0byBiZSBkaWZmZXJlbnQgb2YgIjAiIG9mIGNvdXJzZS4KCgkgICAgIE5vdyB0aGVyZSBhcmUgYWxzbyBtb3JlIHVuaWZvcm0gZGlyZWN0aXZlIG5hbWVzIGZvciB0aGUgCgkgICAgIG9uZXMgYmFzZWQgaW4gZmVhdHVyZXMsIGZvciBleGFtcGxlLCBmb3IgdGhlIG9sZAoJICAgICAlbmV3b2JqZWN0IGRpcmVjdGl2ZSBub3cgd2UgaGF2ZSB0cmVlIGRpcmVjdGl2ZXMgZGVmaW5lZDoKCSAgICAgCgoJICAgICAjZGVmaW5lICVuZXdvYmplY3QgICAgICAgICVmZWF0dXJlKCJuZXciKQoJICAgICAjZGVmaW5lICVub25ld29iamVjdCAgICAgICVmZWF0dXJlKCJuZXciLCIwIikKCSAgICAgI2RlZmluZSAlY2xlYXJuZXdvYmplY3QgICAlZmVhdHVyZSgibmV3IiwiIikKCgkgICAgIGFuZCBzbyBvbiBmb3IgYWxsIHRoZSBvdGhlciBmZWF0dXJlIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzMwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc29tZSBmZWF0dXJlcy4gUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2FibGUgbWFueQogICAgICAgICAgICBmZWF0dXJlcyBvbmNlIHRoZXkgaGFkIGJlZW4gZW5hYmxlZC4gVGhpcyB3YXMgZm9yIG1vc3QgZmVhdHVyZXMgdGhhdCBiZWhhdmUgYXMKICAgICAgICAgICAgZmxhZ3MuIFRoZXNlIGZlYXR1cmVzIG5vdyB3b3JrIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIikgICAgICAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIxIikgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMCIpICAgICAgICAgLy8gZGlzYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIiKSAgICAgICAgICAvLyBjbGVhcnMgdGhlIGZlYXR1cmUKCiAgICAgICAgICAgIEluIGZhY3QgYW55IG5vbi1lbXB0eSB2YWx1ZSBvdGhlciB0aGFuICIwIiB3aWxsIGVuYWJsZSB0aGUgZmVhdHVyZSAobGlrZSBDIGJvb2xlYW4gbG9naWMpLgogICAgICAgICAgICBQcmV2aW91c2x5ICIxIiwgIjAiIG9yIGFueSBvdGhlciBub24tZW1wdHkgdmFsdWUgd291bGQgZW5hYmxlIHRoZSBmZWF0dXJlIGFuZCBpdCB3b3VsZAogICAgICAgICAgICBvbmx5IGJlIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgYnkgY2xlYXJpbmcgaXQgKGFzc3VtaW5nIHRoZXJlIHdhcyBubyBnbG9iYWwgZW5hYmxlKS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGFmZmVjdGVkOgoKICAgICAgICAgICAgICBhbGxvd2V4Y2VwdAogICAgICAgICAgICAgIGNvbXBhY3RkZWZhdWx0YXJncwogICAgICAgICAgICAgIGNsYXNzaWMgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBjczpjb25zdCAgICAgICAgICAgICAgIChDIykKICAgICAgICAgICAgICBkaXJlY3RvcgogICAgICAgICAgICAgIGV4Y2VwdGlvbmNsYXNzICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBpZ25vcmUKICAgICAgICAgICAgICBpbW11dGFibGUKICAgICAgICAgICAgICBqYXZhOmNvbnN0ICAgICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGphdmE6ZG93bmNhc3QgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAga3dhcmdzCiAgICAgICAgICAgICAgbW9kZXJuICAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5ldwogICAgICAgICAgICAgIG5vYXV0b2RvYyAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBub2RlZmF1bHQKICAgICAgICAgICAgICBub2RpcmVjdG9yCiAgICAgICAgICAgICAgbm9yZWYKICAgICAgICAgICAgICBub3RhYnN0cmFjdAogICAgICAgICAgICAgIG5vdW5yZWYKICAgICAgICAgICAgICBub3ZhbHVld3JhcHBlcgogICAgICAgICAgICAgIHB5dGhvbjptYXliZWNhbGwgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBweXRob246bm9uZHluYW1pYyAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbW9kdWxhMzptdWx0aXJldHZhbCAgICAoTW9kdWxhMykKICAgICAgICAgICAgICBwcmVkaWNhdGUgICAgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHRyYWNrb2JqZWN0cyAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdmFsdWV3cmFwcGVyCgogICAgICAgICAgICBJdCBpcyBub3cgcG9zc2libGUsIGZvciBleGFtcGxlIHRvIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzIGluIGEgaGVhZGVyIGZpbGUsIGV4Y2VwdCBmb3IgYQogICAgICAgICAgICBmZXcgdGFyZ2V0dGVkIG1ldGhvZHMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgc29tZV9mdW5jdGlvbihpbnQsIGRvdWJsZSk7IC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOyAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBDbGFzcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOjptZXRob2Q7ICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAlaW5jbHVkZSAiYmlnaGVhZGVyLmgiCgogICAgICAgICAgICBSZW1vdmVkICVweXRob25keW5hbWljIC0gaXQgbmV2ZXIgd29ya2VkIHByb3Blcmx5LiBVc2UgJXB5dGhvbm5vbmR5bmFtaWMgaW5zdGVhZC4KICAgICAgICAgICAgUmVtb3ZlZCAlZmVhdHVyZSgibm9rd2FyZ3MiKSAtIGl0IHdhc24ndCBmdWxseSBpbXBsZW1lbnRlZCAgLSB1c2UgJWZlYXR1cmUoImt3YXJncyIsIjAiKSBpbnN0ZWFkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8yNS8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBBZGQgInRocm93cyIgdHlwZW1hcHMuCgowOS8yNC8yMDA1OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldIEFkZHMgbmV3ICV0cmFja29iamVjdHMgZnVuY3Rpb25hbGl0eSB0aGF0IG1hcHMgQysrIG9iamVjdHMgdG8KICAgICAgICAgICAgUnVieSBvYmplY3RzLiAgVGhpcyBmdW5jdGlvbmFsaXR5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGltcGxlbWVudAogICAgICAgICAgICBtYXJrIGZ1bmN0aW9ucyBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAgICAgcmVmZXIgdG8gdGhlIHVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KICAgICAgICAgICAgCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXRjaCAxMTE2NDMxIGZyb20gSm9zaCBDaGVycnkuIEZpeGVzIG5vbiBtZW1iZXIgZnVuY3Rpb25zIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgICAgYmVpbmcgY2FsbGVkIGluc3RlYWQgb2YgbWVtYmVyIGZ1bmN0aW9ucy4KCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoIGZyb20gTWFyayBHb3NzYWdlIHRvIGFkZCBzdXBwb3J0IGZvciBMdWEtNS4xLCBzdGQ6OnN0cmluZywKICAgICAgICAgICAgc3RkOjp2ZWN0b3IsIHN0ZDo6ZXhjZXB0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgoKMDkvMTQvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIC1ub2NwcGNhc3QuIE5vdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwoJICAgIGFsd2F5cyB1c2UgdGhlIGNwcGNhc3Qgb3BlcmF0b3JzLiBCZWZvcmUgdGhhdCB3YXMgdGhlIGNhc2UKCSAgICBvbmx5IHdoZW4geW91IHVzZWQgdGhlIC1jcHBjYXN0IG9wdGlvbi4KCiAgICAgICAgICAgIElmIHRoaXMgc2VlbXMgdG8gYnJlYWsgeW91ciBjb2RlLi4uIHlvdXIgd2VsY29tZSEsIGl0CgkgICAgbWVhbnMgaXQgd2FzIGJyb2tlbiBiZWZvcmUsIGFuZCB5b3UgbmV2ZXIgbm90aWNlLiAKCgkgICAgSWYgeW91IHRoaW5nIHRoZSBlcnJvciBpcyBkdWUgdG8gb25lIG9mIHRoZSBTV0lHIHR5cGVtYXBzLAoJICAgIHNlbmQgdXMgYW4gZXhhbXBsZS4KCgkgICAgVXNlIC1ub2NwcGNhc3Qgb25seSB3aXRoIHZlcnkgb2xkIEMrKyBjb21waWxlcnMgdGhhdAoJICAgIGRvIG5vdCBzdXBwb3J0IHRoZSBjcHBjYXN0IG9wZXJhdGlvbnMuIAoKCSAgICBTbywgaGVyZSBhcHBsaWVzOgoKCQlUaGlzIGNoYW5nZSBkb2Vzbid0IGJyZWFrIGNvbXBhdGliaWxpdHksIGl0IHdhcyBicm9rZW4gYmVmb3JlLgoKMDkvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3IgbWV0aG9kcyB3aGVuIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFzIGEKICAgICAgICAgICAgcGFyYW1ldGVyLgoKMDkvMTEvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEFkZGluZyB0aGUgbW9kdWxlIG9wdGlvbiB0byB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIE5vdyB5b3UKICAgICAgICAgICAgY2FuIHVzZSBpdCBhcwoKCSAgICAgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJICAgIHdoZXJlIHN1YmZpbGUgY291bGQgKG9yIG5vdCkgZGVmaW5lIHRoZSBtb2R1bGUgbmFtZSB2aWEKCSAgICB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuIFRoZSBtb2R1bGUgb3B0aW9uIHRha2UgcHJlY2VkZW5jZQoJICAgIGFuZCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0cyB0aGFuIGhhdmluZyB0aGUgZGlyZWN0aXZlIAoKCSAgICAgICAgJW1vZHVsZSBCaWdNb2R1bGUgIAoKCSAgICBpbnNpZGUgdGhlIGltcG9ydGVkIGZpbGUgZm9vLmkuCgoJICAgIFlvdSBjYW4gdXNlIHRoZSBvcHRpb24gaW4gbWFpbmx5IHR3byBjYXNlczoKCgkgICAgMS4tIFlvdSB1c2VkIHRoZSAtbW9kdWxlIG9wdGlvbiB3aGVuIHlvdSBnZW5lcmF0ZWQgdGhlCiAgICAgICAgICAgICAgICBtb2R1bGUgdG8gYmUgaW1wb3J0ZWQsIGFuZCBoZW5jZSB0aGUgbW9kdWxlIG5hbWUgaW4KICAgICAgICAgICAgICAgIHRoZSBpbXBvcnRlZCAlbW9kdWxlIGRpcmVjdGl2ZSBpcyBub3QgcmVhbGx5IHVzZWZ1bC4KCgkgICAgMi4tIFRoZSBtb2R1bGUgeW91IHdhbnQgdG8gaW1wb3J0IGlzIHZlcnkgbGFyZ2UsIGFuZCBpdAogICAgICAgICAgICAgICAgaGFzIHNldmVyYWwgLmkvLmggZmlsZXMuIFRoZW4sIGlmIHlvdSBqdXN0IG9uZSB0bwogICAgICAgICAgICAgICAgaW1wb3J0IGEgY2xhc3Mgb3Igc28gZnJvbSB0aGUgbW9kdWxlLCBzYXlzICdmb28nLCBhbmQKICAgICAgICAgICAgICAgIG5vdCB0aGUgZW50aXJlIG1vZHVsZSB2aWEgaW1wb3J0aW5nIHRoZSBtYWluCiAgICAgICAgICAgICAgICBCaWdNb2R1bGUuaSBmaWxlLCB0aGVuIHlvdSBqdXN0IGRvOgoKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaAoKICAgCSAgICAgICAgb3IKCQkKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCQl3aGVyZSBmb28uaSBjb250YWlucyB0aGUgJ2ZvbycgZGVjbGFyYXRpb24gYW5kIG1heWJlIGEKCQljb3VwbGUgb2YgZXh0cmEgJWluY2x1ZGUgZGlyZWN0aXZlcywgYXMgbmVlZGVkLgoKCSAgICAKMDkvMTEvMjAwNTogbW1hdHVzCgkgICAgRml4IGJ1ZyAjMTI4MjYzNywgYWJvdXQgdGhlIC1tb2R1bGUgb3B0aW9uIG5vdCBoYXZpbmcgZWZmZWN0CgkgICAgaW4gcGxhY2VzIHdoZXJlIGl0IHdhcyBuZWVkZWQuCgowOS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdHlwZW1hcHMgdXNlZCBmb3IgdGhlCiAgICAgICAgICAgIHNldCB3cmFwcGVycyBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGdldCB3cmFwcGVycy4gSSBkb3VidCB0aGlzIHdhcyBhCiAgICAgICAgICAgIHByb2JsZW0gZm9yIGFueSBsYW5ndWFnZXMgZXhjZXB0IGZvciB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBudWxsIGF0dHJpYnV0ZQogICAgICAgICAgICBpbiB0aGUgb3V0IHR5cGVtYXAgKEMjIG9ubHkpLgoKMDkvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlcyB3aGVuIGZpbGVzIGZhaWwgdG8gb3Blbi4KCjA5LzA2LzIwMDU6IG1tYXR1cyAKCgkgICAgQWxsb3cgYSAlZGVmaW5lIGEgbWFjcm8gaW5zaWRlIGFub3RoZXIgJWRlZmluZSBtYWNybywgZm9yIGV4YW1wbGUKCgkgICAgICAlZGVmaW5lIGhlbGxvKG5hbWUsIFR5cGUpCgkgICAgICAlZGVmaW5lIG5hbWUgIyMgYShUeXBlKQoJICAgICAgJXR5cGVtYXAoaW4pIFR5cGUgImhlbGxvOyI7CgkgICAgICAlZW5kZGVmCgkgICAgICAlZW5kZGVmCgkgICAgICAKCSAgICBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgbmV3IGZlYXR1cmVzIGluIHlvdXIgb3duIHR5cGVtYXBzIGxpYnJhcnksIHNlZQoJICAgIHB5dGhvbi9jc3RyaW5nLmksIHB5dGhvbi9jd3N0cmluZy5pIGFuZCBweXRob24vY3dzdHJiYXNlLmkuCSAgICAKCiAgICAgICAgICAgIFtQeXRob25dIE5vcm1hbGl6ZSB0aGUgY3N0cmluZy5pIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmcmFnbWVudHMsIGFuZCBhZGQKICAgICAgICAgICAgY3dzdHJpbmcuaSwgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2FtZSB0eXBlbWFwcyBidXQgZm9yIHdjaGFyX3Qgc3RyaW5ncy4KCgkgICAgW1B5dGhvbl0gQnVnIGZpeGVkOiAxMjQ3NDc3LCAxMjQ1NTkxLCAxMjQ5ODc4IGFuZCBvdGhlcnMuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gSW1wbGVtZW50IHN1cHBvcnQgZm9yIFNXSUdUWVBFKiBESVNPV04gdHlwZW1hcCAobGlrZSBpbiBQeXRob24pIGZvcgogICAgICAgICAgICBiZXR0ZXIgY29udHJvbCBvZiBtZW1vcnkgbWFuYWdlbWVudCwgZWcgd2hlbiBhZGRpbmcgYW4gb2JqZWN0IGNyZWF0ZWQgaW4gUnVieQogICAgICAgICAgICB0byBhIEMrKyBjb250YWluZXIuIFBhdGNoICMxMjYxNjkyIGZyb20gQ2hhcmxpZSBTYXZhZ2UuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSA2NCBiaXQgcGxhdGZvcm0gZml4ZXMgZm9yIHRoZSB2YXJhcmdzIGhhbmRsaW5nIGluIFNXSUdfR2V0QXJncy4gVGhpcyBpcyBhbgogICAgICAgICAgICBpbXByb3ZlZCBmaXggZm9yIGJ1ZyAjMTAxMTYwNCBhcyBzdWdnZXN0ZWQgYnkgSmVyZW15IExpbi4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEJ1ZyAjMTI0MDQ2OSAtICVuZXdvYmplY3Qgc3VwcG9ydCBmb3IgVGNsLiBQYXRjaCBmcm9tIEJvYiBNYXJpbmllci4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBCdWcgIzEyNTQ0OTQgLSBGaXggZm9yIGdsb2JhbCBuYW1lc3BhY2UgcG9sbHV0aW9uIGJ5IHBlcmwgaGVhZGVyIGZpbGVzCiAgICAgICAgICAgIChib29sIGRlZmluZSkgcHJldmVudGVkIFNUTCBoZWFkZXJzIGZyb20gYmVpbmcgdXNlZCBvbiBzb21lIHN5c3RlbXMsIGVnCiAgICAgICAgICAgIFdpbmRvd3Mgd2l0aCBWaXN1YWwgU3R1ZGlvLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMTI0MDkzNyAtIFJlZGVmaW5pdGlvbiBvZiBfX2ludDY0IHR5cGVkZWYgZm9yIEludGVsIGNvbXBpbGVycy4KCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEJ1ZyAjMTI1MTgzMiAtICBDKysgdGVtcGxhdGUgbWF5IGdlbmVyYXRlIGludmFsaWQgWE1MIGZpbGUKCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFN1cHBvcnQgYWRkZWQgZm9yIEx1YS4gUGF0Y2ggIzEyNDI3NzIgZnJvbSBNYXJrIEdvc3NhZ2UuCiAgICAgICAgICAgIEl0IHN1cHBvcnRzIG1vc3QgQy9DKysgZmVhdHVyZXMgKGZ1bmN0aW9ucywgc3RydWN0LCBjbGFzc2VzLCBhcnJheXMsIHBvaW50ZXJzLAogICAgICAgICAgICBleGNlcHRpb25zKSwgYXMgd2VsbCBhcyBsb3RzIG9mIGRvY3VtZW50YXRpb24gYW5kIGEgZmV3IHRlc3QgY2FzZXMgJiBleGFtcGxlcy4KCjA4LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEZpeCBpbmNvcnJlY3QgeG1sIGVzY2FwaW5nIGluIGJhc2UgY2xhc3MgbmFtZSB3aGVuIGJhc2UgY2xhc3MgaXMgYSB0ZW1wbGF0ZS4KCjA4LzEzLzIwMDU6IGVmdXp6eW9uZQoJICAgIFtDTElTUF0gQWRkZWQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgZW51bXMuIERvZXMgbm90IGFkZHMgdGhlIHJldHVybiB0eXBlIGRlY2xhcmF0aW9uCgkgICAgdG8gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sIGlmIGEgZnVuY3Rpb24gcmV0dXJucyB2b2lkLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIE5ldyBsYW5ndWFnZSBtb2R1bGUsIENvbW1vbiBMaXNwIHdpdGggVUZGSSwgZnJvbSBVdHotVXdlIEhhdXMuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgRml4IHRoZSBMaXNwIHMtZXhwcmVzc2lvbiBvdXRwdXQgbW9kdWxlOyBpdCBubyBsb25nZXIgY29tcGxhaW5zIGFib3V0ICJ1bmtub3duIHRhcmdldHMiLgoKMDcvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBTVEwgd3JhcHBlcnMgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSB1c2VyJ3MgJWV4Y2VwdGlvbiBkaXJlY3RpdmUKICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgU1RMIHdyYXBwZXIgbWV0aG9kcy4gUHJldmlvdXNseSB0aGUgZm9sbG93aW5nIGdsb2JhbCAlZXhjZXB0aW9uCiAgICAgICAgICAgIGRpcmVjdGl2ZSB3b3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24geyAKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmVwbGFjaW5nICVleGNlcHRpb24gZGlyZWN0aXZlcyBmb3Igc3BlY2lmaWMgU1RMIHdyYXBwZXIKICAgICAgICAgICAgbWV0aG9kcyB3aXRoIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGRlY2xhcmVkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHMuIHRocm93cyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgbm93IHN1cHBsaWVkIGZvciBoYW5kbGluZyB0aGUgU1RMIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBUaGVzZSBjYW4gYWxzbyBiZSBlYXNpbHkKICAgICAgICAgICAgb3ZlcnJpZGRlbiwgZm9yIGV4YW1wbGUgdGhlIHN0ZDo6b3V0X29mX3JhbmdlIGV4Y2VwdGlvbiwgd2hpY2ggaXMgdXNlZCBhIGxvdCBpbiB0aGUgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzLCBjYW4gYmUgY3VzdG9taXNlZCBlYXNpbHk6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfdmVjdG9yLmkiCiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBzdGQ6Om91dF9vZl9yYW5nZSB7CiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RJbnQpIHN0ZDo6dmVjdG9yPGludD47CgowNy8yMi8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NMSVNQXSBUaGUgY2xpc3AgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gSXQgY2FuIG9ubHkgaGFuZGxlIEMsIGNsaXNwIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0cyBmZmkgYmluZGluZ3MgdG8gQysrLgogICAgICAgICAgICAgIC0gSXQgaGFzIHR3byBvcHRpb25zLCAoYSkgLWV4dGVybi1hbGwgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzIGZvciBhbGwgZnVuY3Rpb25zCiAgICAgICAgCWFuZCB2YXJpYWJsZXN0aW9ucywgKGIpIC1nZW5lcmF0ZS10eXBlZGVmIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyAiZGVmLWMtdHlwZSIKCSAgICAgICAgd3JhcHBlcnMgZm9yIHR5cGVkZWZzCgkgICAgICAtIENhbiBoYW5kbGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLCBjb21wbGV4IHR5cGVzIHN1Y2ggYXMgbi1kaW1lbnNpb25hbCBhcnJheXMgb2YgCgkgCXBvaW50ZXJzIG9mIGRlcHRoIGQKCSAgICAgIC0gR2VuZXJhdGVzIHdyYXBwZXJzIGZvciBjb25zdGFudHMgYXMgd2VsbCBhcyB2YXJpYWJsZXMKCSAgICAgIC0gQ29ycmVjdGx5IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzIGluIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwoJICAgICAgLSBDcmVhdGVzIGEgZGVmcGFja2FnZSAiZGVjbGFyYXRpb24iIHdpdGggdGhlIG1vZHVsZSBuYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUsIHRoZSBjcmVhdGVkIAoJICAgIAlwYWNrYWdlIGV4cG9ydHMgYm90aCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcwoJICAgICAgLSB0cmllcyB0byBndWVzcyB3aGVuIHNob3VsZCBhIHBvaW50ZXIgdmFyaWFibGUgYmUgZGVjbGFyZWQgYXMgYy1wdHIgb3IgYy1wb2ludGVyCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIENoYW5nZXMgdG8gc3VwcG9ydCBDIyBzdHJ1Y3RzIHJldHVybmVkIGJ5IHZhbHVlLiBUaGUgY2hhbmdlcyByZXF1aXJlZCBhcmU6CiAgICAgICAgICAgICAgLSBVc2luZyBhbiBvcHRpb25hbCAnbnVsbCcgYXR0cmlidXRlIGluIHRoZSBvdXQgdHlwZW1hcC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgdGhlbiBpdCBpcyB1c2VkIGZvciB0aGUgJG51bGwgc3BlY2lhbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCiAgICAgICAgICAgICAgLSBUaGUgY3R5cGUgdXNlZCBpbiB0aGUgQy9DKysgd3JhcHBlcnMgaXMgbm8gbG9uZ2VyIGluaXRpYWxpc2VkIHRvIDAgb24gZGVjbGFyYXRpb24uCiAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgY2hhbmdlcyBmaXggdGhlIHNpdHVhdGlvbnMgd2hlcmUgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhc3NpZ24gMCB0byB0aGUKICAgICAgICAgICAgcmV0dXJuZWQgc3RydWN0LiBNYXJzaGFsbGluZyBzdHJ1Y3RzIGFzIHZhbHVlIHR5cGVzIHN0aWxsIHJlcXVpcmVzIHVzZXIgZGVmaW5lZCB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGFuIGV4YW1wbGUuCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBTV0lHX2V4Y2VwdGlvbiB1c2FnZSB0byB3b3JrIHdpdGggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBlbXB0eSBtYWNybwogICAgICAgICAgICBhcmd1bWVudHMuIFVuZm9ydHVuYXRlbHkgdGhpcyBmaXggd2lsbCBzdG9wIHVzYWdlIG9mIFNXSUdfZXhjZXB0aW9uIGJlaW5nIHVzZWQgd2l0aGluIHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgdXNlICIiIG9yICV7ICV9IGRlbGltaXRlcnMsIGJ1dCBjb250aW51ZXMgdG8gd29yayB3aXRoIHR5cGVtYXBzIHVzaW5nIHt9IGRlbGltaXRlcnMuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50IG9yIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIG1ldGhvZHMgaW5zdGVhZAogICAgICAgICAgICBhcyBTV0lHX2V4Y2VwdGlvbiBpcyByZWFsbHkgaW50ZW5kZWQgYXMgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYWNybyBmb3IgdGhlIFNXSUcgbGlicmFyeSB3cml0ZXJzLgoKMDcvMTYvMjAwNTogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2Ugc3BlY2lmaWMgZm9yZWlnbiB0eXBlcyByYXRoZXIgdGhhbiAoKiA6dm9pZCkuIAoJICAgIFVzZSAqc3dpZy1pZGVudGlmaWVyLWNvbnZlcnRlciouCgowNi8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGdW5jdGlvbnMgZGVjbGFyZWQgYXMgJ2V4dGVybicgbm8gbG9uZ2VyIGhhdmUgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhZGRlZCB0byB0aGUgCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZXMuIFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIFNXSUcgZG9lcyBub3QgZ2V0IHRoaXMgcmlnaHQsIGVnIGJ1ZyAjMTIwNTg1OSAoZXh0ZXJuCiAgICAgICAgICAgIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlKS4gQWxzbyBTV0lHIGNhbm5vdCBnZXQgbm9uLXN0YW5kYXJkCiAgICAgICAgICAgIGNhbGxpbmcgY29udmVudGlvbnMgY29ycmVjdCwgZWcgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSB1c3VhbGx5IGhhbmRsZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIERMTElNUE9SVCBleHRlcm4gU1REQ0FMTCB2b2lkIGZ1bmN0aW9uKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFNXSUcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVzOgoKICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZnVuY3Rpb24oaW50KTsKCiAgICAgICAgICAgIFRvIHdoaWNoIHRoZXJlIGlzIG5vIHNvbHV0aW9uIGFzIFNXSUcgZG9lc24ndCBoYW5kbGUgbm9uLXN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbnMuIFRoZSBleHRyYQogICAgICAgICAgICAnZXh0ZXJuJyBmdW5jdGlvbiB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlzIHN1cGVyZmx1b3VzIHVubGVzcyBhIHVzZXIgaGFzIGZvcmdvdHRlbiB0byBhZGQgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIGRlY2xhcmF0aW9uIGludG8gdGhlIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlIC1ub2V4dGVybiBjb21tYW5kbGluZSBhcmd1bWVudCBpcyBub3cgcmVkdW5kYW50IGFuZCBhIG5ldyBjb21tYW5kbGluZSBhcmd1bWVudCAtYWRkZXh0ZXJuIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyLiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdW5sZXNzIHRoZSBoZWFkZXIgZmlsZQogICAgICAgICAgICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB3YXMgaW5hZHZlcnRlbnRseSBub3QgYWRkZWQgdG8gdGhlIHdyYXBwZXJzLiBUbyBmaXggdGhpcwogICAgICAgICAgICBhZGQgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGludG8geW91ciB3cmFwcGVycywgRm9yIGV4YW1wbGUsIHJlcGxhY2U6CgogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwoKICAgICAgICAgICAgd2l0aDoKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA2LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgTW9kdWxhMywgT2NhbWxdCiAgICAgICAgICAgIFRoZSBpbnRlcm1lZGlhcnkgZnVuY3Rpb24gbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgbWF0Y2ggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgc28gdGhhdCAlZXh0ZW5kIGZvciBhIG1lbWJlciB2YXJpYWJsZSB3b3JrcwogICAgICAgICAgICB1bmlmb3JtbHkgYWNyb3NzIGFsbCBsYW5ndWFnZSBtb2R1bGVzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBFeHRlbmRNZSB7CiAgICAgICAgICAgICAgICBWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgRXh0ZW5kTWVfVmFyX3NldChFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgRXh0ZW5kTWVfVmFyX2dldChFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbWV0aG9kcyBpbXBsZW1lbnRpbmcgdGhlIGdldC9zZXQgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgZ2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGlzIGFsc28gY2hhbmdlcyB0aGUgbmFtZSBvZiB2YXJpYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIC1ub3Byb3h5LgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgbmFtZXMgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHRoZSAtb2xkdmFybmFtZXMgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgpWZXJzaW9uIDEuMy4yNSAoSnVuZSAxMSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xMS8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggaGFuZGxpbmcgb2YgYW5vbnltb3VzLWVudW0gdmFyaWFibGVzLgoKMDYvMTAvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGZvciBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIGJ5CgkgICAgY29weS1vZi12YWx1ZS4gIEZpeCBmb3IgZ2xvYmFsICJjb25zdCBjaGFyICoiIHZhcmlhYmxlcy4KCSAgICBGaXggdGVzdGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzLCBhcnJheXNfZ2xvYmFsLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciB3aGVuIGEgYmFzZSBjbGFzcyBkZWZpbmVzIGEgc3ltYm9sIGFzIGEgbWVtYmVyIHZhcmlhYmxlIGFuZCBhIGRlcml2ZWQgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICB0aGUgc2FtZSBzeW1ib2wgYXMgYSBtZW1iZXIgbWV0aG9kLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgLSB3aGVuIGEgbWV0aG9kIGhhcyBwcm90ZWN0ZWQgYWNjZXNzIAogICAgICAgICAgICBpbiBiYXNlIGFuZCBwdWJsaWMgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3MuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNjYzNjMgLSBGb2xsb3cgY29udmVudGlvbiBvZiByZWxlYXNlIHRhcmJhbGwgbmFtZSBtYXRjaGluZyBkaXJlY3RvcnkgbmFtZS4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4ICMxMjExMzUzIC0gdHlwZXNhZmUgZW51bXMgKGFuZCBKYXZhIHByb3BlciBlbnVtcykgd3JhcHBlcnMgd2hlbiBlbnVtIHZhbHVlCiAgICAgICAgICAgIGlzIG5lZ2F0aXZlLgoKMDUvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kZXJuaXNlZCBhbmQgdGlkaWVkIHVwIFdpbmRvd3MgbWFjcm9zIC0tPiBTV0lHRVhQT1JULCBTV0lHU1REQ0FMTC4gVGhleSBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgICAgICBieSB1c2VycyB2aWEgLUQgY29tcGlsZXIgZGlyZWN0aXZlcyBpZiBuZWVkIGJlLgoKMDUvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgJWNzbWV0aG9kbW9kaWZpZXJzIGNhbiBiZSBhcHBsaWVkIHRvIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIG1ldGhvZHMgbm93LgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgJ3B1YmxpYycgbW9kaWZpZXIgdGhhdCBTV0lHIGdlbmVyYXRlcywgJWNzbWV0aG9kbW9kaWZpZXJzIHdpbGwgYWxzbwogICAgICAgICAgICByZXBsYWNlIHRoZSB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgdGhhdCBTV0lHIHRoaW5rcyBpcyBhcHByb3ByaWF0ZS4gVGhpcyBmZWF0dXJlIGlzCiAgICAgICAgICAgIHVzZWZ1bCBmb3Igc29tZSBvYnNjdXJlIGNhc2VzIHdoZXJlIFNXSUcgbWlnaHQgZ2V0IHRoZSBtb2RpZmllcnMgaW5jb3JyZWN0LCBmb3IgZXhhbXBsZQogICAgICAgICAgICB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIGFuZCBvdmVycmlkaW5nIGEgbWV0aG9kIGluIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgY29uc3RydWN0b3JzIHRvIHN0ZDo6cGFpciB3cmFwcGVycyAoc3RkX3BhaXIuaSkgZm9yIGFsbCBsYW5ndWFnZXMuCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHN0ZDo6cGFpciB3cmFwcGVycyBpbiBzdGRfcGFpci5pCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBDIyAnbmV3JyBhbmQgJ292ZXJyaWRlJyBtb2RpZmllcnMgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBhIEMrKyBjbGFzcyBpbmhlcml0cyBtZXRob2RzCiAgICAgICAgICAgIHZpYSBhIEMrKyAndXNpbmcnIGRlY2xhcmF0aW9uLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgcHJldmlvdXNseSBiZWluZyBpZ25vcmVkIGluIGNsYXNzZXMgdGhhdCBpbmhlcml0ZWQgbWV0aG9kcwogICAgICAgICAgICBmcm9tICd1c2luZycgZGVjbGFyYXRpb25zLCBlZyBjYWxscyB0byBEZXJpdmVkOjpiYXIgYmVsb3cgd2lsbCBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8KICAgICAgICAgICAgYSB0YXJnZXQgbGFuZ3VhZ2UgZXhjZXB0aW9uL2Vycm9yLCBsaWtlIGl0IGFsd2F5cyBoYXMgZG9uZSBmb3IgQmFzZTo6QmFyLgoKICAgICAgICAgICAgY2xhc3MgQmFzZSB7CiAgICAgICAgICAgICAgdmlydHVhbCBiYXIoKSB0aHJvdyAoc3RkOjpzdHJpbmcpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgewogICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmJhcjsKICAgICAgICAgICAgfTsKCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZXRlY3RpbmcgdmlydHVhbCBtZXRob2RzIGluICVleHRlbmQgZm9yIHRoZSAtZnZpcnR1YWwgb3B0aW9uIGFuZCBDIyBvdmVycmlkZSBhbmQgbmV3CiAgICAgICAgICAgIG1ldGhvZCBtb2RpZmllcnMuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAnbmV3JyBtb2RpZmllciBpcyBub3cgZ2VuZXJhdGVkIG9uIHRoZSBwcm94eSBtZXRob2Qgd2hlbiBhIG1ldGhvZCBpbiBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgaXMgbm90IHBvbHltb3JwaGljIGFuZCB0aGUgc2FtZSBtZXRob2QgZXhpc3RzIGluIHRoZSBkZXJpdmVkIGNsYXNzIChpZSBpdCBoaWRlcwogICAgICAgICAgICB0aGUgYmFzZSBjbGFzcycgbm9uLXZpcnR1YWwgbWV0aG9kKS4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ZXMgdG8gZGV0ZWN0aW9uIG9mIGNvdmFyaWFudCByZXR1cm4gdHlwZXMgLSB3aGVuIHRoZSBjbGFzcyBoaWVyYXJjaHkgaXMgbW9yZQogICAgICAgICAgICB0aGFuIDIgY2xhc3NlcyBkZWVwLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwcyBtb3ZlZCBmcm9tIHN0ZF9zdHJpbmcuaSB0byBzdGRfd3N0cmluZy5pCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGNyYXNoIGluIERvaFN0cnN0ciwgYnVnICMxMTkwOTIxCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBGaXggZm9yIG1ldGhvZHMgd2l0aCBzaW1pbGFyIG5hbWVzIHdoZW4gc2hvd2luZyBsaXN0IG9mIG5hbWVzIG9uIGVycm9yIC0gYnVnICMxMTkxODI4LgogICAgICAgICAgICBQYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gbG9uZyBsb25nIG92ZXJsb2FkaW5nIGZpeCAtIGJ1ZyAjMTE5MTgzNSwgcGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzExOTY3NTUgdG8gcmVtb3ZlIGRlYnVnIGZyb20gc3dpZ3RjbDguc3dnLgoKMDUvMTkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCAtZnZpcnR1YWwgb3B0aW9uXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyB3aGVuIGEKICAgICAgICAgICAgdmlydHVhbCBtZXRob2QncyByZXR1cm4gdHlwZSB3YXMgYSB0eXBlZGVmIGluIGVpdGhlciB0aGUgYmFzZSBvciBkZXJpdmVkIGNsYXNzLiBBbHNvIGVuc3VyZXMgdGhlCiAgICAgICAgICAgIG1ldGhvZCBpcyBlbGltaW5hdGVkIHdoZW4gdXNpbmcgdGhlIC1mdmlydHVhbCBvcHRpb24uIEZvciBleGFtcGxlLCBEZXJpdmVkLm1ldGhvZCBub3cgaGFzIHRoZSBDIwogICAgICAgICAgICBvdmVycmlkZSBrZXl3b3JkIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQqIEludGVnZXJQdHI7CgogICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgSW50ZWdlclB0ciBtZXRob2QoKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgaW50ICogbWV0aG9kKCkgY29uc3Q7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFtDI10gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IGJlaW5nIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgdmlydHVhbCBtZXRob2RzIHdoZW4gYSBiYXNlIGNsYXNzCiAgICAgICAgICAgIGlzIGlnbm9yZWQgd2l0aCAlaWdub3JlLgoKMDUvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIHJlbW92ZSAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5ncyBpbiBDIHdyYXBwZXJzIHdoZW4gY29tcGlsaW5nIEMgY29kZSB3aXRoICdnY2MgLVdhbGwgLWZzdHJpY3QtYWxpYXNpbmcnLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIE1pY2hhZWwgQ2FoaWxsLiBUaGlzIG1vZGlmaWVzIG1hbnkgb2YgdGhlIGNhc3RzIHNsaWdodGx5LCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikmamFyZzE7CiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSh2b2lkICopJmphcmcxOwoKMDUvMTIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBDIyBhdHRyaWJ1dGVzLiBDIyBhdHRyaWJ1dGVzIGNhbiBiZSBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIDEpIE9uIGEgQy9DKysgdHlwZSBiYXNpcyBieSBzcGVjaWZ5aW5nIGFuIGluYXR0cmlidXRlcyBhbmQvb3Igb3V0YXR0cmlidXRlcyB0eXBlbWFwIGF0dHJpYnV0ZQogICAgICAgICAgICAgICBpbiB0aGUgaW10eXBlIG9yIGNzdHlwZSB0eXBlbWFwcyAoZm9yIEMjIHJldHVybiB0eXBlIG9yIEMjIHBhcmFtZXRlciB0eXBlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICAyKSBPbiBhIHdyYXBwZWQgbWV0aG9kIG9yIHZhcmlhYmxlIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgZmVhdHVyZSAoJWZlYXR1cmUpLgogICAgICAgICAgICAzKSBPbiBhIHdyYXBwZWQgcHJveHkgY2xhc3Mgb3IgZW51bSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIHR5cGVtYXAuCgogICAgICAgICAgICBFeGFtcGxlcyBhcmUgaW4gdGhlIEMjIGRvY3VtZW50YXRpb24gKENTaGFycC5odG1sKS4KCjA0LzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBjb25maWd1cmUgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoZSBkZWZhdWx0IG1heGltdW0gY29tcGlsZXIgd2FybmluZyBhcwogICAgICAgICAgICB0aGV5IGNvdWxkbid0IGJlIHJlbW92ZWQgZXZlbiB3aGVuIG92ZXJyaWRpbmcgQ0ZMQUdTIGFuZCBDWFhGTEFHUyB3aXRoIGNvbmZpZ3VyZQogICAgICAgICAgICAoLi9jb25maWd1cmUgQ0ZMQUdTPSBDWFhGTEFHUz0pLiBUbyB0dXJuIHRoZSBtYXhpbXVtIHdhcm5pbmdzIG9mZiwgcnVuOiAgCgogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1tYXhpbXVtLWNvbXBpbGUtd2FybmluZ3MKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHdoaWNoIHJld29ya3MgdGhlIEphdmEgY29uc3RydWN0b3IgYW5kIGZpbmFsaXplL2Rlc3RydWN0b3IgdHlwZW1hcHMsCiAgICAgICAgICAgIGZvciBkaXJlY3RvcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3ZlcmFsbCBKYXZhIHR5cGVtYXBzLiBBZGRlZCB0aGUgZGlyZWN0b3JfdGFrZSBhbmQgCiAgICAgICAgICAgIGRpcmVjdG9yX3JlbGVhc2UgdHlwZW1hcHMgdG8gZW11bGF0ZSBvdGhlciBtb2R1bGVzJyBfX2Rpc293bl9fIGZ1bmN0aW9uYWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeGVkIHByb2JsZW1zIGR1ZSB0byB0aGUgb3ZlciBlYWdlciBnYXJiYWdlIGNvbGxlY3Rvci4gT2NjYXNpb25hbGx5IHRoZQogICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3b3VsZCBjb2xsZWN0IGEgQyMgcHJveHkgY2xhc3MgaW5zdGFuY2Ugd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQKICAgICAgICAgICAgaW4gdW5tYW5hZ2VkIGNvZGUgaWYgdGhlIG9iamVjdCB3YXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGEgd3JhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5IHRoaXMgY2F1c2VkIGhhdm9jIGFzIHRoZSBDIyBwcm94eSBjbGFzcyBjYWxscyB0aGUgQysrIGRlc3RydWN0b3IKICAgICAgICAgICAgd2hlbiBpdCBpcyBjb2xsZWN0ZWQuIFByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzIG5vdyB1c2UgYSBIYW5kbGVSZWYsCiAgICAgICAgICAgIHdoaWNoIGhvbGRzIGFuIEludFB0ciwgaW5zdGVhZCBvZiBhIHBsYWluIEludFB0ciB0byBtYXJzaGFsIHRoZSBDKysgcG9pbnRlciB0byB1bm1hbmFnZWQKICAgICAgICAgICAgY29kZS4gVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoaXMKICAgICAgICAgICAgbW9kaWZpY2F0aW9uLgoKICAgICAgICAgICAgVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSBzd2lnQ1B0ciBpcyBub3cgb2YgdHlwZSBIYW5kbGVSZWYKICAgICAgICAgICAgaW5zdGVhZCBvZiBJbnRQdHIgYW5kIGNvbnNlcXVlbnRseSB0aGUgZ2V0Q1B0ciBtZXRob2QgcmV0dXJuIHR5cGUgaGFzIGFsc28gY2hhbmdlZC4gVGhlIG5ldAogICAgICAgICAgICBlZmZlY3QgaXMgdGhhdCBhbnkgY3VzdG9tIHdyaXR0ZW4gdHlwZW1hcHMgbWlnaHQgaGF2ZSB0byBiZSBtb2RpZmllZCB0byBzdWl0ZS4gQWZmZWN0ZWQgdXNlcnMKICAgICAgICAgICAgc2hvdWxkIG5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgbmV3ICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgaW10eXBlIHR5cGVtYXAgYXMgdGhlCiAgICAgICAgICAgIGlucHV0IHR5cGUgaXMgbm93IGEgSGFuZGxlUmVmIGFuZCB0aGUgb3V0cHV0IHR5cGUgaXMgc3RpbGwgYW4gSW50UHRyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgYXN5bW1ldHJpYyB0eXBlIG1hcnNoYWxsaW5nIGFkZGVkLiBTb21ldGltZXMgdGhlIG91dHB1dCB0eXBlIG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRpZmZlcmVudCB0byB0aGUgaW5wdXQgdHlwZS4gU3VwcG9ydCBmb3IgdGhpcyBjb21lcyBpbiB0aGUgZm9ybSBvZiBhIG5ldyBvcHRpb25hbCAnb3V0JwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBjdHlwZSwgaW10eXBlIGFuZCBjc3R5cGUgdHlwZW1hcHMuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgbm90CiAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgaXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwLCBhcyBoYXMgYWx3YXlzIHByZXZpb3VzbHkgYmVlbiB0aGUgY2FzZS4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgIHRoZW4gdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igb3V0cHV0IHR5cGVzIGFuZCB0aGUgdHlwZSBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gdGhlIHR5cGVtYXAgaXRzZWxmIGlzIHVzZWQgZm9yIHRoZSBpbnB1dCB0eXBlLiBBbiBvdXRwdXQgdHlwZSBpcyBhIHJldHVybiB2YWx1ZSBmcm9tCiAgICAgICAgICAgIGEgd3JhcHBlZCBtZXRob2Qgb3Igd3JhcHBlZCBjb25zdGFudCBhbmQgYW4gaW5wdXQgdHlwZSBpcyBhIHBhcmFtZXRlciBpbiBhIHdyYXBwZWQgbWV0aG9kLgoKICAgICAgICAgICAgQW4gZXhhbXBsZSBzaG93cyB0aGF0IGNoYXIgKiBjb3VsZCBiZSBtYXJzaGFsbGVkIGluIGRpZmZlcmVudCB3YXlzLCAKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW10eXBlLCBvdXQ9IkludFB0ciIpIGNoYXIgKiAic3RyaW5nIgogICAgICAgICAgICAgIGNoYXIgKiBmdW5jdGlvbihjaGFyICopOwoKICAgICAgICAgICAgVGhlIG91dHB1dCB0eXBlIGlzIHRodXMgSW50UHRyIGFuZCB0aGUgaW5wdXQgdHlwZSBpcyBzdHJpbmcuIFRoZSByZXN1bHRpbmcgaW50ZXJtZWRpYXJ5IEMjIGNvZGUgaXM6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBmdW5jdGlvbihzdHJpbmcgamFyZzEpOwoKMDQvMjIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IGdlbmVyYXRpb24gb2YgImRlZmluZS1tZXRob2QiIGZvciBtZXRob2RzIG9mCgkgICAgY2xhc3NlcyB3aXRoIGEgY29uc3RydWN0b3IuICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjA0LzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEZvciB3cmFwcGVkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgKHVzaW5nIGFyZ291dCksCgkgICAgU1dJRyBDSElDS0VOIG5vdyByZXR1cm5zIHRoZW0gYXMgbXVsdGlwbGUgdmFsdWVzIGluc3RlYWQgb2YgYXMKCSAgICBhIGxpc3QuICBUaGV5IGNhbiB0aGVuIGJlIGFjY2Vzc2VkIHVzaW5nIChjYWxsLXdpdGgtdmFsdWVzKS4KCjA0LzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgKyBBZGRlZCBhIHdob2xlIGJ1bmNoIG9mIG5ldyBfcnVubWUgc2NyaXB0cyBpbnRvIHRoZSBjaGlja2VuIHRlc3QKICAgICAgICAgICAgc3VpdGUuICBBbHNvIGZpeCBzb21lIGJ1Z3MgdGhlc2UgbmV3IHNjcmlwdHMgdHVybmVkIHVwLgoKICAgICAgICAgICAgKyBBZGRlZCBvcHRpbWl6YXRpb24gd2hlbiByZXR1cm5pbmcgYSB3cmFwcGVkIHByb3h5IGNsYXNzLiAgQmVmb3JlLAogICAgICAgICAgICBhIG1pbm9yIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgaW52b2tlZCBldmVyeSB0aW1lIGEgZnVuY3Rpb24gcmV0dXJuZWQuCgoJICAgICsgQWxsIHRoZSBjaGlja2VuIEV4YW1wbGVzIHNob3VsZCBub3cgcnVuIGNvcnJlY3RseQoKMDQvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB0eXBlbWFwIG1hdGNoaW5nIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzbyB0aGF0IHN0ZDo6c3RyaW5nIHZhcmlhYmxlcyBjYW4gYmUgZWFzaWx5IG1hcnNoYWxsZWQgd2l0aAogICAgICAgICAgICBhIEMjIHN0cmluZyBwcm9wZXJ0eSB1c2luZzoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9zdHJpbmcuaSIKICAgICAgICAgICAgICAlYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp2YXJpYWJsZV9uYW1lIH07CiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZTsKCiAgICAgICAgICAgIChSZWNhbGwgdGhhdCBhbGwgY2xhc3MgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHBvaW50ZXJzKQoKMDQvMDUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBBZGRlZCBFeGFtcGxlcy9jaGlja2VuL2VnZywgYW4gZXhhbXBsZSBvbiBob3cgdG8gYnVpbGQgYSBjaGlja2VuCgkgICAgICBleHRlbnNpb24gbGlicmFyeSBpbiB0aGUgZm9ybSBvZiBhbiBlZ2cuICBBbHNvIHVwZGF0ZWQgdGhlCgkgICAgICBkb2N1bWVudGF0aW9uIG9uIHRoZSBkaWZmZXJlbnQgbGlua2luZyBvcHRpb25zLgoKCSAgICArIGNoaWNrZW4gdGVzdC1zdWl0ZSBub3cgaGFzIHN1cHBvcnQgdG8gY2hlY2sgU1dJRyB3aXRoIHRoZSAtcHJveHkKCSAgICAgIGFyZ3VtZW50IGlmIHRoZXJlIGV4aXN0cyBhIF9wcm94eV9ydW5tZS5zcyBmaWxlLgoKCSAgICArIE1vcmUgZml4ZXMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCAtcHJveHkKCjAzLzMxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFR1cm5lZCBvbiBleHRyYSB0ZW1wbGF0ZSBmZWF0dXJlcyBmb3IgYWxsIGxhbmd1YWdlcyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHByZXZpb3VzbHkgb25seSBhdmFpbGFibGUgdG8gUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBlbmFibGVzIHR5cGVtYXBzIGRlZmluZWQgd2l0aGluIGEgdGVtcGxhdGVkIGNsYXNzIHRvIGJlIHVzZWQgYXMKICAgICAgICAgICAgZXhwZWN0ZWQuIFJlcXVpcmVzICV0ZW1wbGF0ZSBvbiB0aGUgdGVtcGxhdGVkIGNsYXNzLCAldGVtcGxhdGUoKSB3aWxsCiAgICAgICAgICAgIGFsc28gcGljayB1cCB0aGUgdHlwZW1hcHMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vPFQ+ICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb19pKSBGb288aW50PjsKICAgICAgICAgICAgICAldGVtcGxhdGUoKSBGb288ZG91YmxlPjsKICAgICAgICAgICAgICAKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSB0aGUgcHJvcGVyICdpbicgdHlwZW1hcHMgd2hlcmV2ZXIgRm9vPGludD4gYW5kIEZvbzxkb3VibGU+CiAgICAgICAgICAgIGFyZSB1c2VkLgoKMDMvMzAvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gUGF0Y2ggZnJvbSBIYW5zIE9lc3RlcmhvbHQgZm9yIHN1cHBvcnRpbmcgTXpTY2hlbWUgMzB4LgoKMDMvMjkvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBSZWFsbG93IG9sZGVyIHZlcnNpb25zIG9mIGNoaWNrZW4gKDEuNDAgdG8gMS44OSkgYnkgcGFzc2luZyAtbm9jb2xsZWN0aW9uCgkgICAgICBhcmd1bWVudCB0byBTV0lHCgkgICAgKyAlaW1wb3J0IG5vdyB3b3JrcyBjb3JyZWN0bHkgd2l0aCB0aW55Y2xvcy4gIChkZWNsYXJlICh1c2VzIC4uLikpIHdpbGwgYmUKCSAgICAgIGV4cG9ydGVkIGNvcnJlY3RseS4KCSAgICArIFRpbnlDTE9TIHByb3h5IGNsYXNzZXMgbm93IHdvcmsgY29ycmVjdGx5IHdpdGggb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICAgIGFuZCBjb25zdHJ1Y3RvcnMuCgowMy8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9yb3V0IHR5cGVtYXBzLiBKYXZhIGRpcmVjdG9ycwogICAgICAgICAgICByZXF1aXJlIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwcyBsaWtlIHRoZSBvdGhlciBsYW5ndWFnZXMgbm93LiBUaGUgbmV3CiAgICAgICAgICAgIHR5cGVtYXBzIHByb3ZpZGUgZml4ZXMgZm9yIG1ldGhvZHMgd2hlcmUgdGhlIHJldHVybiB0eXBlIGlzIHJldHVybmVkCiAgICAgICAgICAgIGJ5IHJlZmVyZW5jZSAodGhpcyBjYW5ub3QgYXV0b21hdGljYWxseSBiZSBtYWRlIHRocmVhZCBzYWZlIHRob3VnaCkuCgowMy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBFbnVtIGNhc3RpbmcgZml4ZXMuIFZpc3VhbCBDKysgZGlkbid0IGxpa2UgdGhlIEMgdHlwZSBjYXN0aW5nIFNXSUcgcHJvZHVjZWQKICAgICAgICAgICAgd2hlbiB3cmFwcGluZyBDKysgZW51bSByZWZlcmVuY2VzLCBhcyByZXBvcnRlZCBieSBBZG1pcmUgS2FuZGF3YXN2aWthLgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFNGICMxMTI0NDkwLiBGaXggUGVybCBtYWNybyBjbGFzaGVzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbydzIFNUTCBzdHJpbmcsCiAgICAgICAgICAgIHNvIG5vdyBwcm9qZWN0cyBjYW4gI2luY2x1ZGUgPHN0cmluZz4uCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAldmFyYXJncyB3aGljaCBnb3QgYnJva2VuIHdpdGggdGhlIHJlY2VudCBkZWZhdWx0IGFyZ3VtZW50IGNoYW5nZXMuCiAgICAgICAgICAgIEFsc28gd29ya3MgZm9yIEphdmEgYW5kIEMjIGZvciB0aGUgZmlyc3QgdGltZSBub3cuCgowMy8xNy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICsgRml4IGEgd2hvbGUgYnVuY2ggb2YgYnVncyBpbiB0aGUgY2hpY2tlbiBtb2R1bGUuICBUaGUgZW50aXJlCiAgICAgICAgICAgICAgdGVzdCBzdWl0ZSBub3cgY29tcGlsZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgdGVzdHMgdGhhdCByZXF1aXJlCgkgICAgICBzdGRfdmVjdG9yLmksIHN0ZF9kZXF1ZS5pLCBhbmQgc28gb24sIHdoaWNoIGNoaWNrZW4gZG9lcyBub3QgaGF2ZSB5ZXQuCgoJICAgICsgQWRkIHN1cHBvcnQgZm9yICVleGNlcHRpb24gYW5kICV0eXBlbWFwKGV4Y2VwdGlvbnMpLiAgRXhjZXB0aW9ucyBhcmUKCSAgICAgIHRocm93biB3aXRoIGEgY2FsbCB0byAoYWJvcnQpIGFuZCBjYW4gYmUgaGFuZGxlZCBieSAoaGFuZGxlLWV4Y2VwdGlvbnMpCgowMy8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9ycy4gTW9kaWZpY2F0aW9ucyB0byB0aGUgdHlwZW1hcHMKICAgICAgICAgICAgZ2l2aW5nIHVzZXJzIGZpbmUgY29udHJvbCBvdmVyIG1lbW9yeSBvd25lcnNoaXAgYW5kIGxpZmV0aW1lIG9mIGRpcmVjdG9yIGNsYXNzZXMuCiAgICAgICAgICAgIERpcmVjdG9yIGNsYXNzZXMgbm8gbG9uZ2VyIGxpdmUgZm9yZXZlciBieSBkZWZhdWx0IGFzIHRoZXkgYXJlIG5vdyBjb2xsZWN0YWJsZQogICAgICAgICAgICBieSB0aGUgR0MuCgowMy8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gQWRkIHN1cHBvcnQgZm9yIGFkZGluZyBmaW5hbGl6ZXJzIGdhcmJhZ2UgY29sbGVjdGVkIG9iamVjdHMuCgkgICAgRnVuY3Rpb25zIHRoYXQgcmV0dXJuIG5ldyBvYmplY3RzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IGFuZAoJICAgIGlucHV0IGFyZ3VtZW50cyB3aGljaCBjb25zdW1lIChvciB0YWtlIG93bmVyc2hpcCkgb2YgYSBwb2ludGVyIHNob3VsZAoJICAgIGJlIG1hcmtlZCB3aXRoIHRoZSBESVNPV04gdHlwZW1hcC4KCgkgICAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgY29ycmVjdGx5IGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZAoJICAgIHRvIGEgZnVuY3Rpb24sIGFuZCByYWlzaW5nIGFuIGVycm9yIGlmIHRoZSB3cm9uZyBudW1iZXIgYXJlIHBhc3NlZC4KCjAzLzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBBZGQgLS13aXRob3V0LWFsbGxhbmcgb3B0aW9uIHRvIGNvbmZpZ3VyZS5pbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKICAgICAgICAgICAgcGFzc2luZyBhbGwgdGhlIC0td2l0aG91dC1weXRob24gLS13aXRob3V0LXBlcmw1IGV0Yy4uLiB0aGF0IE1hdHRoaWFzIGFkZGVkLgoKMDMvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gTWVtb3J5IGxlYWsgZml4IGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGNsYXNzZXMvc3RydWN0cyBieSB2YWx1ZS4KCjAzLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggZm9yIFBlcmwgaW5jb3JyZWN0bHkgdGFraW5nIG1lbW9yeSBvd25lcnNoaXAgZm9yIHJldHVybiB0eXBlcyB0aGF0CiAgICAgICAgICAgIGFyZSB0eXBlZGVmcyB0byBhIHN0cnVjdC9jbGFzcyBwb2ludGVyLiBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVmFyaW91cyBleGNlcHRpb24gY2hhbmdlcyBmb3IgdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGVzZSBub3cgbW9yZQogICAgICAgICAgICBhY2N1cmF0ZWx5IG1pcnJvciB0aGUgc2FtZSBleGNlcHRpb25zIHRoYXQgU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCB0aHJvdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgYWZ0ZXIgYW55IG9mIHRoZSBzdGQ6OnZlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHRocm93IGFuIGV4Y2VwdGlvbi4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gV2hlbiBudWxsIGlzIHBhc3NlZCBmb3IgYSBDKysgcmVmZXJlbmNlIG9yIHZhbHVlIHBhcmFtZXRlciwgdGhlIAogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duIGhhcyBiZWVuIGNvcnJlY3RlZCB0byBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaW5zdGVhZAogICAgICAgICAgICBvZiBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIGFzIHJlY29tbWVuZGVkIGluIHRoZSAuTkVUIEZyYW1ld29yayBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIHR1cm4gYSBDKysgZXhjZXB0aW9uIGludG8gYW4gQXBwbGljYXRpb25FeGNlcHRpb24sCiAgICAgICAgICAgIG5vdCBhIFN5c3RlbUV4Y2VwdGlvbiBub3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE51bWVyb3VzIGNoYW5nZXMgaW4gQyMgZXhjZXB0aW9uIGhhbmRsaW5nIGhhdmUgYmVlbiBtYWRlIG92ZXIgdGhlIHBhc3QKICAgICAgICAgICAgZmV3IHdlZWtzLiBBIHN1bW1hcnkgZm9sbG93czoKCiAgICAgICAgICAgIFRoZSB3YXkgaW4gd2hpY2ggQysrIGV4Y2VwdGlvbnMgYXJlIG1hcHBlZCB0byBDIyBleGNlcHRpb25zIGlzIHF1aXRlIGRpZmZlcmVudC4KICAgICAgICAgICAgVGhlIGNoYW5nZSBpcyB0byBmaXggQyMgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZSBDKysgZXhjZXB0aW9uIHN0YWNrIGlzIGNvcnJlY3RseQogICAgICAgICAgICB1bndvdW5kIGFzIHByZXZpb3VzbHkgQysrIGV4Y2VwdGlvbnMgd2VyZSBiZWluZyB0aHJvd24gYWNyb3NzIHRoZSBDIFBJbnZva2UgbGF5ZXIKICAgICAgICAgICAgaW50byB0aGUgbWFuYWdlZCB3b3JsZC4KCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIGF0dHJpYnV0ZXMgKGNhbnRocm93IGFuZCBleGNvZGUpIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIHRvIGNvbnRyb2wgdGhlCiAgICAgICAgICAgIG1hcHBpbmcgb2YgQysrIHRvIEMjIGV4Y2VwdGlvbnMuIEVzc2VudGlhbGx5IGEgY2FsbGJhY2sgaW50byB0aGUgdW5tYW5hZ2VkIHdvcmxkCiAgICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcGVuZGluZyBleGNlcHRpb24uIFRoZSBleGNlcHRpb24gdG8gdGhyb3cgaXMgc3RvcmVkIGluIHRocmVhZCBsb2NhbAogICAgICAgICAgICBzdG9yYWdlIChzbyB0aGUgYXBwcm9hY2ggaXMgdGhyZWFkLXNhZmUpLiBUaGUgdHlwZW1hcHMgYXJlIGV4cGVjdGVkIHRvIHJldHVybgogICAgICAgICAgICBmcm9tIHVubWFuYWdlZCBjb2RlIGFzIHNvb24gYXMgdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGlzIHNldC4gQW55IHBlbmRpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBhcmUgY2hlY2tlZCBmb3IgYW5kIHRocm93biBvbmNlIG1hbmFnZWQgY29kZSBzdGFydHMgZXhlY3V0aW5nLiBUaGVyZSBzaG91bGQKICAgICAgICAgICAgYmUgbWluaW1hbCBpbXBhY3Qgb24gZXhlY3V0aW9uIHNwZWVkIGR1cmluZyBub3JtYWwgYmVoYXZpb3VyLiBGdWxsIGRldGFpbHMgd2lsbCBiZQogICAgICAgICAgICBkb2N1bWVudGVkIGluIENTaGFycC5odG1sLgoKICAgICAgICAgICAgVGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oKSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZQogICAgICAgICAgICBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCgpIGFuZCBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb24oKQogICAgICAgICAgICBmdW5jdGlvbnMuIFRoZSBvcmlnaW5hbCBuYW1lIGhhcyBiZWVuIGRlbGliZXJhdGVseSBjaGFuZ2VkIHRvIGJyZWFrIG9sZCBjb2RlIGFzCiAgICAgICAgICAgIHRoZSBvbGQgYXBwcm9hY2ggd2FzIHNvbWV3aGF0IGZsYXdlZC4gQW55IHVzZXIgZGVmaW5lZCBleGNlcHRpb25zIHRoYXQgZm9sbG93IHRoZQogICAgICAgICAgICBzYW1lIHBhdHRlcm4gYXMgdGhlIG9sZCBhcHByb2FjaCBzaG91bGQgYWxzbyBiZSBmaXhlZC4KCiAgICAgICAgICAgIE51bWVyb3VzIG5ldyAuTkVUIGZyYW1ld29yayBleGNlcHRpb25zIGFyZSBub3cgYXZhaWxhYmxlIGZvciBlYXN5IHRocm93aW5nIGZyb20gCiAgICAgICAgICAgIHVubWFuYWdlZCBjb2RlLiBUaGUgY29tcGxldGUgbGlzdCBpczogCgogICAgICAgICAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBBcml0aG1ldGljRXhjZXB0aW9uLCBEaXZpZGVCeVplcm9FeGNlcHRpb24sIAogICAgICAgICAgICAgIEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiwgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIAogICAgICAgICAgICAgIE51bGxSZWZlcmVuY2VFeGNlcHRpb24sIE91dE9mTWVtb3J5RXhjZXB0aW9uLCBPdmVyZmxvd0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgU3lzdGVtRXhjZXB0aW9uLCBBcmd1bWVudEV4Y2VwdGlvbiwgQXJndW1lbnROdWxsRXhjZXB0aW9uIGFuZAogICAgICAgICAgICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8wNS8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBGaXggc2V2ZXJhbCBtZW1vcnkgbGVha3MgYXJvdW5kLiBFdmVuIHdoZW4gd2Ugc3Vydml2ZSAga25vd25pbmcKCSAgICBzd2lnIGlzIGEgbWVtb3J5IGxlYWsgZmFjdG9yeSwgaXQgd2FzIGEgbGl0dGxlIG91dCBvZgoJICAgIGNvbnRyb2wuIFRvIHJ1biBzdGRfY29udGFpbmVycy5pIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZSwKCSAgICBzd2lnIHdhcyB1c2luZyB+MjYwTUIsIG5vdyBpdCB1c2VzICdvbmx5JyB+NDBNQiwgd2hpY2ggaXMKCSAgICB0aGUgc2FtZSBhbW1vdW50IHRoYXQgZysrIHVzZXMsIHNvLCBpcyBub3QgdGhhdCBiYWQuCgkgICAgSW4gdGhlIHByb2Nlc3MsIEkgZm91bmQgYSBjb3VwbGUgb2YgZXh0cmEgRGVsZXRlcywgd2hpY2gKCSAgICBpbiBzb21lIGNhc2VzIGNvdWxkIHRyaWdnZXIgc2VnLiBmYXVsdHMgYW5kL29yCgkgICAgRE9IL2Fzc2VydHMuCgkgICAgCgkgICAgW3B5dGhvbl0gQmV0dGVyIHN1cHBvcnQgZm9yIGRpcmVjdG9ycyArIGV4Y2VwdGlvbi4gTW9yZQoJICAgIHZlcmJvc2UgZXJyb3JzIGFuZCBhZGRlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYW5kbGVyLgoKCSAgICBbcHl0aG9uXSBGaXggbWVtb3J5IGxlYWsgZm9yIHRoZQoKCSAgICAJICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPiAKCgkgICAgY2FzZSxyZXBvcnRlZCBieSBCbyBQZW5nLgoKCSAgICBbcHl0aG9uXSBGaXggU3dpZ1B5T2JqZWN0IGNvbXBhcmUgcHJvYmxlbSByZXBvcnRlIGJ5CgkgICAgQ2FtZXJvbiBQYXRyaWNrLiAKCgkgICAgW3B5dGhvbl0gRml4IHNldmVyYWwgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIAoJICAgIGZvciBnbnUtZ2NjLCBJbnRlbCBhbmQgVkM3LjEgIGNvbXBpbGVycy4KCgowMi8yNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byB1c2UgQ1NTIGFuZCA8ZGl2PiBpbnN0ZWFkIG9mIDxibG9ja3F1b3RlPgoJICAgIEkgdXNlZCBhIHNjcmlwdCB0byBjb252ZXJ0IHRoZSBkb2NzLCBhbmQgaXQgc2V0IGFsbCB0aGUgYm94IGNsYXNzZXMKCSAgICB0byBiZSAiY29kZSIuICBUaGVyZSBhcmUgYWN0dWFsbHkgNCBkaWZmZXJlbnQgY2xhc3NlcywKCSAgICAic2hlbGwiLCAiY29kZSIsICJ0YXJnZXRsYW5nIiwgYW5kICJkaWFncmFtIi4gIFdlIG5lZWQgdG8gZ28gdGhyb3VnaAoJICAgIGFuZCBjb252ZXJ0IHRoZSBkaXZzIGRlcGVuZGluZyBvbiB3aGF0IHRoZXkgY29udGFpbi4KCjAyLzIzLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRlZCBvcHRpb24gLW5vcnR0aSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgbmF0aXZlCgkgICAgQysrIFJUVEkgd2l0aCBkaXJlY3RvcnMgKGR5bmFtaWNfY2FzdDw+IGlzIG5vdCB1c2VkKS4KCgkgICAgQWRkIG1vcmUgY29kZSBmb3IgZGlyZWN0b3JzIHRvIGRldGVjdCBhbmQgcmVwb3J0IGVycm9ycyBpbgoJICAgIHRoZSBweXRob24gc2lkZS4KCgkgICAgRXh0ZW5kIHRoZSB1c2Ugb2YgU1dJR0lOVEVSTiB3aGVuZXZlciBpcyBwb3NzaWJsZS4KCgkgICAgUmVtb3ZlIHRlbXBsYXRlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFZDNy4xLgoKCSAgICBSZW1vdmUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgZ2NjL2crKy4gRmluYWxseSB5b3UgY2FuCgkgICAgY29tcGlsZSB1c2luZwoKCSAgICAgICBnKysgLVcgLVdhbGwgLWMgbXltb2R1bGVfd3JhcC5jeHgKCgkgICAgYW5kIG5vIHNwdXJpb3VzIGVycm9ycyB3aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlcgoJICAgIGNvZGUuCgowMi8yMy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBBZGRlZCAtZXh0ZXJuYWwtcnVudGltZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkdW1wCgkgICAgb3V0IGFsbCB0aGUgY29kZSBuZWVkZWQgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgcnVudGltZSBzeXN0ZW0sCgkgICAgYW5kIGl0IHJlcGxhY2VzIGluY2x1ZGluZyB0aGUgZmlsZXMgZGlyZWN0bHkuICBUaGlzIGNoYW5nZSBhZGRzCgkgICAgdHdvIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB0byB0aGUgTGFuZ3VhZ2UgY2xhc3MsIHdoaWNoIGFyZSB1c2VkCgkgICAgdG8gZmluZCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgcnVudGltZSBjb2RlLiAgSSBhbHNvIHVwZGF0ZWQKCSAgICBhbGwgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSBydW50aW1lIHRvIGltcGxlbWVudCB0aGVzZSB0d28gZnVuY3Rpb25zLgoKMDIvMjIvMjAwNTogbW1hdHVzIAoJICAgIEZpeCAldGVtcGxhdGUgKyBwcml2YXRlIGVycm9yIFNGIzEwOTk5NzYuCgowMi8yMS8yMDA1OiBtbWF0dXMgCgoJICAgIEZpeCBzd2lncnVuLnN3ZyB3YXJuaW5ncyByZXBvcnRlZCB3aGVuIHVzaW5nICJnY2MgLVcgLVdhbGwiCgkgICAgKHN0YXRpYy9pbmxpbmUgbm90IHVzZWQgaW4gZnJvbnQgb2YgYSBmdW5jdGlvbgoJICAgIGRlY2xhcmF0aW9uKSwgYW5kIGFkZCBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZAoJICAgIHVudXNlZCB3YXJuaW5ncyBlbHNld2hlcmUuCgoJICAgIEZpeCB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3MuCgoJICAgIFtQeXRob25dIFVzZSBuZXcgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQgd2FybmluZ3MgaW4KCSAgICBTV0lHSU5URVJOIG1ldGhvZHMuCgoJICAgIFtQeXRob25dIEZpeCBQeU9TX3NucHJpbnRmIGZvciBweXRob24gdmVyc2lvbnMgPCAyLjIgKFNGICMxMTA0OTE5KS4KCgkgICAgW1B5dGhvbl0gRml4IG1hcC9tdWx0aW1hcCB0byBhbGxvdyBlbXB0eSBtYXBzIChyZXBvcnRlZCBieQogIAkgICAgUGhpbGlwcGUgSGV0cm95KS4KCgkgICAgW0RvY3NdIEFkZCBzb21lIGRvY3VtZW50YXRpb24gdG8gUHl0aG9uLmh0bWwgYW5kCgkgICAgU1dJR1BsdXMuaHRtbCwgaW5jbHVkaW5nIGZvciBleGFtcGxlIHRoZSBmYWN0IHRoYXQKCSAgICAnZnJpZW5kcycgYXJlIG5vdyBzdXBwb3J0ZWQuCgowMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUEhQXSBQYXRjaCBmcm9tIE9sbHkgQmV0dHMsIHNvIHRoYXQgd3JhcHBlcnMgY29tcGlsZSB3aXRoIFplbmQgdGhyZWFkIHNhZmV0eSBlbmFibGVkLgoKMDIvMTcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4IGluIHNvbWUgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBtb2R1bGVzIHdoZW4gdXNpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgaW4gY29uc3RydWN0b3JzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlIHdhcyBub3QgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUKICAgICAgICAgICAgQysrIG9iamVjdCBtZW1vcnkgd2hlbiBhbnkgb2YgdGhlIGNvbnN0cnVjdG9ycyB0aGF0IHVzZSBkZWZhdWx0IGFyZ3VtZW50cyB3YXMgY2FsbGVkLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzExMTUwNTU6IEZhaWxlZCBtYWtlIGluc3RhbGwuIFBhdGNoIGZyb20gUm9iIFN0b25lLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGICMxMTIzNDE2IGZyb20gUGF1bCBNb29yZS4gQ29ycmVjdCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgU1RSSU5HQVJSQVkKICAgICAgICAgICAgdHlwZW1hcHMgaW4gdmFyaW91cy5pLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRGlzYWJsZWQgdHlwZW1hcCBzZWFyY2ggY2hhbmdlcyBmb3Igbm93IChzZWUgZW50cnkgMTkvMTIvMjAwNCkuIEl0IGJyZWFrcwogICAgICAgICAgICBvbGQgdHlwZW1hcHMsIGxlbmd0aGVucyB0aGUgZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMjUlIGFuZCBpbnRyb2R1Y2VzCiAgICAgICAgICAgIGluY29uc2lzdGVuY2llcy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIHN3aWcgLWhlbHAgZm9sbG93cyBvdGhlciBzb2Z0d2FyZSBieSBwcmludGluZyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBzd2lnIC12ZXJzaW9uIGFsc28gZGlzcGxheXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgQmVoYXZpb3VyIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggZm9yIHRoZSBsZXNzIGNvbW1vbmx5IHVzZWQgb3JkZXJpbmcgb2YgJWluY2x1ZGUgYW5kICNpbmNsdWRlLCBzbwogICAgICAgICAgICB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcy4gQnVnIHJlcG9ydGVkIGJ5IHJlcG9ydGVkIGJ5IE1heCBCb3dzaGVyLgogICAgICAgICAgICAgICVpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV9IAoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBTV0lHX2V4Y2VwdGlvbiBtYWNybyB3aWxsIG5vdyByZXR1cm4gZnJvbSB1bm1hbmFnZWQgY29kZSAvIG5hdGl2ZSBjb2RlCiAgICAgICAgICAgIGFzIHNvb24gYXMgaXQgaXMgY2FsbGVkLiBGaXhlcyBwb3NzaWJsZSBKVk0gY3Jhc2hlcyBhbmQgb3RoZXIgY29kZSB1bmV4cGVjdGVkbHkKICAgICAgICAgICAgYmVpbmcgZXhlY3V0ZWQuIE5vdGUgU1dJR19leGNlcHRpb24gaXMgb25seSBvY2Nhc2lvbmFsbHkgdXNlZCBieSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgd3JpdGVycywgYW5kIGlzIGJlc3QgYXZvaWRlZCBieSBTV0lHIHVzZXJzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBUeXBlbWFwcyBjYW4gbm93IGJlIHRhcmdldGVkIGF0IGdsb2JhbCB2YXJpYWJsZSBuYW1lcwogICAgICAgICAgICBhbmQgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBuYW1lcy4gUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgZm9yIAogICAgICAgICAgICB0aGUgc2V0dGVycyB3ZXJlIGlnbm9yZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IGdsb2JhbGludCAiLi4uIgogICAgICAgICAgICAgIGludCBnbG9iYWxpbnQ7CgowMi8xMy8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGQgJXR5cGVjaGVjayBmb3IgU1dJR1RZUEUsIGFkZCAldHlwZWNoZWNrIGZvciBwdHJkaWZmX3QsIGZpeAoJICAgIHR5cGVtYXBzIGZvciBzaXplX3QuCgoJICAgIFtQaWtlXSBNZXJnZSBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiBmb3IgaW1wcm92ZWQgUGlrZSBjb25maWd1cmF0aW9uLgoKMDIvMTIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBjb25maWd1cmUgc3dpdGNoZXMgLS13aXRob3V0LXRjbCwgLS13aXRob3V0LXB5dGhvbiBldGMuIGFsbG93IHRvCiAgICAgICAgICAgIGRpc2FibGUgdGhlIHNlYXJjaCBmb3IgaW5zdGFsbGVkIGxhbmd1YWdlcy4KCjAxLzMxLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIEFkZCBEb2hTb3J0TGlzdCB0byBET0gKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW06CiAgICAgICAgICAgICAgICsgU3BlZWQuIFR5cGUgbG9hZGluZyBpcyBub3cgTyhuIGxvZyBuKSBpbnN0ZWFkIG9mIE8oTl4yKSwgd2hpY2gKCSAgICAgICAgIGZvciBsYXJnZSBtb2R1bGVzIGlzIGEgaHVnZSBpbXByb3ZlbWVudC4KICAgICAgICAgICAgICAgKyBBIHdob2xlIGJ1bmNoIG9mIGZ1bmN0aW9ucyBpbiBzd2lncnVuLnN3ZyBubyBsb25nZXIgbmVlZCB0aGUgCiAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2xpc3RfaGFuZGxlIHBhc3NlZCB0byB0aGVtLiAgVGhlIG9ubHkgb25lIGxlZnQgaXMgCgkJIFR5cGVRdWVyeS4gIFRoaXMgYWxzbyBtYWtlcyBydW50aW1lLnN3ZyBhIGxvdCBzbWFsbGVyLgoJICAgICAgICsgU3BsaXQgdXAgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlIGludG8gdHdvIHN0cnVjdHVyZXMKCSAgICAgICAgIChzd2lnX3R5cGVfaW5mbyBhbmQgc3dpZ19jYXN0X2luZm8pCgkgICAgICAgKyBTdG9yZSBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbyByYXRoZXIgdGhhbiBqdXN0IHRoZSB0eXBlCgkgICAgICAgICBuYW1lIHN0cmluZyBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgY2FzdHMuIEZpcnN0IG9mZiwgdGhpcyBtYWtlcwoJICAgICAgICAgdGhlIGd1aWxlIG1vZHVsZSBhIGxpdHRsZSBmYXN0ZXIsIGFuZCBzZWNvbmQsIHRoZQoJICAgICAgICAgU1dJR19UeXBlQ2xpZW50RGF0YSgpIGZ1bmN0aW9uIGlzIGZhc3RlciB0b28uIAoJICAgICAgICsgQWRkIHRoZSBpZGVhIG9mIGEgbW9kdWxlIGludG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlLCBhbGwgdGhlCgkgICAgICAgICB0eXBlcyB3ZXJlIHN0b3JlZCBpbiBvbmUgaHVnZSBsaW5rZWQgbGlzdC4gTm93LCBhbm90aGVyIGxldmVsIGlzCgkgICAgICAgICBhZGRlZCwgYW5kIHRoZSB0eXBlIHN5c3RlbSBzdG9yZXMgYSBsaW5rZWQgbGlzdCBvZiBtb2R1bGVzLCBlYWNoCgkgICAgICAgICBvZiB3aGljaCBzdG9yZXMgYW4gYXJyYXkgb2YgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIGl0LgoJICAgICAgICsgRm9yIG1vcmUgaW5mb3JtYXRpb24gb2YgaG93IHRoZSBydW50aW1lIHR5cGUgc3lzdGVtIG5vdyB3b3JrcywKCSAgICAgICAgIHBsZWFzZSBzZWUgRG9jL01hbnVhbC90eXBlbWFwcy5odG1sIGFuZCBEb2MvRGV2ZWwvcnVudGltZS50eHQKCQkgCgkgICAgLSBVcGRhdGUgYWxsIGxhbmd1YWdlIG1vZHVsZXMgdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBUaGUgY2hhbmdlcwoJICAgICAgdG8gZWFjaCBsYW5ndWFnZSBtb2R1bGUgYXJlIG1pbm9yLiAgQWxsIGxhbmd1YWdlcyBhcmUgbm93IGFibGUgdG8KCSAgICAgIHVzZSBydW50aW1lLnN3ZyBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZQoJICAgICAgb25seSBweXRob24gYW5kIHBlcmwgZGlkLgoKCSAgICAtIFtndWlsZSwgbXpzY2hlbWUsIG9jYW1sLCBhbmQgcGhwNF0gIFRoZXNlIGxhbmd1YWdlcyBvcGVuZWQgdXAgdGhlCgkgICAgICBpbml0IGZ1bmN0aW9uIGluc2lkZSB0aGUgLmN4eCBjb2RlLCBhbmQgYW55IGNvZGUgaW4gdGhlIC5zd2cgZmlsZXMKCSAgICAgIGluIHRoZSBpbml0IHNlY3Rpb24gd2FzIGluc2lkZSB0aGlzIGZ1bmN0aW9uLiAgVGhpcyB3YXMgYSBwcm9ibGVtCgkgICAgICBmb3Igc3dpZ2luaXQuc3dnLCB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIFNXSUdfaW5pdAoJICAgICAgZnVuY3Rpb24gaXMgb3BlbmVkLiAgVGh1cyBJIGNoYW5nZWQgdGhlc2UgbGFuZ3VhZ2VzIHRvIGJlIGxpa2UKCSAgICAgIHB5dGhvbiBvciBwZXJsLCB3aGVyZSB0aGUgaW5pdCBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgLnN3ZwoJICAgICAgZmlsZS4KCSAgICAgIAoJICAgIC0gW1J1YnldIEluc3RlYWQgb2YgbW92aW5nIHRoZSBpbml0IGZ1bmN0aW9uIHRvIHRoZSAuc3dnIGZpbGUsIEkKCSAgICAgIGFkZGVkIGEgbmV3IHNlY3Rpb24gaW5pdGJlZm9yZWZ1bmMsIGFuZCB0aGVuIGFkZGVkCgkgICAgICAlaW5zZXJ0KGluaXRiZWZvcmVmdW5jKSAic3dpZ2luaXQuc3dnIgoKCSAgICAtIFtNelNjaGVtZV0gRml4IGVudW1zIGFuZCBmaXggRXhhbXBsZXMvTWFrZWZpbGUuaW4gc28gdGhhdCBpZgoJICAgICAgbXVsdGlwbGUgLUkgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIElOQ0xVREVTIHZhcmlhYmxlLCBlYWNoCgkgICAgICBnZXRzIGEgKytjY2YuCgoJICAgIC0gW0d1aWxlIEdIXSBVcGRhdGUgR3VpbGUgR0ggdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBTZWUKCSAgICAgIERvYy9NYW51YWwvR3VpbGUuaHRtbCBmb3IgaG93IHNtb2JzIGFyZSBub3cgdXNlZC4KCjAxLzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IHR5cGVtYXAgY2FsbGVkICdjc2NvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuCgogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXAgY2FsbGVkICdqYXZhY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4gQW5vdGhlciB0eXBlbWFwIG5hbWVkICdqYXZhY29uc3RydWN0X2RpcmVjdG9yJwogICAgICAgICAgICBpcyB1c2VkIGluc3RlYWQgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgYSBkaXJlY3RvciBjbGFzcy4KCiAgICAgICAgICAgIFtDIywgSmF2YV0gSWYgYSBDKysgY2xhc3MgZGlkIG5vdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYSBwcm90ZWN0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRy4gVGhpcyBzZWVtcyBpcyB1bm5lY2Vzc2FyeSBhbmQgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICAgICBhbmQgdGhlcmVieSBnaXZpbmcgdGhlIHVzZXIgYWxtb3N0IGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGNvZGUgYWxvbmcgd2l0aCB0aGUKICAgICAgICAgICAgbmV3IHR5cGVtYXBzIGFib3ZlLgoKMTkvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtEaXNhYmxlZCwgc2VlIGVudHJ5IDAyLzE1LzIwMDRdCiAgICAgICAgICAgIC0gRml4IHR5cGVtYXAgc2VhcmNoLCBub3cgdGhlICJvdXQiIHR5cGVtYXAgc2VhcmNoIGlzIGRvbmUgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpICAgLT4gIGludCAqRm9vOjpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqRm9vOjpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICoKCiAgICAgICAgICAgICAgIHRoZW4sIG5vdyB5b3UgY2FuIGJlIG1vcmUgc3BlY2lmaWMsIGFuZCBkZWZpbmUKCiAgICAgICAgICAgICAgLyogYXBwbHkgb25seSBmb3IgICdGb286OmZvbycgbWV0aG9kICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBGb286OmZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgLyogYXBwbHkgZm9yIGFsbCAnZm9vJyBmdW5jdGlvbnMvbWV0aG9kcyAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogZm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgaW50ICpmb28oaW50ICpiYXIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgkgIAoKMTUvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIC0gTW9yZSBmaXhlcyBmb3IgdGVtcGxhdGVzIGFuZCB0ZW1wbGF0ZSBkZWZhdWx0IGFyZ3MuCiAgICAgICAgICAgICAgU2VlIHRlbXBsYXRlX2RlZmF1bHQuaSBmb3Igc2NhcnkgY2FzZXMgdGhhdCBub3cgYXJlIAogICAgICAgICAgICAgIHN1cHBvcnRlZCwgYmVzaWRlcyB0aGUgYWxyZWFkeSB1Z2x5IFNUTC9zdGQgY2FzZXMuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC0gQ29zbWV0aWNzIGFuZCBtb3JlIHVzZSBvZiAnY29uc3QnIHdoZXJlIGl0IHdhcyBpbXBsaWNpdC4KICAgICAgICAgICAgLSBPdGhlciBmaXhlcyBmb3IgT1NTLCB3aGljaCBpcyBub3cgd29ya2luZyBhZ2FpbiB3aXRoIDEuMy4yNS4KCQpWZXJzaW9uIDEuMy4yNCAoRGVjZW1iZXIgMTQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzEyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gRml4IGEgYnVuY2ggb2YgYnVncyByZWxhdGluZyB0byAtcHJveHkgc3VwcG9ydAoJICAgICAgKyBub24tY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIG1lbWJlciBjbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgYWRkZWQgYSAtbm91bml0IGFyZ3VtZW50LCB3aGljaCBkb2VzIG5vdCBleHBvcnQgdGhlIChkZWNsYXJlICh1bml0IC4uLikpCgkgICAgICArIGNvcnJlY3RseSBpbnN0YWxsIHN3aWdjbG9zcHJlZml4LnNjbQoJICAgICAgKyBjb25zdGFudHMgKGVudW1zLCBkZWZpbmVzKSBub3cgY29ycmVjbHkgZXhwb3J0IHdoZW4gdXNpbmcgLXByb3h5CgoxMi8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25maWd1cmUgZml4IGZvciB3aGVuIG1vcmUgdGhhbiBvbmUgdmVyc2lvbiBvZiBqbmlfbWQuaCBpcyBmb3VuZAogICAgICAgICAgICBpbiB0aGUgSmF2YSBpbmNsdWRlIGRpcmVjdG9yeSAod2FzIGdlbmVyYXRpbmcgbG90cyBvZiBzZWQgZXJyb3IKICAgICAgICAgICAgbWVzc2FnZXMpLgoKMTIvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIGFycmF5c19qYXZhLmkgc28gdGhhdCBvbmUgY2FuIGFwcGx5IHRoZSBhcnJheQogICAgICAgICAgICB0eXBlbWFwcyB0byBmdW5jdGlvbnMgdGFraW5nIHBvaW50ZXJzIGFzIGlucHV0LCBlZwoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgJWFwcGx5IGludFtdIHtpbnQqfTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAqYSk7CgoxMi8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgbW9kcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuIE5ldyB0eXBlbWFwcwogICAgICAgICAgICBkaXJlY3RvcmRpc2Nvbm5lY3QgYW5kIGRpcmVjdG9yZGlzY29ubmVjdF9kZXJpdmVkIGZvciB0aGUgCiAgICAgICAgICAgIHN3aWdEaXJlY3RvckRpc2Nvbm5lY3QoKSBtZXRob2QuIEFsc28gZml4IHRvIGdldCB0aGUgamF2YXBhY2thZ2UKICAgICAgICAgICAgdHlwZW1hcCB3b3JraW5nIGFnYWluLgoKMTIvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBGaW5pc2hpbmcgdGhlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzICsgc3BlY2lhbGl6YXRpb25zLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBOb3cgd2UgdXNlIHRoZSBuZXcgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyBpbiB0aGUgc3RkL1NUTCBsaWJyYXJ5LiBUaGF0IG1lYW5zIHRoZSBpbnRlcm5hbAoJICAgICAgc3dpZyBmaWxlcyBhcmUgZ2V0dGluZyB1Z2xpZXIgc2luY2Ugd2Ugbm93IHN1cHBvcnQgdGhlCgkgICAgICBvcmlnaW5hbCBkZWNsYXJhdGlvbnM6CgoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPCBfVHAgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQkuLi4uCgkJfTsKCSAgICAgIAkgICAgIAogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5ID4sCgkgICAgICAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHAgPiA+ID4KICAgICAgICAgICAgICAgIGNsYXNzIG1hcCB7CgkJLi4uLgoJCX07CiAKICAgICAgICAgICAgICBhbmQgdGhlIHVzZXIgY2FuIHVzZSB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcwoKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBzdGQ6OmFsbG9jYXRvcjxpbnQ+ID47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgTXlBbGxvY2F0b3I8aW50PiA+OwoKICAgICAgICAgICAgICBOb3cgd2UgYXJlIGNsb3NlciB0byB0aGUgY2xlYW5pbmcvcmV3cml0aW5nIG9mIHRoZQoJICAgICAgcHl0aG9uIHN0ZC9TVEwgc3VwcG9ydCwgc3VjaCB0aGF0IHdlIHJlY292ZXIgc3VwcG9ydCBmb3IKCSAgICAgIE1TVkMrKyA2LjAsIGFuZCB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwoJICAgICAgdG9vLgoKCjEyLzAyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgdXNpbmcgYSBtZW1iZXIgZW51bQogICAgICAgICAgICBhbmQgdHlwZXNhZmUvcHJvcGVyIGVudW1zIGVuYWJsZWQuCgoxMi8wMS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0eXBlbWFwcyB0byB3b3JrIHdpdGggdGVtcGxhdGVzIGFuZCBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzLCBpZQoKCSAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQiA9IGludD4KICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgfTsKCgkgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxpbnQ+ICp7Li4ufQoJICAgICAgICV0eXBlbWFwKG91dCkgRm9vPGludCxpbnQ+ICp7Li4ufQoKCSAgICAgICBGb288aW50PiAqIGZvbyggRm9vPGludD4gKmYxLCBGb288aW50LGludD4gKmYyKTsKCgkgICAgICBub3cgJ2YxJywgJ2YyJyBhbmQgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlIHRoZSBwcm92aWRlZAoJICAgICAgdHlwZW1hcHMgcHJvcGVybHkuCgoJICAgICAgVGhpcyBpcyBoaWdobHkgbmVlZGVkIGZvciBwcm9wZXIgU1RMIHN1cHBvcnQsIHNlZSBuZXcgCgkgICAgICBzdGRfYmFzaWNfc3RyaW5nLmksIHN0ZF9zc3RyZWFtLmksIGV0Yy4KCgkgICAgLSBBZGRlZCBzdGRfc3N0cmVhbS5pLCBhbmQgZml4IHN0ZF9iYXNpY19zdHJpbmcuaSB0byB1c2UKCSAgICAgIHRoZSBuZXcgdHlwZW1hcHMgKyB0ZW1wbGF0ZSBkZWYuIGFyZyBtZWNoYW5pc20uIEFsc28sCgkgICAgICBhZGRlZCB0aGUgbmVlZGVkIHN0ZF9hbGxvYy5pLiBOb3csIGFsbCB0aGUgY29udGFpbmVycwoJICAgICAgY2FuIGJlIG1vZGlmaWVkIHRvIHN1cHBvcnQgc3RkOjphbGxvY2F0b3IsIGxpa2UgaW46CgkgICAgICAKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQSA9IHN0ZDo6YWxsb2NhdG9yPFQgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQlwdWJsaWM6CgkJLi4uLgoJCX07CgkgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG9ubHkgY29tcGxldGVkIGJ5IG5vdyBmb3IgYmFzaWNfc3RyaW5nLgoKCSAgICAtIEZpeCBmb3Igc21hcnQgcG9pbnRlcnMgKyBtZW1iZXJzICsgZXh0ZW5zaW9uczoKCgkgICAgICAlZXh0ZW5kIEZvbyB7CgkgICAgICAgIGludCBleHRlbnNpb24oaW50IGksIGludCBqKSB7IHJldHVybiBpOyB9CgkJaW50IGV4dGVuc2lvbigpIHsgcmV0dXJuIDE7IH0KCSAgICAgIH0KCgkgICAgICAlaW5saW5lICV7CgoJICAgICAgY2xhc3MgRm9vIHsKCSAgICAgIHB1YmxpYzoKCQlpbnQgeTsKCQlzdGF0aWMgY29uc3QgaW50IHo7CgkgICAgICB9OwogIAoJICAgICAgY2xhc3MgQmFyIHsKCSAgICAgICAgRm9vICpmOwoJICAgICAgcHVibGljOgoJICAgICAgICBCYXIoRm9vICpmKSA6IGYoZikgeyB9CgkJRm9vICpvcGVyYXRvci0+KCkgewoJCSAgcmV0dXJuIGY7CgkJfQoJICAgICAgfTsKCgkgICAgICBub3cgeW91IGNhbiAKCSAgICAgCgkgICAgICBmID0gRm9vKCkKCSAgICAgIGYueSA9IDMKCSAgICAgIGEgPSBmLnoKCSAgICAgIGYtPmV4dGVuc2lvbigpCiAKCSAgICAgIGIgPSBCYXIoZikKCSAgICAgIGIueSA9IDMKCSAgICAgIGEgPSBiLnoKCSAgICAgIGItPmV4dGVuc2lvbigpCgoJICAgIC0gT3RoZXIgc21hbGwgZXJyb3JzIGZpeGVzLCBtb3N0bHkgcHl0aG9uLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGJ1ZyBmaXhlcyBzbyB0aGF0IHRoZSBjb3JyZWN0IGphdmEgdHlwZXMKICAgICAgICAgICAgYW5kIGNhbm9uaWNhbGl6ZWQgdHlwZXMgaW4gdGhlIEpOSSBjb2RlIGFyZSBlbWl0dGVkLiBVc2Ugb2YgdGhlCiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGVzIGluIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBub3cKICAgICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBub24tZGlyZWN0b3IgdHlwZW1hcHMuIFRoZSB0eXBlcyB1c2VkIGZvciAKICAgICAgICAgICAgdHlwZW1hcCBsb29rdXBzIGFyZSBhbHNvIGNvcnJlY3RlZCBpbiBhIGZldyBwbGFjZXMuIElmIHlvdSAKICAgICAgICAgICAgcHJldmlvdXNseSBoYWQgeW91ciBvd24gZGlyZWN0b3IgdHlwZW1hcHMsIGVuc3VyZSB0aGV5IGFyZSB1c2luZyB0aGUKICAgICAgICAgICAgY29ycmVjdCBDKysgdHlwZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbnN0IGVudW0gU1dJR1RZUEUgJiB0eXBlbWFwcyBhZGRlZC4gVGhlc2Ugd3JhcCBjb25zdCBlbnVtIHJlZmVyZW5jZXMKICAgICAgICAgICAgYXMgaWYgdGhleSB3ZXJlIHBhc3NlZCBieSB2YWx1ZS4gQ29uc3QgZW51bSByZWZlcmVuY2VzIHRodXMgd29yayB0aGUKICAgICAgICAgICAgc2FtZSBhcyBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgY29uc3QgZG91YmxlICYsIAogICAgICAgICAgICBjb25zdCBpbnQgJiBldGMuIFR5cGVtYXBzIGFkZGVkIGZvciBKYXZhLCBDIywgUnVieSwgVGNsLCBQZXJsIGFuZCBQaWtlLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgc3BlY2lhbCB2YXJpYWJsZTogJCpqYXZhY2xhc3NuYW1lLCBzaW1pbGFyIHRvICRqYXZhY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCAkJmphdmFjbGFzc25hbWUuIFRoZSBuZXcgb25lIHJlbW92ZXMgYSBwb2ludGVyIGZyb20gdGhlIEMgdHlwZSBiZWZvcmUKICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBKYXZhIGNsYXNzIG5hbWUuIE9uZSBvciBtb3JlIG9mICRqYXZhY2xhc3NuYW1lLAogICAgICAgICAgICAkJmphdmFjbGFzc25hbWUgb3IgJCpqYXZhY2xhc3NuYW1lIG1heSBub3cgYXBwZWFyIGluIGEgdHlwZW1hcC4gTGlrZXdpc2UgZm9yCiAgICAgICAgICAgIEMjIHVzaW5nIGNzY2xhc3NuYW1lIGluc3RlYWQgb2YgamF2YWNsYXNzbmFtZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBsYXN0IHZlc3RpZ2VzIG9mIGVudW1zIGJlaW5nIGhhbmRsZWQgYXMgaW50ZWdlcnMgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICBpbnRlcm5hbHMuIFRoZSB3cmFwcGVyIG1ldGhvZHMgdXNlIHRoZSBlbnVtIHR5cGUgcmF0aGVyIHRoYW4gYW4gaW50CiAgICAgICAgICAgIG5vdy4gVGhlIG5ldCByZXN1bHQgaXMgYWRkZWQgdHlwZSBzYWZldHkgZm9yIGVudW1zIHdoZW4gaGFuZGxlZCBhcwogICAgICAgICAgICBwb2ludGVycywgcmVmZXJlbmNlcyBldGMuIFByZXZpb3VzbHkgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGEgbWV0aG9kCiAgICAgICAgICAgIHRha2luZyBhIHBvaW50ZXIgdG8gYW4gZW51bSwgYSBwb2ludGVyIHRvIGFuIGludCBvciBhIHBvaW50ZXIgdG8gYW4KICAgICAgICAgICAgZW51bSBvZiBzb21lIG90aGVyIHR5cGUgY291bGQgaW5hZHZlcnRhbnRseSBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZC4KICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGVudW0gaXMgbm8gbG9uZ2VyIGJhc2VkIG9uCiAgICAgICAgICAgIGFuIGludCwgYnV0IHRoZSBlbnVtIHR5cGUgaW5zdGVhZC4gQW5vbnltb3VzIGVudW1zIGFyZSBzdGlsbCBoYW5kbGVkCiAgICAgICAgICAgIGFzIGludGVnZXJzLgoKICAgICAgICAgICAgVGhlIGNvbnNlcXVlbmNlIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2UgdXNlcnMgaW4gY29ycmVjdCB1c2FnZSBvZiBlbnVtcwogICAgICAgICAgICBzaG91bGQgbm90IGJlIG5vdGljZWFibGUuIFRoZXJlIGlzIG5vIGNoYW5nZSBmb3IgYW55IG9mIHRoZSBsYW5ndWFnZXMKICAgICAgICAgICAgd2hlcmUgZW51bXMgYXJlIHBhc3NlZCBieSB2YWx1ZSAtIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2lsbAogICAgICAgICAgICBzdGlsbCBhY2NlcHQgYW4gaW50ZWdlciBmb3IgYW4gZW51bSB2YWx1ZSBhbmQgdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgIGxhbmd1YWdlcyBzdGlsbCB1c2UgZWl0aGVyIHR5cGVzYWZlIGVudW1zLCBpbnRlZ2VycyBvciBwcm9wZXIgZW51bXMKICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgY29uZmlndXJlcy4gRm9yIEphdmEgYW5kIEMjIHVzZXJzIGEgY2hhbmdlCiAgICAgICAgICAgIGluIHRoZSB0eXBld3JhcHBlciBjbGFzcyBuYW1lIGhhcyBvY2N1cnJlZCAoZm9yIGVudW0gcG9pbnRlcnMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMgZXRjKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IG9uZT0xLCB0d28gfTsKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMqIG51bWJlcigpOwoKICAgICAgICAgICAgSW4gSmF2YSBhbmQgQyMgdGhpcyBtdXN0IG5vdyBiZSBjb2RlZCBhcwoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX051bWJlcnMgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICByYXRoZXIgdGhhbgoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX2ludCBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvMjAwNDogd3NmdWx0b24vbW1hdHVzCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgZGVwcmVjYXRlZCB3YXJuaW5nIGZvciAlbmFtZSBhbmQgcmVtb3ZlIHJlbWFpbmluZyAlbmFtZQogICAgICAgICAgICB1c2FnZSBpbiB0aGUgU1dJRyBsaWJyYXJpZXMuCgoxMS8yMS8wNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgdGhlIFB5U3dpZ09iamVjdCB0byBiZSB1c2VkIGZvciBjYXJyeWluZwoJICAgICAgdGhlIGluc3RhbmNlIEMvQysrIHBvaW50ZXJzLiBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZgoJICAgICAgc3RyaW5nIGFuZCBQeUNPYmplY3RzLgoKCSAgICAgIFRoZSBuZXcgUHlTd2lnT2JqZWN0IGlzIGV2ZW4gc2FmZXIgdGhhbiBQeUNPYmplY3QsIGFuZAoJICAgICAgbW9yZSBmcmllbmRseSB0aGFuIHBsYWluIHN0cmluZ3M6CgoJICAgICAgbm93IHlvdSBjYW4gZG8KCgkgICAgICAgIHByaW50IGEudGhpcwoJCTxTd2lnIE9iamVjdCBhdCBfMDA2OTE2MDhfcF9BPgoKCQlwcmludCBzdHIoYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EKCgkJcHJpbnQgbG9uZyhhLnRoaXMpCgkJMTM1Njg2NDAwCgoJCXByaW50ICIlcyAweCV4IiAlIChhLnRoaXMsIGEudGhpcykKCQlfMDA2OTE2MDhfcF9BIDB4ODE2NjkwMAoKCSAgICAgIHRoZSBsYXN0IG9uZSBpcyB2ZXJ5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyB0aGUgQy9DKysKCSAgICAgIHNpZGUsIHNpbmNlIGlzIHRoZSBwb2ludGVyIHZhbHVlIHlvdSB3aWxsIHVzdWFsbHkgZ2V0CgkgICAgICBmcm9tIHRoZSBkZWJ1Z2dlci4KCgkgICAgICBBbHNvLCBpZiB5b3UgaGF2ZSBzb21lIG9sZCBjb2RlIHRoYXQgdXNlcyB0aGUgc3RyaW5nCgkgICAgICByZXByZXNlbnRhdGlvbiAiXzAwNjkxNjA4X3BfQSIsIHlvdSBjYW4gdXNlIGl0IG5vdyBhZ2FpbgoJICAgICAgdXNpbmcgJ3N0cihwdHIpJywgb3IgYnkgY2FsbGluZyAnc3RyID0gUHlPYmplY3RfU3RyKG9iaiknCgkgICAgICBpbiB0aGUgQy9DKysgc2lkZS4KIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgbWFpbmx5IGZvciBub3N0YWxnaWMgc3dpZyB1c2VycyB0aGF0IG1pc3MKCSAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGJ1dCBhbHNvIGFsbG93cyB0byBzYXkgYWdhaW4KCgkgICAgICAgIGlmIGEudGhpcyA9PSBiLnRoaXM6CgkJICByZXR1cm4gImEgaXMgYiIKCgkgICAgICBhbmQgd2VsbCwgc2luY2UgdGhlIGNoYW5nZSB3ZXJlIHJlYWxseSBzaW1wbGUsIG1heWJlIGluCgkgICAgICB0aGUgZnV0dXJlIHdlIHdpbGwgYmUgYWJsZSB0byBkbwogICAKCQluZXh0ID0gYS50aGlzICsgMQoKCSAgICAgIG9yIGFkZCBuYXRpdmUgcHl0aG9uIGl0ZXJhdGlvbiBvdmVyIG5hdGl2ZSBDL0MrKyBhcnJheXMsCgkgICAgICBpZSwgbm8gbmVlZCB0byBjcmVhdGUvY29weSBuZXcgdHVwbGVzIHdoZW4gcmV0dXJuaW5nIGFuZAoJICAgICAgYXJyYXkgb3IgdmVjdG9yLgoKCSAgICAgIEFsc28sIGEgUHlTd2lnUGFja2VkIG9iamVjdCB3YXMgYWRkaW5nIHRvIGNhcnJ5IGEgbWVtYmVyCgkgICAgICBtZXRob2QgcG9pbnRlciwgYnV0IHRoaXMgaXMgcHJvYmFibHkgYSB0ZW1wb3JhbCBzb2x1dGlvbgoJICAgICAgdW50aWwgYSBtb3JlIGdlbmVyYWwgb2JqZWN0IGZvciBtZXRob2RzIGlzIGFkZGVkLgoKCSAgICAgIEJlIGF3YXJlIHRoYXQgdG8gc2ltcGxpZnkgbWFpbnRhaW5pbmcgYW5kIGNvbXBhdGliaWxpdHkKCSAgICAgIHdpdGggb3RoZXIgdG9vbHMsIHRoZSBvbGQgc3RyaW5nIGFuZCBQeUNPYmplY3RzCgkgICAgICByZXByZXNlbnRhdGlvbiBjb3VsZCBkaXNhcHBlYXIgdmVyeSBzb29uLCBhbmQgdGhlCgkgICAgICBTV0lHX0NPQkpFQ1RTX1RZUEVTIG9yIFNXSUdfTk9fT0JKRUNUX1RZUEVTIG1hY3JvcyB3aWxsCgkgICAgICBoYXZlIG5vIGVmZmVjdCBhdCBjb21waWxhdGlvbiB0aW1lLiBTdGlsbCwgdGhlIHRocmVlCgkgICAgICBtZWNoYW5pc21zIGFyZSBwcmVzZW50IGluIHRoZSBjb2RlIGp1c3QgZm9yIHRlc3RpbmcsCgkgICAgICBkZWJ1Z2dpbmcgYW5kIGNvbXBhcmlzb24gcHVycG9zZXMuCgkgICAgICAKMTEvMjEvMDQ6IG1tYXR1cwoKCSAgICAtIFtQeXRob25dIEFkZGluZyBiYWNrIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBzd2lnIHJ1bnRpbWUgY29kZQoJICAgICAgaW5zaWRlIHRoZSB1c2VyIGNvZGUuIFdlIGp1c3QgYWxsb3cgdGhlIHVzZXIgdG8gaW5jbHVkZQoJICAgICAgdGhlIG1pbmltYWwgY29kZSBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBydW50aW1lCgkgICAgICBtZWNoYW5pc20gc3RhdGljYWxseSwganVzdCBhcyBpbiBkb25lIGluIHRoZSBzd2lnCgkgICAgICBtb2R1bGVzLgoJICAgICAgCgkgICAgICBUbyB1c2UgdGhlIHN3aWcgcnVudGltZSBjb2RlLCBmb3IgZXhhbXBsZSB3aXRoIHB5dGhvbiwKCSAgICAgIHRoZSB1c2VyIG5lZWRzIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAjaW5jbHVkZSA8UHl0aG9uLmg+ICAgICAgICAgLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8c3dpZ3J1bi5zd2c+CiAgICAgICAgICAgICAgICNpbmNsdWRlIDxweXRob24vcHlydW4uc3dnPiAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxydW50aW1lLnN3Zz4KCgkgICAgICB0aGUgZmlsZXMgc3dpZ3J1bi5zd2csIHB5cnVuLnN3ZyBhbmQgcnVudGltZS5zd2cgY2FuIAoJICAgICAgYmUgY2hlY2tlZCBvdXQgYnkgdXNpbmcgc3dpZyAtY28sIG9yIHRoZXkgY2FuIHNpbXBseSAKCSAgICAgIGJlIGZvdW5kIGJ5IGFkZGluZyB0aGUgc3dpZyBsaWIgZGlyZWN0b3J5IHRvIHRoZQoJICAgICAgY29tcGlsZXIgaW5jbHVkZSBkaXJlY3RvcnkgbGlzdCwgZm9yIGV4YW1wbGUKCgkgICAgICAgU1dJR0xJQj1gc3dpZyAtc3dpZ2xpYmAKCSAgICAgICBjKysgLUkke1NXSUdMSUJ9IC4uCgoJICAgICAgb2YgYmV0dGVyLCB1c2luZyB0aGUgQ1BQRkxBR1MsIGJ1dCB0aGF0IGRlcGVuZHMgb24geW91cgoJICAgICAgZW52aXJvbm1lbnQuCgkgICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBjYW4gYmUgcG9ydGVkIHRvIHRoZSBvdGhlciBsYW5ndWFnZXMgdG9vLAoJICAgICAgeW91IGp1c3QgbmVlZCB0byBpc29sYXRlIHRoZSBuZWVkZWQgcnVudGltZSBjb2RlIGluCgkgICAgICBhIHNpbmdsZSBmaWxlIGxpa2UgJ3B5cnVuLnN3ZycsIGFuZCBwcm92aWRlIHRoZSAKCSAgICAgIFNXSUdfUnVudGltZV9HZXRUeXBlTGlzdCgpIG1ldGhvZC4gTG9vayBhdCB0aGUKCSAgICAgIExpYi9weXRob24vcHlydW4uc3dnIGZpbGUgYW5kIHRoZSBFeGFtcGxlcy9weXRob24vc3dpZ3J1bgoJICAgICAgZXhhbXBsZS4KCjExLzE1LzA0OiBtbWF0dXMKCSAgICAtIEZpeCBtaXhlZF90eXBlcy5pICsgZ2NjLTMuNCwgaWUsIGFycmF5cyArIHJlZmVyZW5jZXMgKwoJICAgICAgdHlwZWRlZnMKCgkgICAgLSBGaXggbXVsdGlkaW0gYXJyYXlzICsgdHlwZWRlZnMsaWUKCgkgICAgICAgdHlwZWRlZiBjaGFyIGNoYXJhY3RlclsxXTsKCSAgICAgICB0eXBlZGVmIGNoYXJhY3RlciB3b3JkWzY0XTsKCgkgICAgLSBQcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIGJhc2VzIGluIHRoZSBzYW1lIHdheSBiZWZvcmUKCSAgICAgIHdlIHByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgbWVtYmVycywgaWUsIHdlIGNoZWNrCgkgICAgICBmb3IgY29uc3RydWN0b3JzLCBvcGVyYXRvciBuZXcsIHZpcnR1YWwgbWVtYmVycywgZXRjLgogICAKCSAgICAtIEZpeCBSdWJ5L0phdmEgdG8gd29yayAob3IgaWdub3JlKSBtdWx0aS1pbmhlcml0YW5jZSArCiAgICAgICAgICAgICAgZGlyZWN0b3JzLiBBbGxvdyBvdGhlciBsYW5ndWFnZXMgdG8gZGVmaW5lIGlmIGl0IGlzCiAgICAgICAgICAgICAgc3VwcG9ydGVkIG9yIG5vdC4KCSAgICAKCSAgICAtIE5vdyB5b3UgY2FuIHJ1bgoKICAgICAgICAgICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1kaXJlY3RvcnMgLWRpcnByb3QiIAogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLW9jYW1sLXRlc3Qtc3VpdGUKCgkgICAgICBhbmQgeW91IHdpbGwgZ2V0IG9ubHkgJ3JlYWwnIGVycm9ycy4gcnVieSBhbmQgcHl0aG9uCgkgICAgICBjb21waWxlIHdpdGggbm8gZXJyb3JzLCBqYXZhIHNob3dzIHNvbWUgcHJvYmxlbXMuCQoKVmVyc2lvbiAxLjMuMjMgKE5vdmVtYmVyIDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTgyNzUzIGZyb20gRmFicmljZSBTYWx2YWlyZTogQWRkcyBkZXBlbmRlbmNpZXMgZ2VuZXJhdGlvbiBmb3IKICAgICAgICAgICAgY29uc3RydWN0aW5nIG1ha2VmaWxlcy4gTmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIC1NRiAtTUQgLU1NRCB0byB3b3JrCiAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgb3B0aW9ucyAtTSBhbmQgLU1NLiBUaGVzZSBvcHRpb25zIGFyZSBuYW1lZCB0aGUgc2FtZQogICAgICAgICAgICBhbmQgd29yayB0aGUgc2FtZSBhcyBpbiBnY2MuCgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlaWdub3JlLyVyZW5hbWUgY2hhbmdlcyBmb3IgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHRvIG1pcnJvcgogICAgICAgICAgICAlZmVhdHVyZSBiZWhhdmlvdXIuIFNlZSBwcmV2aW91cyBlbnRyeS4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgZmluZSB0dW5pbmcgd2hlbiB3cmFwcGluZyBtZXRob2RzIHdpdGgKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMuIEFueSAlZmVhdHVyZSB0YXJnZXRpbmcgYSBtZXRob2Qgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaWYgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUuIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUKICAgICAgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZSwgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG1hdGNoIHRoYXQgZXhhY3QKICAgICAgICAgICAgd3JhcHBlciBtZXRob2Qgb25seSBhbmQgbm90IHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgd2lsbCBhcHBseSB0aGUgZmVhdHVyZSB0byBhbGwgdGhyZWUgd3JhcHBlciBtZXRob2RzLCB0aGF0IGlzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG9ubHkgYXBwbHkgdG8gdGhpcyB3cmFwcGVyIG1ldGhvZDoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwoKICAgICAgICAgICBhbmQgbm90IHRoZXNlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbWFrZSAlZmVhdHVyZSBtb3JlIHBvd2VyZnVsIHRvIGVhc2UgdGhlIG1pZ3JhdGlvbgogICAgICAgICAgIHRvIG5ldyBkZWZhdWx0IGFyZ3VtZW50cyB3cmFwcGluZyBhcHByb2FjaC4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgSWYgeW91IHByZXZpb3VzbHkgaGFkIGEgJWZlYXR1cmUgYW5kIGRpZG4ndCBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFyZ3VtZW50cywKICAgICAgICAgICB5b3Ugd2lsbCBoYXZlIHRvIGFkZCB0aGVtIGluIG5vdyBvciB5b3UgY2FuIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyCiAgICAgICAgICAgYnkgdXNpbmcgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpLgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwcyBmb3Igc3RkOjp2ZWN0b3IgYWRkZWQgaW50byBzdGRfdmVjdG9yLmkuIFRoZSBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIGdlbmVyYXRlZCBhcmUgbW9kZWxsZWQgb24gdGhlIC5ORVQgQXJyYXlMaXN0IGNsYXNzLiBUaGlzIGlzbid0IHF1aXRlCiAgICAgICAgICAgIHJlYWR5IGZvciBnZW5lcmFsIGNvbnN1bXB0aW9uIHlldCwgYnV0IHdpbGwgd29yayB3aXRoIHZlY3RvcnMgb2YgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIGFuZCBzb21lIGNsYXNzZXMuCgoxMC8zLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbR1VJTEVdIFRoZSAtc2NtIGludGVyZmFjZSBpcyBub3cgdGhlIGRlZmF1bHQuICBUaGUgb2xkIEdIIGludGVyZmFjZSBjYW4KCSAgICBzdGlsbCBiZSBlbmFibGVkIGJ5IHBhc3NpbmcgLWdoIHRvIFNXSUcuCgoxMC8yLzIwMDQ6IG1tYXR1cwoKCSAgICAtIE1vcmUgZml4ZXMgZm9yIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucy4KCSAgICAgIEFzIGFuIGV4dHJhIGJvbnVzLCB3ZSBnZXQgJXRlbXBsYXRlIHN1cHBvcnQgZm9yIHN0YXRpYy9tZW1iZXJzIGNsYXNzCgkgICAgICBtZXRob2RzLCBpZSwgbm93IHlvdSBjYW4gc2F5OgoKCSAgICAgICAgbmFtZXNwYWNlIHNwYWNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQQkJCSAgICAKCSAgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JICAgIAoJICAgICAgICAgICBzdGF0aWMgdm9pZCBmb29UKFkgeSkgeyB9CgkgICAgICAgICB9OwkKCQl9CQkJICAgIAoJICAgICAgCSAgICAgIAkJCSAgICAKCSAgICAgICAgc3RydWN0IEIJCQkgICAgCgkgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkJICAgIAoJICAgICAgICAgIHZvaWQgYmFyVChZIHkpIHt9IAoJICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGludD47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8Y2hhcj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8aW50PjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGNoYXI+OwoKCSAgICAgIGFuZCBjYWxsCgoJICAgICAgICBBLmZvbygxKQoJCWIgPSBCKCkKCQliLmJhcigxKQoJICAgICAgCgkgICAgICBub3RlIHRoZSBtZXRob2RzIGFyZSBlbWl0dGVkIGluc2lkZSB0aGUgY2xhc3NlcywKCSAgICAgIGFuZCBoZW5jZSwgdGhlICV0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byB0aGUgJ21lbWJlcicKCSAgICAgIG1ldGhvZCBuYW1lLCBub3QgYSBnbG9iYWwgbmFtZXNwYWNlIG5hbWUuCgoxMC8zMS8yMDA0OiBtbWF0dXMKCSAgICAtIFNvbHZlIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucywgYXMgaW4KCgkgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEJhcjsKCQkgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgc3RydWN0IGZvbzo6QmFyIDogRm9vIHsKICAgICAgICAgICAgICAgfTsKCgkgICAgICAgc2VlIG5hbWVzcGFjZV9jbGFzcy5pIGZvciBtb3JlIGV4YW1wbGVzLgoKICAgICAgICAgICAgLSBGaXggJXRlbXBsYXRlIGRpcmVjdGl2ZSB0byBwcm9wZXJseSB1c2UgbmFtZXNwYWNlcywKICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIGNhc2U6CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CgkJICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJCSAgICAgICBzdHJ1Y3QgUHRyIHt9OwogICAgICAgICAgICAgICAgICAgfQoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewkJICAKCQkgICAgICAgc3RydWN0IE9iajEge307CgkJICAgICAgIHR5cGVkZWYgUHRyPE9iajE+IE9iajFfcHRyOwogIAkJICAgICAgICV0ZW1wbGF0ZShPYmoxX3B0cikgUHRyPE9iajE+OyAKCQkgICB9CQkJCSAgCgkJICAgCQkJCSAgCgkJICAgbmFtZXNwYWNlIHR3byAgCgkJICAgewoJCSAgICAgICBzdHJ1Y3QgT2JqMiB7fTsJCgkJICAgICAgIHR5cGVkZWYgb25lOjpQdHI8T2JqMj4gT2JqMl9wdHI7CgkJICAgICAgICV0ZW1wbGF0ZShPYmoyX3B0cikgb25lOjpQdHI8T2JqMj47CgkJICAgfQoKCSAgICAgIHRoaXMgaXMgZG9uZSBieSB1c2luZyB0aGUgbmFtZXNwYWNlIG5hbWUgJ29uZScgdG8gY3JlYXRlCiAgICAgICAgICAgICAgYSBuYW1lc3BhY2Ugbm9kZSB0byBlbWl0IHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLAogICAgICAgICAgICAgIGp1c3QgYXMgYmVmb3JlLCBidXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHJlc29sdmVkCiAgICAgICAgICAgICAgYW5kIHF1YWxpZmllZCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UgKCdvbmUnIG9yICd0d28nKS4KICAgICAgICAgICAgICBUaGlzIGlzIHNhbWUgd2F5IHRoYXQgdHlwZWRlZiB3b3Jrcy4gCgoJICAgICAgVGhpcyByZXNvbHZlIHRoZSBzbWFydF9wb2ludGVyX25hbWVzcGFjZTIuaSBjYXNlLCBhbmQgYXQKICAgICAgICAgICAgICB0aGUgc2FtZSB0aW1lLCBzZXZlcmFsIG90aGVyIG9uZXMgd2hlcmUgYmVmb3JlIHN3aWcgd2FzCiAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUKCgkgICAgICAgICJDYW4ndCBpbnN0YW50aWF0ZSB0ZW1wbGF0ZSAneHgnIGluc2lkZSBuYW1lc3BhY2UgJ3l5JyIKCSAgICAgIAoJICAgICAgZXJyb3IgbWVzc2FnZS4gSW4gZmFjdCwgdGhhdCBlcnJvciBkb2Vzbid0IGV4aXN0CgkgICAgICBhbnltb3JlLiBZb3UgY2FuIG9ubHkgZ2V0IGFuIGVycm9yIGlmIHlvdSB1c2UgYSBiYWQKCSAgICAgIG5hbWVzcGFjZSBuYW1lIG9yIHNvLgoKMTAvMzAvMjAwNDogbW1hdHVzCgkgICAgLSBbcnVieV0gRGlyZWN0b3JzIGZpeGVzOgoJICAgICAgLSBlbnVtcyBhbmQgc3RkOjpzdHJpbmdzIGFyZSB3b3JraW5nIG5vdyAoc2V2ZXJhbAoJICAgICAgICByZXBvcnRzIGluIGJ1ZyB0cmFjayBzeXN0ZW0pCgkgICAgICAtIGFkZGVkIHBhdGNoIDEwMjU4NjEgZm9yIGRpcmVjdG9yICsgZXhjZXB0aW9ucwoJCQogICAgICAgICAgICAgICoqKiBBdHRlbnRpb24gKioqOiBydWJ5IHdpdGggZGlyZWN0b3JzICsgcHJvdGVjdGVkCiAgICAgICAgICAgICAgbWVtYmVycyB3b3JrIHdpdGggdmVyc2lvbiAxLjcrLiBPbGRlciB2ZXJzaW9ucyBzZWVtcyB0bwogICAgICAgICAgICAgIGhhdmUgYSBicm9rZW4gc2lnbmF0dXJlIGZvcidyYl9wcm90ZWN0Jy4KCQkKCSAgICAgIElmIHlvdSBuZWVkIHRvIHVzZSBhbiBvbGQgdmVyc2lvbiwgbG9vayBhdAoKCSAgICAgIGh0dHA6Ly9leGNydWJ5LnNvdXJjZWZvcmdlLm5ldC9kb2NzL2h0bWwvcnVieV9faGFja3NfOGhwcC1zb3VyY2UuaHRtbAogIAkgICAgICBmb3Igd29ya2Fyb3VuZHMuCgkgICAgICAKICAgICAgICAgICAgLSBbcnVieV0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gdHlwZW1hcCAoYnVnIDEwMzcyNTkpCgoJICAgIC0gW3RjbF0gRml4IChlbnVtc3xjb25zdGFudHMpICsgbmFtZXNwYWNlIG9wdGlvbiAKCSAgICAgICAgICAgIChyZXBvcnRlZCBieSBqYXNvbi5tLnN1cnByaXNlQGludGVsLmNvbSkuCgogICAgICAgICAgICAtIFtwZXJsXSBBZGQgcGF0Y2ggOTYyMTY4IGZvciBtdWx0aXBsZSBpbmhlcmV0YW5jZQoJICAgIAoJICAgIC0gRml4ICdkZWZpbmVkJyBhcyB2YXJpYWJsZSBuYW1lLgoKMTAvMjkvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yIHVzZWQgZm9yIGZyaWVuZCBtZXRob2RzOgoKICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIGZyaWVuZCB2b2lkIDo6Z2xvYmFsc2NvcGUoKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgoxMC8yOC8yMDA0Om1tYXR1cwoJICAgIC0gQWRkZWQgbW9kdWxlIGFuZCBzd2lnIG9wdGlvbiAidGVtcGxhdGVyZWR1Y2UiIHRvIGZvcmNlIHN3aWcKCSAgICAgIHRvIHJlZHVjZSBhbnkgdHlwZSBuZWVkZWQgd2l0aCB0ZW1wbGF0ZXMsIGllLCBpbiB0aGVzZSBjYXNlcwoKICAgICAgICAgICAgICAgICVtb2R1bGUoInRlbXBsYXRlcmVkdWNlIikgdGVzdAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQSB7IH07CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50OwoJICAgICAgICAldGVtcGxhdGUoQV9JbnQpIEE8SW50PiAgPT0+ICAldGVtcGxhdGUoQV9JbnQpIEE8aW50PgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgQiogQnA7CgkgICAgICAgICV0ZW1wbGF0ZShBX0JwKSBBPEJwPiAgPT0+ICAldGVtcGxhdGUoQV9CcCkgQTxCKj4KCiAgICAgICAgICAgICAgc3dpZyByZWR1Y2VzIHRoZSB0eXBlcyBJbnQgYW5kIEJwIHRvIHRoZWlyIHByaW1pdGl2ZXMKICAgICAgICAgICAgICBpbnQgYW5kIEIqLiBUaGlzIGlzIGNsb3NlciB0byB0aGUgdXN1YWwgY29tcGlsZXIKICAgICAgICAgICAgICByZXNvbHV0aW9uIG1lY2hhbmlzbSwgYW5kIGl0IGlzIHJlYWxseSBuZWVkZWQgc29tZXRpbWVzCiAgICAgICAgICAgICAgd2hlbiB5b3UgbWl4IHRlbXBsYXRlcyArIHR5cGVkZWZzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAgIERvbid0IHVzZSBpdCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgcHJvYmxlbSBhbHJlYWR5LAoJICAgICAgc2luY2UgdGhlIHR5cGUgcmVkdWN0aW9uIGNhbiBpbnRlcmZlcmUgd2l0aCBzb21lCgkgICAgICB1c2VyIHR5cGVtYXBzLCBzcGVjaWFsbHkgaWYgeW91IGRlZmluZWQgc29tZXRoaW5nIGxpa2UKCgkJICAgdHlwZWRlZiBpbnQgSW50OwoJCSAgICV0eXBlbWFwKGluKSBJbnQgLi4uOwoKICAgICAgICAgICAgICBpbiB0aGlzIGNhc2UsIHdoZW4geW91IHVzZSB0aGUgInRlbXBsYXRlcmVkdWNlIiBvcHRpb24sCgkgICAgICBzd2lnIHdpbGwgaWdub3JlIHRoZSB1c2VyIHR5cGVtYXAsIHNpbmNlIHRoZSAidHlwZWRlZiBpbnQgSW50IgoJICAgICAgd2lsbCB0YWtlIHByZWNlZGVuY2UsIGFuZCB0aGUgdXN1YWwgImludCIgdHlwZW1hcCB3aWxsIGJlCgkgICAgICBhcHBsaWVkLiAKCgkgICAgICBOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGNhc2UgaXMgbm90IGNvbW1vbiwgYW5kIHNob3VsZCBiZQoJICAgICAgYXZvaWRlZCwgaWUsIGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYSB0eXBlZGVmIGFuZCBhCgkgICAgICB0eXBlbWFwIGF0IHRoZSBzYW1lIHRpbWUsIHNwZWNpYWxseSBpZiB5b3UgYXJlIGdvaW5nIHRvCgkgICAgICB1c2UgdGVtcGxhdGVzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAtIERpcmVjdG9yczoKCgkgICAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvciBpcyBhbHdheXMgZW1pdHRlZCBub3csIHRoaXMgZG9lc24ndAoJICAgICAgICBjYXVzZSBhbnkgaGFybSwgYW5kIGNvdWxkIHNvbHZlIHNvbWUgbmFzdHkgYW5kCgkgICAgICAgIG15c3RlcmlvdXMgZXJyb3JzLCBsaWtlIHRoZSBvbmUgbWVudGlvbmVkIGJ5IFNjb3R0LgoKCQlhbHNvIHRoZSBkZXN0cnVjdG9yIGlzIG5vdCBpbi1saW5lZCwgc28sIHRoYXQgY2FuIHNvbHZlCgkJc29tZSBvdGhlciBteXN0ZXJpb3VzIGVycm9ycyB3aGVuIG1peGluZyBkaXJlY3RvcnMgKwoJCWltcG9ydHMgKyBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgKyBzb21lIHNwZWNpZmljIGNvbXBpbGVycy4KCQkKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSB0eXBlbWFwcy5pIGxpYnJhcnkgZmlsZSB3aXRoIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGFkZGVkLgoKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwIGZpeGVzIGluIHN0ZF9zdHJpbmcuaSBmcm9tIFJ1c3NlbGwgS2VpdGgtTWFnZWUuCgoxMC8yNS8yMDA0OiBtbWF0dXMgCgoJICAgIC0gVXNpbmcgKyBuYW1lc3BhY2UgaXMgd29ya2luZyBub3cgKHVzaW5nX25hbWVzcGFjZS5pKS4KCgkgICAgLSBEZXJpdmVkICsgbmVzdGVkIGNsYXNzZXMgaXMgd29ya2luZyBub3cKCSAgICAgIChkZXJpdmVyX25lc3RlZC5pKSwgYnV0IG9mIGNvdXJzZSwgd2UgYXJlIHN0aWxsIHdhaXRpbmcKCSAgICAgIGZvciB0aGUgbmVzdGVkIGNsYXNzIHN1cHBvcnQuCgkgICAgCgkgICAgLSBEaXJlY3RvcnM6CgkgICAgICAtIHVubmFtZWQgcGFyYW1ldGVycyBzdXBwb3J0LAoKCSAgICAgIC0gcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHN1cHBvcnQgKGF1dG9tYXRpYyBhbmQgd2l0aAogICAgICAgICAgICAgICAgZGlycHJvdCBtb2RlKSwKCgkgICAgICAtIGRldGVjdGlvbiBvZiByZWFsbHkgbmVlZGVkIHByb3RlY3RlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgIChtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMpIG5vdyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgICAgICBFdmVuIGlmIHlvdSBkb24ndCB1c2UgdGhlICdkaXJwcm90JyBtb2RlLCBzd2lnIHdpbGwKICAgICAgICAgICAgICAgIHdyYXAgd2hhdCBpcyBtaW5pbWFsbHkgbmVlZGVkIChhbmQgcHJvdGVjdGVkKSBmb3IgdGhlCiAgICAgICAgICAgICAgICBjb2RlIHRvIGNvbXBpbGUuCgkJCgkJd2hhdCBpcyBwdWJsaWMsIGFzIHVzdWFsLCBpcyBhbHdheXMgd3JhcHBlZCwgYW5kIGlmCgkJeW91IHVzZSB0aGUgJ2RpcnBvcnQnCgkJCgoJICAgIC0gRmluYWwgZml4ZXMgZm9yIHRoZSBPU1MgdG8gY29tcGlsZSB3aXRoIFNXSUcgMS4zLjIzIChteQoJICAgICAgdmVyeSB2ZXJ5IHVnbHkgQysrICsgdGVtcGxhdGVzICsgZXZlcnl0aGluZyBtb3VudGVycyB3cmFwKS4KCjEwLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtZGxsaW1wb3J0LiBUaGlzIGVuYWJsZXMgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIERMTCBmb3IgdGhlIERsbEltcG9ydCBhdHRyaWJ1dGUuIE5vcm1hbGx5IHRoaXMgbmFtZQogICAgICAgICAgICBjb21lcyBmcm9tIHRoZSBtb2R1bGUgbmFtZSwgc28gbm93IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoaXM6CgogICAgICAgICAgICAgIHN3aWcgLWNzaGFycCAtZGxsaW1wb3J0IHh5eiBleGFtcGxlLmkKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgZm9yIGFsbCB0aGUgd3JhcHBlZCBQSW52b2tlIG1ldGhvZHM6CgogICAgICAgICAgICAgIFtEbGxJbXBvcnQoInh5eiIsIEVudHJ5UG9pbnQ9Ii4uLiIpXQogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIC4uLgoKICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZyb20gbWFueSBkaWZmZXJlbnQgU1dJRyBpbnZvY2F0aW9ucyBjYW4gdGh1cyBiZSBjb21waWxlZAogICAgICAgICAgICBpbnRvIG9uZSBETEwuCgogICAgICAgICAgICBBIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRkbGxpbXBvcnQgY2FuIGFsc28gYmUgdXNlZCBpbiB0eXBlbWFwcywgcHJhZ21hcywKICAgICAgICAgICAgZmVhdHVyZXMgZXRjLiBUaGlzIHdpbGwgZ2V0IHRyYW5zbGF0ZWQgaW50byB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IC1kbGxpbXBvcnQKICAgICAgICAgICAgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgdGhlIG1vZHVsZSBuYW1lLgoKMTAvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxMDQ5NDk2IGZyb20gU2NvdHQgTWljaGVsIGZpeGVzIGRpcmVjdG9ycyBtZXRob2RzIHdpdGggCiAgICAgICAgICAgIGVudW1zIHdoZW4gd3JhcHBlZCB3aXRoIHR5cGVzYWZlIG9yIHByb3BlciBKYXZhIGVudW1zLgoKMTAvMjEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGluIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyAoUHl0aG9uLCBSdWJ5LCBPY2FtbCkuCgoxMC8yMS8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1jcGx1c2Nhc3QnIG9wdGlvbiB0byBlbmFibGUgdGhlICduZXcnCgkgICAgICBDKysgY2FzdGluZyBvcGVyYXRvcnMsIHN1Y2ggYXMgJ3N0YXRpY19jYXN0JywgaW5zaWRlIHRoZQoJICAgICAgdHlwZW1hcHMuIEJ5IGRlZmF1bHQgc3dpZyB1c2UgdGhlIG9sZCBDIGNhc3Qgc3R5bGUsIGV2ZW4KCSAgICAgIHdoZW4gcGFyc2luZyBDKysuCgkgICAgICAKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1uZXdfdndtJyBvcHRpb24gdG8gZW5hYmxlIHRoZSBuZXcKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyIG1vZGUuIE5vdyB0aGlzIGlzIG1haW5seSBmb3IgdGVzdGluZwogICAgICAgICAgICAgIHRoYXQgdGhlIHR5cGVtYXBzIGFyZSByZWFsbHkgc2FmZSBmb3IgYW55IGZ1dHVyZQogICAgICAgICAgICAgIHNvbHV0aW9uLCBidXQgeW91IGNhbiB1c2UgaXQgaWYgeW91IGhhdmUgYSB2ZXJ5IHN0cmFuZ2UKICAgICAgICAgICAgICBlcnJvciB3aXRoIGRlZmF1bHQgY29zbnRydWN0b3JzIG1pc3NpbmcgKyAlYXBwbHkgKwogICAgICAgICAgICAgICV0eXBlbWFwLCBhbmQgaWYgZXZlcnl0aGluZyBlbHNlIGZhaWxzIChzZWUKICAgICAgICAgICAgICB2YWx1d3JhcHBlcl9vcGFxdWUuaSBmb3IgYWx0ZXJuYXRpdmUgYW5kIGN1cnJlbnQKICAgICAgICAgICAgICBzb2x1dGlvbnMpLiBJZiB5b3UgYXJlIGEgdXNlciB0aGF0IGRvbid0IGtub3cgd2hhdCBpcwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGRvbid0IGV2ZW4gdHJ5IGl0LgoKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1ub2gnIG9wdGlvbiB0byBiZSB1c2VkIHdpdGggZGlyZWN0b3JzCgkgICAgICBhbmQgd2hlbiB5b3UgcHJlZmVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCgkgICAgICBkaXJlY3RvciBoZWFkZXIgZmlsZS4gSWYgbm90IHVzZWQsIHN3aWcgd2lsbCB3b3JrIGFzCgkgICAgICB1c3VhbCBnZW5lcmF0aW5nIGJvdGggdGhlIHdyYXAuY3h4IGFuZCB3cmFwLmggZmlsZXMuIElmCgkgICAgICB5b3UgdXNlIGl0LCBzd2lnIHdpbGwgb25seSBnZW5lcmF0ZSB3cmFwLmN4eC4KCjEwLzIxLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIElmIHlvdSBkZWZpbmUgU1dJR19UWVBFX1RBQkxFIHdoZW4gY29tcGlsaW5nIGEgd3JhcHBlciBmaWxlLAoJICAgICAgdGhlIHJ1bnRpbWUgdHlwZXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGdpdmVuIHR5cGUgdGFibGUgbmFtZS4KCSAgICAgIFVzaW5nIHRoaXMsIHlvdSBjYW4gc2VwZXJhdGUgZGlmZmVyZW50IG1vZHVsZXMgdG8gc2hhcmUgdGhlaXIKCSAgICAgIG93biB0eXBlIHN5c3RlbXMuICAtRFNXSUdfVFlQRV9UQUJMRT1NeXRhYmxlCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX1NUQVRJQ19SVU5USU1FIHRoZW4gdGhlIHR5cGUgaW5mb3JtYXRpb24KCSAgICAgIHdpbGwgYmUgc3RhdGljIHRvIHRoaXMgd3JhcHBlci4gIE5vdGhpbmcgd2lsbCBiZSBzaGFyZWQgd2l0aCBhbnkKCSAgICAgIG90aGVyIG1vZHVsZXMKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfTElOS19SVU5USU1FLCB0aGVuIGluc3RlYWQgb2YgdXNpbmcKCSAgICAgIHRoZSBuZXcgd2F5IG9mIHNoYXJpbmcgdHlwZSBpbmZvcm1hdGlvbiwgdGhlIHdyYXBwZXIgd2lsbCBleHBlY3QKCSAgICAgIHRvIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBMaWIvbGlua3J1bnRpbWUuYyBmaWxlLiAgQW55IG1vZHVsZXMgY29tcGlsZWQKCSAgICAgIHdpdGggU1dJR19MSU5LX1JVTlRJTUUgYW5kIGxpbmtlZCBhZ2FpbnN0IGxpbmtydW50aW1lLmMgd2lsbCBhbGwKCSAgICAgIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24uCgoxMC8yMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEluaXRpYWwgZml4IGZvciBweXRob24vaW1wb3J0IGV4YW1wbGUuIFBsZWFzZQoJICAgICAgdXBkYXRlIHRoZSBNYWtlZmlsZSAoYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLCBleHBlcnQpLAoJICAgICAgc2luY2Ugbm93IHByb2JhYmx5IGlzIG9ubHkgd29ya2luZyB3aXRoIGcrKywgaWNjIGFuZCBhCgkgICAgICBmZXcgb3RoZXIgY29tcGlsZXJzIHRoYXQgaGF2ZSB0aGUgLXNoYXJlZCBvcHRpb24uCgoJICAgICAgV2UgbmVlZCB0byBjcmVhdGUgYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyaWVzIGZvciB0aGUKCSAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvcnMuIE9sZCBhbmQgdXN1YWxseSBmb3Jnb3R0ZW4gQysrCgkgICAgICByZXF1aXJlbWVudC4KCSAgICAgIAoJICAgICAgU2FtZSBmaXggbmVlZCB0byBiZSB1c2VkIGluIHBlcmwsIEkgdGhpbmsuCgogICAgICAgICAgICAtIFtQeXRob25dIEZpeCBnZW5lcmF0aW9uIG9mIGhlYWRlciBmaWxlIGZvciBkaXJlY3RvcnMsCiAgICAgICAgICAgICAgbm93IGRpcmVjdG9ycy5zd2cgaXMgYWxzbyBpbmNsdWRlZCwgc28sIGl0IGNhbiBiZSByZWFsbHkKCSAgICAgIHVzZWQgZnJvbSBDKyssIGFuZCBpdCBzb2x2ZXMgc29tZSBwcm9ibGVtIHdpdGggY29tcGlsZXIKCSAgICAgIHRoYXQgcmVxdWlyZSB0aGF0LCBldmVuIHdpdGggdGhlIHNpbXBsZSBzd2lnIGluY2x1c2lvbi4gIAoKICAgICAgICAgICAgLSBbUHl0aG9uXSBSZW9yZGVyaW5nIHRoZSBtZXRob2RzIGFuZCBtb3Zpbmcgc29tZSBib2RpZXMKICAgICAgICAgICAgICBvdXRzaWRlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgZHVlIHRvCiAgICAgICAgICAgICAgc29tZSBnY2MtMi45NiBpbnRlcm5hbCBjb21waWxlciBlcnJvcnMuIEl0IHNlZW1zIHRoZQogICAgICAgICAgICAgIFBZVEhPTiBjbGFzcyBpcyBnZXR0aW5nIHRvbyBsYXJnZSB0byBiZWVuIGRlY2xhcmVkIGFuZAogICAgICAgICAgICAgIGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgLSBBZGQgdGhlIC1vaCBvcHRpb24gdG8gY2hhbmdlIHRoZSBvdXRwdXQgaGVhZGVyIGZpbGUgbmFtZQogICAgICAgICAgICAgIGlmIG5lZWRlZDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgLW9oIHRlc3QuSEgKCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbWFpbmx5IG5lZWRlZCB3aGVuIHVzaW5nIGRpcmVjdG9ycywgYW5kIGlmIHRoZQogICAgICAgICAgICAgIGN1cnJlbnQgZGVmYXVsdCBoZWFkZXIgZmlsZSBuYW1lIGlzIG5vdCBnb29kIGZvciB5b3UsCiAgICAgICAgICAgICAgd2hpY2ggaXMgZ2VuZXJhdGVkIGFzIGZvbGxvdzoJICAgICAgCgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAgICAgICAgICAgICA9PiB0ZXN0X3dyYXAuaAogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDICA9PiB0ZXN0LmgKCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAxKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGZlYXR1cmUgYWRkZWQuIFRoaXMgZmVhdHVyZSBhbGxvd3Mgb25lCiAgICAgICAgICAgICAgdG8gdXNlIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGNvZGUgZ2VuZXJhdGlvbiB0aGF0IHdhcyB1c2VkIGluCiAgICAgICAgICAgICAgU1dJRy0xLjMuMjIgYW5kIGVhcmxpZXIgdmVyc2lvbnMuIEl0IHByb2R1Y2VzIG1vcmUgY29tcGFjdCB3cmFwcGVycwogICAgICAgICAgICAgIGFzIG9ubHkgb25lIHdyYXBwZXIgbWV0aG9kIGlzIGdlbmVyYXRlZCBmb3IgYW55IG1ldGhvZCB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgICBhcmd1bWVudHMuIFNvIHRoZSBhZHZhbnRhZ2UgaXMgaXQgZ2VuZXJhdGVzIGxlc3MgY29kZSBidXQgaGFzIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIGxpbWl0YXRpb25zLCBsaWtlIGl0IGl0IGRvZXMgbm90IHdvcmsgd2l0aCBhbGwgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICBhbmQgZGVmYXVsdCBhcmd1bWVudHMgY2Fubm90IGJlIHRha2VuIGFkdmFudGFnZSBvZiBpbiB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgICBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKS4gSXQgaXMgaW1wbGVtZW50ZWQgdmlhIHRoZSB1c3VhbCAlZmVhdHVyZSBtZWNoYW5pc206CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpOwoKICAgICAgICAgICAgMikgS2V5d29yZCBhcmd1bWVudHMgKGt3YXJncykgYXJlIHdvcmtpbmcgYWdhaW4gZm9yIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGluIHRoZSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IGl0LCBpZSwgUHl0aG9uIGFuZCBSdWJ5LiBUaGUgbmV3IGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnQgd3JhcHBpbmcgYXBwcm9hY2ggdXNpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbm5vdCBzdXBwb3J0IGt3YXJncwogICAgICAgICAgICAgICBzbyB0aGUgY29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50IGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbgogICAgICAgICAgICAgICBrd2FyZ3MgYXJlIHNwZWNpZmllZCwgYnkgJWZlYXR1cmUoImt3YXJncyIpLgoKICAgICAgICAgICAgMykgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuIHdyYXBwaW5nCiAgICAgICAgICAgICAgIEMgKG5vdCBDKyspIGNvZGUuIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYml6YXJyZSBub3Rpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgZm9yIEMgY29kZS4KCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucyBpbiBuYW1lc3BhY2VzIGFsc28gd29ya2luZyBub3cuCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBuYW1lc3BhY2VzIHRvby4KCjEwLzE5LzIwMDQ6IG1tYXR1cwoKCSAgICAtIEFsbG93IHRvIGRpc2FibGUgdGhlIG5ldyBTd2lnVmFsdWVXcmFwcGVyIG1lY2hhbmlzbSwKCSAgICAgIGlmIHlvdSBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgbGFuZ3VhZ2UgbWFpbi4KCgkJIC8qIFR1cm4gb24gc2FmZSB2YWx1ZSB3cmFwcGVyIHVzZSBtb2RlICovCiAgICAgICAgICAgICAgICAgU3dpZ192YWx1ZV93cmFwcGVyX21vZGUoMSk7CgoJICAgICAgCgkgICAgICBOb3cgaXMgb25seSBhY3RpdmUgaW4gcHl0aG9uLiBBbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgICAgYXJlIHVzaW5nIHRoZSBvbGQgcmVzb2x1dGlvbiwgYnV0IHRoZXkgIGNhbiBhbHNvIHVzZSB0aGUKCSAgICAgICJ2YWx1ZXdyYXBwZXIiLyJub3ZhbHVld3JhcHBlciIgZmVhdHVyZXMgdG8gZml4IHNvbWUKCSAgICAgIG9mIHRoZSBvbGQgYnJva2VuIGNhc2VzLiBOb3RlLCBob3dldmVyLCAgdGhhdCBub3QgYWxsIAoJICAgICAgdGhlIGJyb2tlbiBjYXNlcyBjYW4gYmUgc29sdmVkIGluIHRoYXQgd2F5LgoKCSAgICAgIFRoZSBuZXcgbWVjaGFuaXNtIHNlZW1zIHRvIGJlIHdvcmtpbmcgZmluZSBpbiBwZXJsLCBydWJ5CgkgICAgICBhbmQgdGNsLCBidXQgZmFpbGluZyBpbiBzb21lIHR5cGVtYXBzIGluIGphdmEuCgoJICAgICAgSGVuY2UsIGlzIHVwdG8gdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdG8gdGVzdCBpdCwgYW5kCgkgICAgICBkZWNpZGUgdG8gZW5hYmxlIGl0IG9yIG5vdC4KCgkgICAgICBMb29rIGF0IHRoZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGV4YW1wbGVzLgoKCSAgICAtIEZpeCBtb3JlIFN3aWdWYWx1ZVdyYXBwZXIgY2FzZXMgd2hlbiB0aGUgbmV3IG1lY2hhbmlzbQoJICAgICAgaXMgYWN0aXZlLiBOb3cgaXQgYWxzbyBjaGVjayBmb3IgbG9jYWwgdHlwZW1hcAoJICAgICAgdmFyaWFibGVzLCBzZWUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbiBleGFtcGxlIHdoZW4KCSAgICAgIHRoaXMgaXMgbmVlZGVkLiBCdXQgYWdhaW4sIHRoaXMgZXh0cmEgY2hlY2tpbmcgd2lsbCBvbmx5CgkgICAgICBiZSBhY3RpdmF0ZWQgd2hlbiB1c2luZyB0aGUgbmV3IHZhbHVlIHdyYXBwZXIgbW9kZS4KCgkgICAgLSBbUHl0aG9uXSBGaXggdmFyaWFibGUgd3JhcHBpbmcgb2YgY2xhc3NlcyB3aXRoIHByaXZhdGUKCSAgICAgIGFzc2lnbiBvcGVyYXRvcnMuIEl0IHNob3VsZCBiZSBlYXN5IHRvIGZpeCBpbiBhbGwgdGhlIAoJICAgICAgb3RoZXIgbW9kdWxlcywgaW5zdGVhZCBvZiBjaGVja2luZwoKCSAgICAgICAgIGlmICghR2V0YXR0cihuLCJpbW11dGFibGUiKSkgLi4uCgkKCSAgICAgIHlvdSBuZWVkIHRvIHZlcmlmeQoKCSAgICAgICAgIGlmIChpc19hc3NpZ25hYmxlKG4pKSAuLi4KCgkgICAgICBMb29rIGF0IHRoZSBwcml2YXRlX2Fzc2lnbi5pIGZvciBhbiBleGFtcGxlLgoKMTAvMTgvMjAwNDogbW1hdHVzCgkgICAgLSAlZmVhdHVyZXMgImRpcmVjdG9yIi8ibm9kaXJlY3RvciIgbm93IHdvcmsgYXMgZXhwZWN0ZWQuCiAgICAgICAgICAgIC0gR2VuZXJhbCBmaXhlcyBpbiAlZmVhdHVyZSB0byByZXNvbHZlIGZ1bmN0aW9uIGRlY2wKCSAgICAgIHByb3Blcmx5LAoJICAgICAgCgkgICAgICAgICVmZWF0dXJlKCJoZWxsbyIpIGZvbygpOwoJICAgICAgICBjaGFyIGZvbygpIC0+ICBmKCkgICAgLy8gd2FzIHdvcmtpbmcKCSAgICAgICAgY2hhciAqZm9vKCkgLT4gZigpLnAgIC8vIGl0IHdhc24ndAogCgogICAgICAgICAgICAtIFRlbXBsYXRlICsgc3BlY2lhbGl6YXRpb24gKyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3Mgbm93IGlzCgkgICAgICB3b3JraW5nLCAoZG9uJ3QgY29uZnVzZSB3aXRoIHRlbXBsYXRlICsgZGVmYXVsdCBhcmcKCSAgICAgIHZhbHVlcywgdGhhdCB3YXMgc29sdmVkIGJlZm9yZSksIG5vdyB0aGlzIHVnbHkgY2FzZSBpcwoJICAgICAgd29ya2luZzoKCgkgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBID0gQWxsb2M8VD4gPgoJCXN0cnVjdCBWZWN0b3IKCQl7CgkJICAgVmVjdG9yKFQgYSl7fQoJCX07CQkgICAKCgkJdGVtcGxhdGUgPD4KCQlzdHJ1Y3QgVmVjdG9yPGRvdWJsZT4KCQl7CgkJICBWZWN0b3IoKXt9CgkJICBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQogICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICV0ZW1wbGF0ZShWX2MpIFZlY3RvcjxjaGFyLCBBbGxvYzxjaGFyPiA+OwoJICAgICAgICAldGVtcGxhdGUoVl9pKSBWZWN0b3I8aW50PjsgICAgLy8gcGlja3MgVmVjdG9yPGludCxBbGxvYzxpbnQ+ID4KCSAgICAgICAgJXRlbXBsYXRlKFZfZCkgVmVjdG9yPGRvdWJsZT47IC8vIHBpY2tzIHRoZSBzcGVjaWFsaXphdGlvbgoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIGF1dG9tYXRpYyBTVEwgc3VwcG9ydCAobGF0ZXIgd2lsbAogICAgICAgICAgICAgIGJlKS4KCgkgICAgLSBGaXggdGhlIHRlbXBsYXRlICsgdHlwZWRlZiBlcnJvcnMgaW4gdGVzdC1zdWl0ZSwgd2hpY2gKICAgICAgICAgICAgICBwcm9iYWJseSB3aWxsIGZpeCBhbm90aGVyIGdyb3VwIG9mIHN0cmFuZ2UgdGVtcGxhdGUgKwogICAgICAgICAgICAgIG5hbWVzcGFjZXMgKyB0eXBlZGVmcyBlcnJvcnMuCgoJICAgIC0gJXdhcm5maWx0ZXIgaXMgd29ya2luZyBiZXR0ZXIgbm93LCBwYXJzZXIueSB0cmllcyB0byB1c2UKCSAgICAgIHRoZW0gd2hlbiBuZWVkZWQuCgoJICAgIC0gKioqKiBOZXcgZGVmYXVsdCB0eXBlIHJlc29sdXRpb24gbWV0aG9kIChzdHlwZS5jKSAqKioqKiAKCgkgICAgICBJdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIG1peGVkIHR5cGVzLCB0aGVuIGl0IGdvZXMKCSAgICAgICdiYWNrd2FyZCcgZmlyc3QgZGVsZXRpbmcgdGhlIHF1YWxpZmllciwgdGhlbiB0aGUgaW5uZXIKCSAgICAgIHR5cGVzLCBmb3IgZXhhbXBsZToKICAgIAkJIAkJCQkJCQkgIAogICAgCQkgdHlwZWRlZiBBICpBcHRyOwkJCQkgIAogICAgCQkgY29uc3QgQXB0ciY7CQkJCQkJCiAgICAJCSByLnEoY29uc3QpLkFwdHIgICAgICAgLT4gci5xKGNvbnN0KS5wLlNXSUdUWVBFCQkKICAgIAkJIHIucShjb25zdCkucC5TV0lHVFlQRSAtPiByLnAuU1dJR1RZUEUJCQkKICAgIAkJIHIucC5TV0lHVFlQRSAgICAgICAgICAtPiByLlNXSUdUWVBFCQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgZW51bSBIZWxsbyB7fTsJCQkJCQkKICAgIAkJIGNvbnN0IEhlbGxvJiBoaTsJCQkJCQogICAgCQkgci5xKGNvbnN0KS5IZWxsbyAgICAgICAgICAtPiByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUJCiAgICAJCSByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUgIC0+IHIuZW51bSBTV0lHVFlQRQkJCiAgICAJCSByLmVudW0gU1dJR1RZUEUgICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBpbnQgYVsyXVs0XTsJCQkJCQkKICAgIAkJIGEoMikuYSg0KS5pbnQgICAgICAgICAgIC0+IGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUJCiAgICAJCSBhKEFOWSkuYShBTlkpLlNXSUdUWVBFICAtPiBhKEFOWSkuYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5hKCkuU1dJR1RZUEUgICAgIC0+IGEoQU5ZKS5wLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5wLlNXSUdUWVBFICAgICAgIC0+IGEoQU5ZKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuU1dJR1RZUEUgICAgICAgICAtPiBhKCkuU1dJR1RZUEUJCQogICAgCQkgYSgpLlNXSUdUWVBFICAgICAgICAgICAgLT4gcC5TV0lHVFlQRQkJCQogICAgCQkgcC5TV0lHVFlQRSAgICAgICAgICAgICAgLT4gU1dJR1RZUEUgICAgICAgICAgICAgICAgICAgIAoKCSAgICAgIGJlZm9yZSBpdCBhbHdheXMgc3RvcHMgYWZ0ZXIgZmluZGluZyByZWYvcG9pbnRlci9lbnVtL2FycmF5L2V0Yy4KCSAgICAgICAKCSAgICAgIE5vdywgdGhlbiwgeW91IGNhbiBkZWZpbmUgKHVzZSBhbmQgYXBwbHkpICdoaWdoZXInIHR5cGVtYXBzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChvdXQpIGNoYXIgRklYU0laRVtBTlldCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBlbnVtIFNXSUdUWVBFJgoJICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEVbQU5ZXVtBTlldCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICgmKVtBTlldCgkgICAgICAgCgkgICAgICBJdCBpcyBwb3NzaWJsZSB3aXRoIHRoaXMgY2hhbmdlIHRoYXQgcHJldmlvdXMgdHlwZW1hcHMKCSAgICAgIHRoYXQgd2VyZSBkZWZpbmVkIChidXQgaWdub3JlZCksIG5vdyB3aWxsIHN0YXJ0IHRvIHdvcmsuCgoJICAgICAgQWxzbywgaXQgaXMgbmVjZXNzYXJ5IGNoZWNrIGZvciB0aGUgJyV0eXBlbWFwKHZhcmluKSBTV0lHVFlQRVtdJywKCSAgICAgIGJlZm9yZSBpdCB3YXMgdXN1YWxseSBub3QgZGVmaW5lZCAoYnV0IGNoYXJbXSB3YXMpLAoJICAgICAgYW5kIHRoYXQgY2FuIHByb2R1Y2Ugc29tZSBpbmNvbnNpc3RlbmNpZXMuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgICAgVGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZCBmb3IgU1RMLCBzaW5jZSBzdGQ6OnZlY3RvcjxlbnVtIEhlbGxvPiAKCSAgICAgIHN0ZDo6dmVjdG9yPEEqPiwgZXRjLCB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBtZXRob2RzIHRoYXQKCSAgICAgIG1peCBjb25zdCByZWZlcmVuY2VzIHdpdGggdGhlIHZlY3RvciB0eXBlLgoKCSAgICAgIE5vdyB0aGF0IGlzIHdvcmtpbmcsIGFsbCB0aGUgc3RkOjpjb250YWluZXI8VCo+CgkgICAgICBzcGVjaWFsaXphdGlvbiB3aWxsIG5vdCBiZSBuZWVkZWQgYW55bW9yZSwgd2VsbCwgaW4KCSAgICAgIHRoZW9yeS4gCgoJICAgICAgSW4gdGhlIHByYWN0aWNlLCBldmVyeXRoaW4gaXMgd29ya2luZyBhcyBiZWZvcmUgdW50aWwKCSAgICAgIHRoZSBwcm9wZXIgbWl4ZWQgdHlwZXMgYXJlIGRlZmluZWQgYW5kIHRoZSBsaWJyYXJpZXMKCSAgICAgIHNpbXBsaWZpZWQgdG8gdXNlIHRoZW0uCgoJICAgIC0gQ2hhbmdlIHRoZSBiZWhhdmlvciBvZiBleHRlcm4gImphdmEiLyJmb3J0cmFuIi8iZXRjIiwgCgkgICAgICBub3cgc3dpZyBwcm9kdWNlcyBhIHdhcm5pbmcsIGFuZCB1c2UgZXh0ZXJuICJDIiBpbnN0ZWFkLgoJICAgICAgVGhlIHdhcm5pbmcgY2FuIGFsc28gYmUgZGlzYWJsZSB3aXRoIHRoZSAiLXcgMzEzIiBmbGFnLgoJICAgICAgKFdBUk5fUEFSU0VfVU5ERUZJTkVEX0VYVEVSTikuCgoJICAgIC0gU3dpZ1ZhbHVlV3JhcHBlciBpcyBub3cgbW9yZSBzZWxlY3RpdmUgKGxhbmcuY3h4KS4KCiAgICAgICAgICAgIFtQZXJsL1RjbF0KCSAgICAtIEZpeCBzb21lIHR5cGVtYXBzIChwZXJsL3RjbCkgdG8gd29yayBwcm9wZXJseSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLiBUaGlzIHdhcyBub3QgYSBwcm9ibGVtIHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGJ1dCB3aXRoIHRoZSB0eXBlbWFwcyB0aGF0IG5vdyBhcmUKCSAgICAgIHNhZmUgdG8gdXNlIHdpdGggJWFwcGx5LgoKCSAgICBbUHl0aG9uXQoKICAgICAgICAgICAgLSBGaXggJWNhbGxiYWNrLyVweXRob25jYWxsYmFjayB3b3JrIG5vdyBhcyBiZWZvcmUgYWZ0ZXIKCSAgICAgIHRoZSBkZWYgYXJncyBjaGFuZ2VzLiBBbHNvLCAlY2FsbGJhY2sgbm93IGlzIGFuIGFsaWFzCgkgICAgICBmb3IgJXB5dGhvbmNhbGxiYWNrLCBzbywgdGhleSBkbyB0aGUgc2FtZS4KCgkgICAgW1B5dGhvbi9SdWJ5XQoJICAgIC0gJWNhbGxiYWNrIGlzIG1vcmUgdXNhYmxlIGFuZCB1bmlmb3JtOgoKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIikgZm9vKCk7ICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIik7ICAgICAgICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soMSkgZm9vKCk7ICAgICAgICAvLyBvbmx5IGluIHB5dGhvbi4KCjEwLzE3LzIwMDQ6IGFydHkKCSAgICBbT0NBTUxdCgkgICAgLSBUd2VhayB0byBlbnVtIHR5cGluZyBmb3Igc291bmRuZXNzIGluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZQoJICAgICAgbW9kdWxlcy4KCSAgICAtIGdsb2JhbCBmdW5jdGlvbnMgYXJlIG5vdyB1bmFtYmlndW91cyBpbiBtdWx0aXBsZSBsb2FkZWQgbW9kdWxlcy4KCSAgICAtIEZpeGVkIHRlc3QgY2FzZSBjb2RlIHRvIGJ1aWxkIG11bHRpbW9kdWxlIHRlc3QgY2FzZXMgY29ycmVjdGx5LgoJICAgIC0gVGhlcmUgaXMgbm8gd2F5IHRvIHNoYXJlIG92ZXJsb2FkIHJlc29sdXRpb24gYWNyb3NzIG1vZHVsZXMKCSAgICAgIGJlY2F1c2Ugb2Ygc291bmRuZXNzIGlzc3Vlcy4gIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNhbGwgc29tZQoJICAgICAgZnVuY3Rpb24gZm9vIGZyb20gYW4gYXJiaXRyYXJ5IG1vZHVsZSBiYXIsIHRoZXkgd2lsbCBoYXZlIHRvCgkgICAgICB1c2UgQmFyLl9mb28gdG8gY2FsbCBpdCBjb3JyZWN0bHkuICBMYXRlciBJIHdpbGwgZml4IHRoZSAKCSAgICAgIGNhbWxwNCBtb2R1bGUgdG8gZG8gc29tZXRoaW5nIGNsZXZlciBpbiB0aGlzIGNhc2UuICAKICAgICAgICAgICAgLSBQcm9taWRlZCBwZXJmb3JtYW5jZSBvdmVyaGF1bCBvZiBjbGFzcyBtZWNoYW5pc20uCgkgICAgLSBSZW1vdmVkIHN5bWJvbCBoYWNrIGZvciBvY2FtbC0zLjA3IGFuZCBiZWxvdyB3aGljaCBpcyBub3QgbmVlZGVkCgkgICAgICBmb3Igb2NhbWwtMy4wOCBhbmQgYWJvdmUuCgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NISUNLRU5dCgkgICAgLSBDb21wbGV0bHkgY2hhbmdlIGhvdyBjaGlja2VuLmN4eCBoYW5kbGVzIENMT1MgYW5kIGdlbmVyaWMgY29kZS4KCSAgICAgIGNoaWNrZW4gbm8gbG9uZ2VyIGV4cG9ydHMgLWNsb3Muc2NtIGFuZCAtZ2VuZXJpYy5zY20uICBUaGUgY2xvcwoJICAgICAgY29kZSBpcyBleHBvcnRlZCBkaXJlY3RseSBpbnRvIHRoZSBtb2R1bGUuc2NtIGZpbGUgaWYgLXByb3h5IGlzIHBhc3NlZC4KCSAgICAtIFRoZSBjb2RlIG5vdyBhbHdheXMgZXhwb3J0cyBhIHVuaXQuICBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlIGlzIG5vdwoJICAgICAgbWFqb3JseSBicm9rZW4sIGFuZCBuZWVkcyB0byBiZSBmaXhlZC4KCSAgICAtIENMT1Mgbm93IGdlbmVyYXRlcyB2aXJ0dWFsIHNsb3RzIGZvciBtZW1iZXIgdmFyaWFibGVzIHNpbWlsYXIgdG8gaG93CgkgICAgICBHT09QUyBzdXBwb3J0IHdvcmtzIGluIHRoZSBndWlsZSBtb2R1bGUuCgkgICAgLSBjaGlja2VuIG5vIGxvbmdlciBwcmVmaXhlcyBzeW1ib2xzIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYW5kIG5vIGxvbmdlcgoJICAgICAgZm9yY2VzIGFsbCBuYW1lcyB0byBsb3dlciBjYXNlLiAgSXQgbm93IGhhcyAtdXNlY2xhc3NwcmVmaXggYW5kIC1jbG9zcHJlZml4CgkgICAgICBzaW1pbGFyIHRvIGhvdyBndWlsZSBoYW5kbGVzIEdPT1BTIG5hbWVzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHdvcmtpbmcgd2l0aCBuZXcgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB3cmFwcGluZyBhcHByb2FjaC4gVGhlIG5ldyBhcHByb2FjaCBubyBsb25nZXIgZmFpbHMgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnQgcGF0dGVybiAocHJldmlvdXNseSBmYWlsZWQgd2l0aCBzb21lIHByaW1pdGl2ZSB0eXBlcywgbGlrZSAKICAgICAgICAgICAgdW5zaWduZWQgcHJpbWl0aXZlIHR5cGVzKToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGZvbyhjb25zdCBUJiB1ID0gVCgpKTsKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288dW5zaWduZWQgaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVsaWVzIG9uIHRoZSB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgc3VwcG9ydCBqdXN0IGFkZGVkLCBzbyBhbGwKICAgICAgICAgICAgdGhlIGNvbWJpbmF0aW9ucyBvZiBvdmVybG9hZGluZyBieSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFuZCBub3JtYWwgcGFyYW1ldGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIG92ZXJsb2FkaW5nIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIHdvcmtzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGxhcmdlIHJhbmdlIG9mIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyB0aGF0IEMrKwogICAgICAgICAgICBzdXBwb3J0cy4KCiAgICAgICAgICAgIC0gT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zLCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0LCBjb25zdCBUICZyKTsKCiAgICAgICAgICAgIC0gRml4ZXMgd2hlcmUgdGhlIHRlbXBsYXRlZCB0eXBlIGlzIG5vdCB1c2VkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB4eXooKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgeHl6PGRvdWJsZT4oKTsKCiAgICAgICAgICAgIC0gRml4ZXMgZm9yIG92ZXJsb2FkaW5nIG9mIHBsYWluIGZ1bmN0aW9ucyBieSBhIHRlbXBsYXRlZCBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CgogICAgICAgICAgICAtIE92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlZCBwYXJhbWV0ZXJzIGZpeGVkOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGZvbyhUIHQpIHt9CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gdm9pZCBmb28oVCB0LCBVIHUpIHt9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzxkb3VibGUsIGRvdWJsZT47CgogICAgICAgICAgICAtIEFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGFsc28gd29ya2luZyBpbmNsdWRpbmcgc3BlY2lhbGl6YXRpb25zLCBlZzoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYzxkb3VibGU+KGRvdWJsZSB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjKGludCB0KTsKCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlbW92ZSB0aGUgYWJpbGl0eSB0byBzaGFyZSB0eXBlIGluZm9ybWF0aW9uIGJ5IHVzaW5nIGMgbGlua2luZy4KICAgICAgICAgICAgICBBbGwgdHlwZSBzaGFyaW5nIGhhcHBlbnMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICAgICAgKyBSZW1vdmUgU1dJR19OT0lNUE9SVCwgU1dJR19SVU5USU1FLCBhbmQgcmVsYXRlZCBkZWZpbmVzLgogICAgICAgICAgICAgICAgKyBEZXByZWNhdGUgLXJ1bnRpbWUsIC1ub3J1bnRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRlc3Qtc3VpdGUgY29tbW9uLm1rIHRvIGNvcnJlY3RseSBidWlsZCBtdWx0aWNwcHRlc3QKICAgICAgICAgICAgICAgICsgUmVtb3ZlIHJlZmVyZW5jZSB0byBwcmVjb21tb24uc3dnCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0aGUgZ3VpbGVfZ2ggaW50ZXJmYWNlIHRvIHNoYXJlIGRhdGEgYnkgYSBnbG9iYWwgdmFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgb2YgYyBsaW5rYWdlLgoKICAgICAgICAgICAgLSBSZW1vdmUgQWR2YW5jZWQuaHRtbCwgc2luY2UgZXZlcnl0aGluZyBpbiBpdCBpcyBub3cgb2Jzb2xldGUKCjEwLzA5LzIwMDQ6IG1tYXR1cwoJICAgIC0gU3BsaXQgdGhlIHB5dGhvbiBzdGQvU1RMIEMrKyBsaWJyYXJ5IGZpbGVzLCBub3cKCSAgICAgIGFsbCB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZGVmaW5pdGlvbnMgYXJlIHVuZGVyCgkgICAgICB0aGUgZGlyZWN0b3J5CgkgICAgICAKCQlMaWIvc3RkCgoJICAgICAgYW5kIGhlbmNlLCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgLSBBZGQgbW9yZSBkb2N1bWVudGF0aW9uIHRvIHRoZSBQeXRob24gU1RMLCBhbmQKCSAgICAgIGNsZWFuIHVubmVjZXNzYXJ5IGNvZGUuCgoJICAgIC0gQWRkIGluaXRpYWwgQzk5IGNvbXBsZXggc3VwcG9ydCwgYW5kIHNvbWUgZml4ZXMKCSAgICAgIGZvciBsb25nIGRvdWJsZS4KCjEwLzA4LzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHRoZSBTd2lnVmFsdWVXcmFwcGVyIGZvciBvcGFxdWUgdHlwZXMsIG5vdyBpdCBpcyAKCSAgICAgIGFwcGxpZWQgZm9yIG9wYXF1ZSB0ZW1wbGF0ZXMgYW5kIGNsYXNzZXMsIGZvciB3aGljaCB3ZQoJICAgICAgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBvciBub3QgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpZQoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQShpbnQpOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICBTdGlsbCwgaWYgeW91IGtub3cgdGhhdCB5b3UgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBhbmQgZm9yIHNvbWUgdmVyeSB2ZXJ5IHBhcnRpY3VsYXIgcmVhc29uCiAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFN3aWdWYWx1ZVdyYXBwZXIsIGFuZCB5b3UgZG9uJ3QKICAgICAgICAgICAgICB3YW50IG9yIGNhbid0IGV4cG9zZSB0aGUgY2xhc3MgdG8gc3dpZywgbm93IHlvdSBjYW4KICAgICAgICAgICAgICBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdmFsdWV3cmFwcGVyIikgQTsgICAgCiAgICAgICAgICAgICAgICAgY2xhc3MgQTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHRoZSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGJ1dCB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIHdyYXBwZXIsIHlvdQogICAgICAgICAgICAgIGNhbiBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoInZhbHVld3JhcHBlciIpIEE7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoKTsKCQkgICAuLi4uCiAgICAgICAgICAgICAgICAgfTsgICAKICAgICAgCgkgICAgLSBGaXggZm9yIGNoYXIgPiAxMjgsIGllCgogICAgICAgICAgICAgICAgY29uc3QgY2hhciB0aWxkZV9hID0gJ1wzNDEnOwoKICAgICAgICAgICAgLSBBZGQgcGF0Y2ggMTA0MTg1OCBmb3IgJGxleHR5cGUsIHdoaWNoIGNhcnJpZXMgdGhlIAogICAgICAgICAgICAgIGxpdGVyYWwgdHlwZSBvZiBhIHN5bWJvbC4gU2VlIGxleHR5cGUuaSBpbiB0aGUKICAgICAgICAgICAgICB0ZXN0LXN1aXRlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKCjEwLzA3LzIwMDQ6IHdzZnVsdG9uCgkgICAge1J1YnksIEphdmFdIEZpeCBkaXJlY3RvciArICdlbXB0eScgdGhyb3dzCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgQSgpIHRocm93KCk7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgICAgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgoKMTAvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtUQ0xdCiAgICAgICAgICAgIC0gRml4IGJ1ZyByZXBvcnRlZCBieSBXaWxsaWFtIEEuIEhvZmZtYW4gcHJvcGFnYXRpbmcgY2xpZW50ZGF0YQogICAgICAgICAgICBiZXR3ZWVuIG1vZHVsZXMuICBBZGRlZCBjbGllbnRkYXRhX3Byb3AubXVsdGljcHB0ZXN0IHRvIGNoZWNrIGZvcgogICAgICAgICAgICB0aGlzIGJ1Zy4gIFRoZSBmaXggaW52b2x2ZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgogICAgICAgICAgICAgICAgKyBTd2lnVHlwZV9jbGllbnRkYXRhX2NvbGxlY3QgZG9lcyBub3QgbmVlZCB0byBjaGVjawogICAgICAgICAgICAgICAgdHlwZXMgaW4gcl9yZXNvbHZlZCBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBwcm9wYWdhdGUgY2xpZW50ZGF0YQogICAgICAgICAgICAgICAgdG8gdHlwZWRlZmVkIGNsYXNzZXMsIGFuZCByX21hbmdsZWQgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHR5cGVkZWZzLgoKICAgICAgICAgICAgICAgICsgU1dJR19UeXBlUmVnaXN0ZXIgbm93IGNvcGllcyB0aGUgY2xpZW50ZGF0YSBmaWVsZCBjb3JyZWN0bHkKCiAgICAgICAgICAgICAgICArIE1vdmUgU1dJR19HdWlsZV9Qcm9wYWdhdGVDbGllbnREYXRhIGZ1bmN0aW9uIGZyb20gZ3VpbGUgbW9kdWxlCiAgICAgICAgICAgICAgICBpbnRvIGNvbW1vbi5zd2csIGJlY2F1c2Ugd2UgbmVlZCB0byBjYWxsIGl0IGZyb20gYm90aCBndWlsZSBhbmQgdGNsLgoKICAgICAgICAgICAgICAgICsgQWRkIGJhc2VfbmFtZXMgdG8gc3dpZ19jbGFzcyB0byBkZWxheSB0aGUgbG9va3VwIG9mIGJhc2VzLiAgU1dJRwogICAgICAgICAgICAgICAgbm93IGV4cG9ydHMgdGhlIGJhc2UgbmFtZXMgYW5kIG9ubHkgd2hlbiB0aGUgYmFzZSBzd2lnX2NsYXNzIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgaXMgU1dJR19UeXBlUXVlcnkobmFtZSktPmNsaWVudGRhdGEgbG9va2VkIHVwLgoKICAgICAgICAgICAgLSBjb252ZXJzaW9uX25zX3RlbXBsYXRlIHRlc3RzdWl0ZSB0ZXN0IHdhcyBmYWlsaW5nIGJlY2F1c2UKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzIG5vdCBjYWxjdWxhdGVkCiAgICAgICAgICAgIGNvcnJlY3RseSBmb3Igc3RydWN0cy4gIEZpeGVkLgoKMTAvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIHVzZWQgaW4gZGlyZWN0b3JzIC0gaW4gdmlydHVhbAogICAgICAgICAgICBtZXRob2RzIGFuZCBkaXJlY3RvciBjb25zdHJ1Y3RvcnMuCgoxMC8wNi8yMDA0OiBtbWF0dXMKCSAgICBGaXggdGhlIF9fY3BsdXNwbHVzIG1hY3JvLCBhbmQgYnVnIDEwNDExNzAuCgkgICAgTm93IGl0IGlzIHdvcmtpbmcgYXMgc3VwcG9zZWQsIGllLCB5b3UgY2FuIHNhZmVseSB1c2UKCgkgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKCSAgICAgIC4uLgoJICAgIAoJICAgIGFsbCBvdmVyIHN3aWcsIGluY2x1ZGluZyBpbnNpZGUgJWRlZmluZXMgYW5kICV7ICV9IGJvZGllcy4KCgkgICAgCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlIG9sZCB0cmljayBvZiB1c2luZwoKCSAgICAgICNpZiBfX2NwbHVzcGx1cwoKCSAgICBkb2Vzbid0IHdvcmsgYW55IG1vcmUuIFNvLCBpZiB5b3UgaGF2ZSB5b3VyIG93biB0eXBlbWFwcwoJICAgIHVzaW5nIHRoYXQgc3ludGF4LCB5b3Ugd2lsbCBuZWVkIHRvIG1pZ3JhdGUgdGhlbSB0byB1c2UKCSAgICAiI2lmZGVmIF9fY3BsdXNwbHVzIi4KCjEwLzA1LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlb3JnYW5pemUgaG93IHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHNoYXJlZAoJICAgIGJldHdlZW4gbW9kdWxlcy4gIEZvciBjaGlja2VuIGFuZCBtenNjaGVtZSwgSSByZW1vdmVkCgkgICAgdGhlIGFiaWxpdHkgdG8gdXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGlsZSBwZXJsLCB0Y2wsIHB5dGhvbiwgYW5kCgkgICAgcnVieSBkZWZhdWx0IHRvIHVzaW5nIHRoZSBuZXcgbWV0aG9kIGJ1dCBjYW4gZ28gYmFjayB0byB0aGUgb2xkCgkgICAgbWV0aG9kIGJ5IGRlY2xhcmluZyBTV0lHX0FMTE9XX1JVTlRJTUUuCgoJICAgIC0gbGluZSA1ODIgaW4gbXpzY2hlbWUuY3h4IHdhcyBnZW5lcmF0aW5nIGEgc2VnZmF1bHQgb24gCgkgICAgaW1wb3J0cy5tdWx0aWNwcHRlc3QsIHNvIEkgZml4ZWQgaXQuCgoxMC8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgJWV4dGVuZCBhbmQgb3ZlcmxvYWRlZCBzdGF0aWMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzLgoKMTAvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBbcHl0aG9uXSBGaXggZGlyZWN0b3IgKyBtZXRob2Qgd2l0aCAnZW1wdHknIHRocm93LCBpZQoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgkJICAgIAoJICAgICAgb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBhbHNvIGVhc3kgdG8gZml4LCBsb29rIGZvcgoJICAgICAgR2V0YXR0cihuLCJ0aHJvdyIpIGluIHB5dGhvbi5jeHguCgoJICAgIC0gRml4IGRpcmVjdG9yICsgZGVzdHJ1Y3RvciB3aXRoICdlbXB0eScgdGhyb3cKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgfTsKCgkgICAgLSBOb3cgU1dJR19GRUFUVVJFUyBwYXJzZSBhbGwgYW5kIHRoZSBzYW1lICBvcHRpb25zIHlvdQogICAgICAgICAgICAgIGNhbiBwYXNzIHRvIHN3aWcgaW4gdGhlIGNvbW1hbmQgbGluZS4KCSAgICAgIAoJICAgIC0gTmV3IGNvbW1hbmQgbGluZSBmbGFnOiAtZmVhdHVyZXMgPGxpc3Q+LCBhcyBpbgoKCSAgICAgICAgc3dpZyAtZmVhdHVyZXMgYXV0b2RvYz0zLGRpcmVjdG9yCgoJICAgICAgaWUsIGFueSBnbG9iYWwgZmVhdHVyZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKCSAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCB1c2VycwoJICAgICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCgoxMC8wNC8yMDA0OiBtbWF0dXMKCSAgICAtIFByb3Blcmx5IHF1YWxpZnkgdHlwZSBpbiBzeW50YXggYXMgJ2xvbmcoMiknIG9yICdGb28oKScsCgkgICAgICB0aGlzIHNvbHZlIG9sZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmdzLCBhbmQgcHJvYmFibHkKCSAgICAgIG90aGVyIHByb2JsZW1zIGFyb3VuZC4gSG93ZXZlciwgdGhlIGRlZmF1bHQgYXJnIHByb2JsZW0KCSAgICAgIHdhcyBhbHNvIGFscmVhZHkgc29sdmVkIGJ5IFdpbGxpYW0gKHNlZSBiZWxsb3cpLgoKCSAgICAtIEZpeCBmZWF0dXJlX3NldCBhbmQgZmVhdHVyZV9nZXQgbWV0aG9kcy4gQmVmb3JlCgkgICAgICB0aGV5IGxvb2sgZnJvbSBwYXJ0aWN1bGFyIHRvIGdlbmVyYWwgYW5kIGtlZXAgdGhlIGZpcnN0CgkgICAgICBmZWF0dXJlIGZvdW5kLiBUaGlzIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0ZW1wbGF0ZXMuCgkgICAgICBOb3cgdGhlIG1ldGhvZHMgbG9vayBmcm9tIGdlbmVyYWwgdG8gcGFydGljdWxhciwgYW5kCgkgICAgICBvdmVycmlkZSBhbnkgZm91bmQgZmVhdHVyZS4KCiAgICAgICAgICAgIC0gUHJldmlvdXNseSBhIGZlYXR1cmUgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY29uc3RydWN0b3JzCiAgICAgICAgICAgICAgb3IgZGVzdHJ1Y3RvcnMgdGhhdCB3ZXJlbid0IGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSBGb28oKSAiLi4uIgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgfkZvbygpICIuLi4iCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBGb28oKSBhbmQgfkZvbygpCiAgICAgICAgICAgICAgICB9OwoKCSAgICAtIEZpeCBtaXNzaW5nIGZlYXR1cmVzIGZvciBkZWZhdWx0IGNvbnN0L2Rlc3QsIGJ5IHJlYWxseQoJICAgICAgJ2NyZWF0aW5nJyB0aGUgbWV0aG9kcyBhbmQgYXBwbHlpbmcgdGhlIGZlYXR1cmVzLgoKCSAgICAtIEZpeCByZXR1cm5fY29uc3RfdmFsdWUuaSBjYXNlIGJ5IGFkZGluZyBTd2lnVmFsdWVXcmFwcGVyPGNvbnN0IFQ+CgkgICAgICBzcGVjaWFsaXphdGlvbi4KCgkgICAgLSBGaXggJWV4dGVuZCArIG92ZXJsb2FkLCBpbmNsdWRpbmcgb3ZlcmxvYWRpbmcgYWN0dWFsCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcy4gCgoJICAgIC0gQWRkaW5nIG1vcmUgY2FzZXMgaW4gcmVsYXRlZCBmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZS4gIAoKMTAvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgd2F5IGRlZmF1bHQgYXJndW1lbnRzIGFyZSB3cmFwcGVkLiBQcmV2aW91c2x5IGEgc2luZ2xlCiAgICAgICAgICAgIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBlYWNoIG1ldGhvZCB0aGF0IGhhZCBkZWZhdWx0IGFyZ3VtZW50cy4gSWYKICAgICAgICAgICAgYSBtZXRob2QgaGFkIDUgYXJndW1lbnRzLCBzYXksIG9mIHdoaWNoIDEgaGFkIGEgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB0aGVuIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCB3b3VsZCBwYXNzIDUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICB2YWx1ZSB3YXMgY29waWVkIGludG8gdGhlIHdyYXBwZXIgbWV0aG9kIGFuZCB1c2VkIGlmIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgcGFzc2VkIGp1c3QgNCBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoaXMgd2FzIGZsYXdlZCBhcyB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudCBzb21ldGltZXMgZG9lcyBub3QgaGF2ZSBnbG9iYWwgYWNjZXNzLCBmb3IgZXhhbXBsZQogICAgICAgICAgICBTV0lHIHdvdWxkIGdlbmVyYXRlIGNvZGUgdGhhdCBjb3VsZG4ndCBjb21waWxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNsYXNzIFRyaWNreSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCA9IHByaXZhdGV2YWx1ZSk7CiAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgdmFsID0gVHJpY2t5OjpnZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGVudW0geyBwcml2YXRldmFsdWUgPSAyMDAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBidWdzIGluIHJlc29sdmluZyBzeW1ib2xzIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgKHByb2JhYmx5IGZpeGFibGUgdGhvdWdoKToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBLbGFzcyBjb25zdHJ1Y3RvcmNhbGwoY29uc3QgS2xhc3MmIGsgPSBLbGFzcygpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgYXBwcm9hY2ggYWxzbyBkb2VzIG5vdCB3b3JrIGZvciBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpCiAgICAgICAgICAgIGFzIHRoZXNlIGxhbmd1YWdlcyBkbyBub3QgYWxsb3cgbWV0aG9kcyB0byBoYXZlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgICAgICAgIEFsdGhvdWdoIEMjIGhhcyBhIG1lY2hhbmlzbSB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5CiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXJlIG1vcmUgbGlrZSB2YXJhcmdzLgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBzb2x2ZXMgdGhlIGFib3ZlIHByb2JsZW1zIGFuZCB3cmFwcyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZC4gU28gU1dJRyB3aWxsIG5vdyB0cmVhdAoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYXMgaWYgaXQgaGFkIHBhcnNlZDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICB2b2lkIGZvbygpOwoKICAgICAgICAgICAgVGhlIGNvZGUgZ2VuZXJhdGVkIGlzIHRoZW4gZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBTV0lHIGhhZCBwYXJzZWQgdGhlIHR3bwogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNvdW50IHRoZSBhcmd1bWVudHMgcGFzc2VkIGFuZCBjYWxsCiAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QsIGp1c3QgbGlrZSBvdmVybG9hZGVkIG1ldGhvZHMuIEMjIGFuZCBKYXZhIGFyZSBub3cgYWJsZQogICAgICAgICAgICB0byBwcm9wZXJseSB3cmFwIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBieSBnZW5lcmF0aW5nIGV4dHJhIG1ldGhvZHMsCiAgICAgICAgICAgIGFnYWluIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQsIHNvIGZvcjoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHM9ImhlbGxvIiwgZG91YmxlIGQ9MTAuMCwgaW50IGk9MCk7CgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByb3h5IG1ldGhvZHMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkLCBpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcyk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggY29tZXMgd2l0aCBhIGNvdXBsZSBvZiBtaW5vciBrbm9jayBvbiBlZmZlY3RzLgoKICAgICAgICAgICAgMSkgU1dJRyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgQyAobm90IEMrKykgY29kZSBubyBsb25nZXIgd29ya3MuCiAgICAgICAgICAgIFByZXZpb3VzbHkgeW91IGNvdWxkIGhhdmUgdGhpcyBpbnRlcmZhY2U6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHBhc3Mgbm8gYXJndW1lbnRzCiAgICAgICAgICAgIHdoZXJldXBvbiB0aGUgZGVmYXVsdCBvZiAwIHdhcyB1c2VkLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBiZWhhdmlvdXIgZm9yIEMKICAgICAgICAgICAgY29kZSBieSB1c2luZyB0aGUgImRlZmF1bHQiIHR5cGVtYXA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGRlZmF1bHQpIGludCB2YWwgIiQxID0gMDsiOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKCiAgICAgICAgICAgIG9yIHlvdSBjb3VsZCBvZiBjb3Vyc2UgY29tcGlsZSB5b3VyIGNvZGUgYXMgQysrIGlmIHlvdSB3YW50IEMrKyBmZWF0dXJlcyA6KSA6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBBIGNvdXBsZSBvZiBTV0lHJ3MgbGlicmFyaWVzIHVzZWQgdGhpcyBDIGV4dGVuc2lvbiBhbmQgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkCiAgICAgICAgICAgIHRvIHVzZSB0aGUgImRlZmF1bHQiIHR5cGVtYXAuIFRoZSAiZGVmYXVsdCIgdHlwZW1hcCBpcyB0aHVzIHVuY2hhbmdlZCAoYW5kIHN0aWxsCiAgICAgICAgICAgIGlzIG5vdCBhbmQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSBDIyBhbmQgSmF2YSwgYW5kIGlzIGxpa2VseSB0byByZW1haW4gc28pLgoKCiAgICAgICAgICAgIDIpIEFsbCBmZWF0dXJlcyAoJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUgZXRjKSBubyBsb25nZXIgd29yayBhcyBpZiB0aGUgbWV0aG9kCiAgICAgICAgICAgIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaXMganVzdCBvbmUgbWV0aG9kLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseQoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwoKICAgICAgICAgICAgd291bGQgaGF2ZSBpZ25vcmVkIHRoZSBtZXRob2QgY29tcGxldGVseS4gTm93IGl0IHdpbGwgb25seSBpZ25vcmUgZm9vKGludCkgYnV0CiAgICAgICAgICAgIG5vdCB0aGUgZXh0cmEgZm9vKCkgbWV0aG9kLiBJbnN0ZWFkIHVzZToKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb287CgogICAgICAgICAgICB0byBpZ25vcmUgdGhlbSBhbGwuIG9yCgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKCiAgICAgICAgICAgIFRoaXMgb2YgY291cnNlIGFsbG93cyBvbmUgdG8gZmluZSB0dW5lIHRoZSB3cmFwcGluZywgZm9yIGV4YW1wbGUgb25lIGNvdWxkIHVzZToKCiAgICAgICAgICAgICAgJXJlbmFtZShmb29pbnQpIGZvbyhpbnQpOwogICAgICAgICAgICAgICVyZW5hbWUoZm9vZGVmYXVsdHMpIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGVtIGZyb20gYW55IGxhbmd1YWdlIGxpa2Ugc286CgogICAgICAgICAgICAgIGZvb2ludCgyMDApCiAgICAgICAgICAgICAgZm9vZGVmYXVsdHMoKQoKICAgICAgICAgICAgb3IgZm9yIGV4YW1wbGUgaWdub3JlIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZCwgc28gdGhlIGRlZmF1bHRzIGNhbm5vdCBiZSB1c2VkOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8yLzIwMDQ6IG1tYXR1cwoJICAgW1B5dGhvbl0KCSAgIC0gTW9yZSBjbGVhbmluZyB1cCBhbmQgdW5pZm9ybWF0aW9uIG9uIHRoZSBQeXRob24gTGliCgoJICAgLSBBZGRlZCBSb2JpbidzIGRvY3N0cmluZyBwYXRjaCwgcGx1cyBzb21lIGZpeGVzLCBwbHVzCgkgICAgIHNvbWUgZXh0ZW5zaW9ucywgc2VlIGF1dG9kb2MuaSBleGFtcGxlIGluIHRoZSB0ZXN0LXN1aXRlLAoJICAgICBhbmQgdHJ5IHVzaW5nICVmZWF0dXJlKCJhdXRvZG9jIiwiZXh0ZW5kZWQiKS4KCSAgICAKCSAgICAgVGhpcyBwYXRjaCBpcyBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgdGhlCgkgICAgIGRvY3VtZW50YXRpb24gcHJvYmxlbSwganVzdCBlbm91Z2ggdG8gaW5mb3JtIHB5dGhvbiBhYm91dAoJICAgICB0aGUgcGFyYW1ldGVyIGxpc3QuCgoJICAgICBUaGUgZXhwZWN0ZWQgc3dpZyBkb2N1bWVudGF0aW9uIHN1cHBvcnQgaXMgZmFyIGZhciBhd2F5IHlldC4KCSAgICAgCgoxMC8xLzIwMDQ6IG1tYXR1cwoJICAgLSBGaXggdGhlICVjYWxsYmFjayBmZWF0dXJlIChvbmx5IHVzZWQgaW4gcnVieSBhbmQgcHl0aG9uIGV4YW1wbGVzLAoJICAgICBieSBub3csIGJ1dCBpdCBzaG91bGQgYmUgZ2VuZXJpYyksIG5vdyBtZW1iZXIgY2FsbGJhY2tzCgkgICAgIGFyZSB3b3JraW5nIGFnYWluCgkgICAgIAoJICAgLSBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb25zIHBvaW50ZXJzIGxpa2UKCgkJIHN0ZDo6b3N0cmVhbSYgc3RkOjplbmRsKHN0ZDo6b3N0cmVhbSYpOwoKCSAgICAgaWUsIHRoZSBvbmVzIHRoYXQgcmV0dXJuIHJlZmVyZW5jZXMgb3IgZW51bXMuCgkgCgkgICBbUHl0aG9uXSBBZGQgdGhlICVweXRob25jYWxsYmFjayBkaXJlY3RpdmUsIHdoaWNoIGlzIAoJICAgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiAlY2FsbGJhY2ssIGllLAoKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIGZvbzsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcjsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcm07CgoJICAgICBpbnQgZm9vKGludCBhKSB7CgkgICAgICAgICByZXR1cm4gYTsKCSAgICAgfQogIAoJICAgICBzdHJ1Y3QgQSAKCSAgICAgewoJICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCBhKTsKCSAgICAgICBpbnQgYmFybShpbnQgYSk7CgoJICAgICB9OwoKICAgICAgICAgICAgIGludCBmb29iYXIoaW50IGEsIGludCAoKnBmKShpbnQgYSkpOwoKCSAgIGluIHB5dGhvbiB5b3UgY2FuIHVzZQoKICAgICAgICAgICAgIGZvbygyKQoJICAgICBmb29iYXIoMixmb28pCiAgICAgICAgICAgICBBLmJhcigyKQoJICAgICBmb29iYXIoMixBLmJhcikKICAgICAgICAgIAogICAgICAgICAgIGllLCBubyBhZGRpdGlvbmFsIHBvaW50ZXIgZWxlbWVudHMgYXJlIGNyZWF0ZWQsIGFuZAoJICAgdGhlIG9yaWdpbmFsICdmb28nIGFuZCAnQS5iYXInIGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlcnMuCgoJICAgSW4gdGhlIGNhc2Ugb2YgbWVtYmVyIGZ1Y250aW9uIGhvd2V2ZXIsIHN0aWxsIHlvdSBuZWVkCgkgICB0byB1c2UgdGhlIHNwZWNpYWwgdmFyaWFibGUgQ2xhc3M6OjxmbmNfbmFtZT5fY2JfcHRyLCBpZToKCiAJICAgICBmb29iYXJtKDMsIGEsIEEuYmFybV9jYl9wdHIpCgkgICAKCSAgIHdlIHdpbGwgdHJ5IHRvIGZpeCB0aGlzIHNpdHVhdGlvbiBhbHNvLCBidXQgbGF0ZXIuICAKCgkgICBbUHl0aG9uXSBBZGQgbW9yZSBlbGVtZW50cyBmcm9tIHRoZSBTVEwgbGlicmFyeSwgbm93CgkgICB5b3UgY2FuIHVzZQoKCSAgICAgaW1wb3J0IHN0ZAoJICAgICBzdGQuY291dCA8PCAiaGVsbG8gIiA8PCAxMjMgPDwgc3RkLmVuZGwKCgkgICBbUHl0aG9uXSBGaXggaW4vb3V0IHJldHVybiBtZWNoYW5pc20sIG5vdyBzd2lnIHdpbGwgYmVoYXZlCgkgICBhcyAxLjMuMjEgYnV0IHVzaW5nIGEgcHl0aG9uIGxpc3Qgd2hlbiBuZWVkZWQuIFRoZSBwcm9ibGVtCgkgICBpcyB0aGF0IHRoZSB0eXBlcyBzdGQ6OnBhaXIsc3RkOjp2ZWN0b3IsZXRjLCB1c2UgdHVwbGVzLAoJICAgYW5kIHRoZXkgaW50ZXJmZXIgd2l0aCB0aGUgcHJldmlvdXMgaW5vdXQgdHVwbGUgdHlwZS4KCgkgICBCeSB1c2luZyBsaXN0cyB3ZSBzb2x2ZSB0aGUgY29uZmxpY3RzLCBzd2lnIGFjdHMgYXMgYmVmb3JlLAoJICAgYnV0IHJldHVybnMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIgYXJlIHVzaW5nCgkgICB0aGUgT1VUIHR5cGVtYXAuIFNlZSB0aGUgbmV3IGlub3V0LmkgZXhhbXBsZSBpbiB0aGUKCSAgIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCQkgICAKICAgICAgICAgICBbUHl0aG9uXSBNdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgYmFkIGFyZ3VtZW50cywgbm93CgkgICB5b3UgYWx3YXlzIGdldCB0aGUgYXJndW1lbnQgbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KCjA5LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2UgLQogICAgICAgICAgICAxKSBXYXJuaW5nIGVtaXR0ZWQgd2hlbiAtaW1wb3J0YWxsIGFuZCAtaW5jbHVkZWFsbCBpcyB1c2VkIHRvZ2V0aGVyLAogICAgICAgICAgICAgICB3aXRoIC1pbmNsdWRlYWxsIHRha2luZyBwcmVjZWRlbmNlLgogICAgICAgICAgICAyKSBFbnN1cmUgU1dJR0lNUE9SVEVEIGlzIGFsd2F5cyBkZWZpbmVkIHdoZW4gYSBmaWxlIGlzIGJlaW5nCiAgICAgICAgICAgICAgIGltcG9ydGVkIHdpdGggJWltcG9ydC4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIFNXSUdJTVBPUlQsCiAgICAgICAgICAgICAgIHdoaWNoIGdldHMgZGVmaW5lZCBpbiBhbGwgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZXMuCgowOS8yNi8yMDA0OiBtbWF0dXMKCgkgICAgLSBhZGQgJWZlYXR1cmUoImV4Y2VwdGlvbmNsYXNzIikgdG8gaWRlbnRpZnkgYSBjbGFzcyB1c2VkCgkgICAgICBhcyBleGNlcHRpb24uIEJlZm9yZSBzd2lnIGlkZW50aWZpZWQgYW5kIG1hcmtlZCBhIGNsYXNzCgkgICAgICB1c2luZyB0aGUgImNwbHVzOmV4Y2VwdGlvbmNsYXNzIiBhdHRyaWJ1dGUuIEhvd2V2ZXIsIHRoZQoJICAgICAgY2xhc3MgbmVlZGVkIHRvIGFwcGVhciBvbiBhbiB0aHJvdygpIHN0YXRlbWVudC4gIE5vdwoJICAgICAgc3dpZyBrZWVwcyB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLCBhcwoJICAgICAgYmVmb3JlLCBidXQgaXQgYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gbWFyayBhIGNsYXNzIGJ5CgkgICAgICB1c2luZyB0aGUgJWZlYXR1cmUgZXhwbGljaXRseS4gKG1vc3RseSByZWxldmFudCBmb3IKCSAgICAgIHB5dGhvbiBhbmQgY2hpY2tlbikKCgkgICAgW1B5dGhvbl0KCgkgICAgLSBmaXggLW1vZGVybiBvcHRpb24gKyBleGNlcHRpb25zLCB3aGljaCBtaXggb2xkIGNsYXNzCgkgICAgICBzdHlsZSB3aXRoIHRoZSBuZXcgb25lLiBTbywgd2UgYWx3YXlzIG5lZWQgdG8gZW1pdAoJICAgICAgdGhlICJub25tb2Rlcm4iIHB5dGhvbiBjb2RlLgoKCSAgICAtIGFkZCB0aGUgInB5dGhvbjpub25keW5hbWljIiBmZWF0dXJlIGFuZCBpdHMgaGFuZGxlcgoKCSAgICAgIG5vdyBpZiB5b3UgaGF2ZQoJICAgICAgCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYyBBOwoJICAgICAgCgkgICAgICBzdHJ1Y3QgQSB7CgkgICAgICAgaW50IGE7CgkgICAgICAgaW50IGI7CgkgICAgICB9OwoKCSAgICAgIHRoZW4sIGluIHRoZSBweXRob24gc2lkZQoJICAgICAgCgkgICAgICBhYSA9IEEoKQoJICAgICAgCgkgICAgICBhYS5hID0gMSAjIG9rCgkgICAgICBhYS5iID0gMiAjIG9rCgkgICAgICBhYS5jID0gMyAjIGVycm9yLCB0aGUgY2xhc3MgY2FuIG5vdCBiZSBleHRlbmRlZCBkeW5hbWljYWxseS4KCgkgICAgCgkgICAgU2luY2UgdGhpcyBpcyBhIGZlYXR1cmUsIHlvdSBjYW4gdXNlCgoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWM7CgogICAgICAgICAgICBvciAKCgkgICAgICAlcHl0aG9uZHluYW1pYzsgWyBOb3RlOiAlcHl0aG9uZHluYW1pYyBzaW5jZSBkZXByZWNhdGVkIF0KICAgCgkgICAgdG8gZm9yY2UgYWxsIHRoZSB3cmFwcGVkIGNsYXNzZXMgdG8gYmUgIm5vbmR5bmFtaWMiIG9uZXMuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiByZWd1bGFyIHB5dGhvbiwgaXMgdGhhdCBhbGwgdGhlIHdyYXBwZWQKCSAgICBjbGFzc2VzIGFyZSBkeW5hbWljcy4gU28sIGNhcmVmdWwgd2l0aCB5b3VyIHNwZWxsaW5nLgoKMDkvMTQvMjAwNDogbW1hdHVzIAoJICAgIC0gU3VwcG9ydCB0aGUgLUktIG9wdGlvbi4KCgkgICAgLSBEaWZmZXJlbnRpYXRlIGJldHdlZW4gJWluY2x1ZGUgPGZpbGU+IGFuZCAlaW5jbHVkZSAiZmlsZSIuCgkgICAgICBUaGlzIGZpeCBzZXZlcmFsIGNvcm5lciBjYXNlcy4KCgkgICAgCgkgICAgW1B5dGhvbl0gU2V2ZXJhbCBwYXRjaGVzOgoKCSAgICAtIE5vcm1hbGl6ZSB0aGUgTGliIGZpbGUgbmFtZXM6IAoJCSouc3dnIGludGVybmFsIGZpbGVzLCAKCQkqLmkgICB1c2VyIGZpbGVzLgoKCSAgICAtIEZpeCBDaGFyW0FOWV0gdHlwZW1hcHMsIHNvIHRoZXkgYWxzbyBkZWxldGUgYW55IGV4dHJhICdcMCcgY2hhcnMsCgkgICAgICBub3cgdGhleSBiZWhhdmUgYXMgYmVmb3JlICgxLjMuMjEpLiBTdGlsbCwgeW91IGNhbiB1c2UKCSAgICAgIHRoZSBTV0lHX1BSRVNFUlZFX0NBUlJBWV9TSVpFIG1hY3JvIGlmIHlvdSBuZWVkIHRvCgkgICAgICBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2l6ZSAoc2VlIHB5c3RyYmFzZS5zd2cpLgoKCSAgICAtIEFkZCB0aGUgQ2hhciBGSVhTSVpFW0FOWV0gdHlwZW1hcHMsIHRvIHByZXNlcnZlIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIEMgYXJyYXkgc2l6ZXMgKHNlZSBhYm92ZSkuIFRob3VnaCwgeW91IGNhbid0CiAgICAgICAgICAgICAgdXNlIHRoZW0geWV0IHNpbmNlICVhcHBseSBhbmQgYXJyYXlzIGFyZSBub3Qgd29ya2luZwogICAgICAgICAgICAgIHRvZ2V0aGVyLgoKICAgICAgICAgICAgLSBBZGQgcHlmcmFnbWVudHMuc3dnLCBub3cgdGhlIHVzZXIgY2FuIGFkZCBmcmFnbWVudHMKCSAgICAgIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9uZXMuCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIHdoaWNoIGZpeGVzIHNwdXJpb3VzIHByZXByb2Nlc3NvciBidWcgd2hpY2gKICAgICAgICAgICAgc2hvd3Mgb24gU29sYXJpcyBhbmQgZ2NjLCBlZzoKICAgICAgICAgICAgICAgIFdhcm5pbmcoMjAyKTogQ291bGQgbm90IGV2YWx1YXRlICchZGVmaW5lZChTV0lHSkFWQSkgJiYKICAgICAgICAgICAgICAgICEoZGVmaW5lZChTV0lHQ1NIQVJQKScKICAgICAgICAgICAgQWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSAnI2lmICJhIiA9PSAiYiIgPT0gMScgd291bGRuJ3QgaGF2ZSB3b3JrZWQgCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3Qtc3VpdGUuIFBhdGNoIGZyb20KICAgICAgICAgICAgQmlsbCBDbGFya2UuCgowOS8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbWlzc2luZyBydW50aW1lLmRzcCBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMgZm9yIHRoZQogICAgICAgICAgICBpbXBvcnQgZXhhbXBsZXMgdG8gd29yay4KCgpWZXJzaW9uIDEuMy4yMiAoU2VwdGVtYmVyIDQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBzd2lnLm00IG1hY3JvIGZvciB1c2Ugd2l0aCB0aGUgQXV0b2NvbmYvQXV0b21ha2UvTGlidG9vbCBoYXMKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHRoZSBuZXcgYW5kIGJldHRlcgogICAgICAgICAgICBtYWludGFpbmVkIHZlcnNpb24gZGVyaXZlZCBmcm9tIHN3aWcubTQgaW4gdGhlIEF1dG9jb25mIG1hY3JvIGFyY2hpdmUuCiAgICAgICAgICAgIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3BrZ19zd2lnLmh0bWwgYW5kCiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcHl0aG9uX2RldmVsLmh0bWwuCgowOS8wMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCBwYXRjaCAjMTAxOTY2OSBmcm9tIENocmlzdG9waCBGbGFtbS4gQWRkcyBzdXBwb3J0CiAgICAgICAgICAgIGZvciAlZmVhdHVyZSgic2hhZG93IikgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdvcmtzIGluIFB5dGhvbi4gVGhpcwogICAgICAgICAgICBlbmFibGVzIG9uZSB0byBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHNoYWRvdy9wcm94eSBtZXRob2RzLCBpbmNsdWRpbmcKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8qIExldCdzIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcyBTcXVhcmUgbW9yZSB2ZXJib3NlICovCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSBTcXVhcmUoZG91YmxlIHcpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN1YiBuZXcgewogICAgICAgICAgICAgICAgICBteSAkcGtnID0gc2hpZnQ7CiAgICAgICAgICAgICAgICAgIG15ICRzZWxmID0gZXhhbXBsZWM6Om5ld19TcXVhcmUoQF8pOwogICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgIkNvbnN0cnVjdGVkIGFuIEB7W3JlZigkc2VsZildfVxuIjsKICAgICAgICAgICAgICAgICAgYmxlc3MgJHNlbGYsICRwa2cgaWYgZGVmaW5lZCgkc2VsZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgY2xhc3MgU3F1YXJlIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBTcXVhcmUoZG91YmxlIHcpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjA4LzMxLzIwMDQ6IG1tYXR1cyAKCSAgICBbUHl0aG9uXSBJbmNvbXBhdGliaWxpdHkgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UgKGxsaWJAY29tcHV0ZXIub3JnKToKCSAgICAKCSAgICBJZiB5b3UgYXJlIHVzaW5nIFN1biBTdHVkaW8gOCAoYW5kIHBvc3NpYmx5IGVhcmxpZXIKCSAgICB2ZXJzaW9ucykgdG8gY29tcGlsZSB0aGUgb3V0cHV0IHByb2R1Y2VkIGJ5IHN3aWcKCSAgICAxLjMuMjJyYzEsIGFuZCB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgU1RMIHRlbXBsYXRlcyB0aGVuCgkgICAgeW91IG5lZWQgdG8gdXNlIGVpdGhlciAiLXJ1bnRpbWUiIG9yICItbm9ydW50aW1lIi4gIElmIHlvdQoJICAgIHVzZSBuZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBnZXQKCSAgICBjb21waWxlciBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgd3JhcHBlciBmaWxlOwoJICAgIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbGlrZSB0aGlzOiBUaGUgbmFtZQoJICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJbLi4uXSBpcyB1bnVzYWJsZSBpbiBzdGF0aWMKCSAgICBzd2lncHk6OnRyYWl0c19hc3B0clsuLi5dICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IgbWVzc2FnZSwKCSAgICB5b3UgbmVlZCB0byByZWdlbmVyYXRlIHlvdXIgd3JhcHBlciBmaWxlIHVzaW5nICdzd2lnCgkgICAgLXJ1bnRpbWUnIG9yICdzd2lnIC1ub3J1bnRpbWUnLgoKCSAgICBZb3Ugc2hvdWxkbid0IGdldCB0aGlzIHByb2JsZW0gd2l0aCBTdW4gU3R1ZGlvIDkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCSAgICAKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgIzkzMjMzMyBmcm9tIElrZWdhbWkgVHN1dG9tdS4gRml4ZXMgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICM4NTczNDQgZnJvbSBBcnQgWWVya2VzLiBXb3JrYXJvdW5kIGZvciBhdXRvY29uZiBidWcgd2hlbgogICAgICAgICAgICBydW5uaW5nICdtYWtlIGluc3RhbGwnLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhcnQgb2YgcGF0Y2ggIzk4Mjc1MyBhcHBsaWVkLiBUaGlzIGltcGxlbWVudHMgYSAlcGVybGNvZGUgZGlyZWN0aXZlLgogICAgICAgICAgICBJdCBhbGxvd3Mgb25lIHRvIGFkZCBQZXJsIGNvZGUgdG8gdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gV29ya3MgdGhlIHNhbWUgCiAgICAgICAgICAgIGFzICVweXRob25jb2RlLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgdmlydHVhbCBtZXRob2RzIHdpdGggZXhjZXB0aW9uCiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYXQgd2VyZSBub3Qgc2ltcGxlIHR5cGVzLiBQcmV2aW91c2x5IGNvZGUgd2FzIGdlbmVyYXRlZCB0aGF0CiAgICAgICAgICAgIGRpZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB3YXMgYSBwb2ludGVyLgoKMDgvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwIGZpeCBmb3IgbWV0aG9kcyB0aGF0IHJldHVybiBjaGFyICouIFRoZSBDTFIgd291bGQgaW5jb3JyZWN0bHkKICAgICAgICAgICAgZGVsZXRlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBjaGFyICouIEFsc28gYXBwbGllZCB0aGUgc2FtZSBjb3JyZWN0aW9uIHRvCiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzLgoKMDgvMjQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIC1mbWljcm9zb2Z0IGVycm9yL3dhcm5pbmcgbWVzc2FnZSBkaXNwbGF5OiAKICAgICAgICAgICAgLSBFbmQgb2YgZmlsZSAoRU9GKSB3YXJuaW5nIG1lc3NhZ2VzIG5vdCBkaXNwbGF5aW5nIGluIGNvcnJlY3QgZm9ybWF0CiAgICAgICAgICAgIC0gU29tZSBtZXNzYWdlcyBjb250YWluaW5nIGEgZmlsZSBwYXRoIHdlcmUgZGlzcGxheWluZyBhIGRvdWJsZSBiYWNrc2xhc2gKICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGJhY2tzbGFzaAoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjMTAxMTYwNCBzdWJtaXR0ZWQgYnkgQ2hhcmxlcyBTY2h3aWV0ZXJzLiBGaXggZm9yIDY0IGJpdCB0Y2wKICAgICAgICAgICAgaW50ZXJwcmV0ZXJzLgoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBidWcgIzg3NTU4MyAtIGVudW0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgcHJldmlvdXNseSBnYXZlIGEgc3ludGF4IGVycm9yLgoKMDgvMjMvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2UgdHlwZW1hcHMgImZmaXR5cGUiIGFuZCAibGlzcHR5cGUiIHRvIGRldGVybWluZSB0aGUgRkZJIHR5cGUKCSAgICBzcGVjaWZpZXJzIGZyb20gdGhlIEMgdHlwZS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUsIGZvciBpbnN0YW5jZSwgdG8gY29udHJvbAoJICAgIHdoZXRoZXIgYSBDICJjaGFyIiBhcmd1bWVudCB0YWtlcyBhIExpc3AgY2hhcmFjdGVyIG9yIGEgTGlzcCBpbnRlZ2VyIHZhbHVlLgoJICAgIFRoZSBkZWZhdWx0ICh0YWtpbmcgTGlzcCBjaGFyYWN0ZXJzKSBpcyBkb25lIGJ5IHRoZXNlIGJ1aWx0LWluIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiY2hhcmFjdGVyIjsKCSAgICBJZiBjaGFyIG1lYW5zIGFuIGludGVnZXIgaW5zdGVhZCwgdXNlIHRoZXNlIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiaW50ZWdlciI7CgowOC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcyBkaXNjdXNzZWQgaW4gYnVnICM3NzI0NTMsIHRoZSBTV0lHIGxpYnJhcnkgZGlyZWN0b3J5IGlzIG5vdyBpbnN0YWxsZWQKICAgICAgICAgICAgaW50byBhIGRpZmZlcmVudCBkZWZhdWx0IGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgdXNlZCB0byBiZSBpbnN0YWxsZWQgdG8KICAgICAgICAgICAgL3Vzci9sb2NhbC9saWIvc3dpZzEuMy4gSXQgaXMgbm93IGluIHRoZSBtb3JlIHVzdWFsIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudAogICAgICAgICAgICBkaXJlY3RvcnkgYW5kIEkgaGF2ZSBhZGRpdGlvbmFsbHkgdXNlZCBhIHZlcnNpb24gc3BlY2lmaWMgc3ViZGlyZWN0b3J5IGFzCiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHdpbGwgcmFyZWx5IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHLiBUaGlzIHJlbGVhc2UKICAgICAgICAgICAgd2lsbCB0aHVzIHVzZSAvdXNyL2xvY2FsL3NoYXJlL3N3aWcvMS4zLjIyIGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB0YWlsb3JlZCBhcyBiZWZvcmUgdXNpbmcgJy4vY29uZmlndXJlIC0tc3dpZ2xpYmRpcicuCgowOC8xNy8yMDA0OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBBZGQgc3VwcG9ydCB0byBjcmVhdGUgbmF0aXZlIE16U2NoZW1lIHN0cnVjdHVyZXMgZnJvbSBDIHN0cnVjdHVyZXMuCgkgICAgVG8gY29udmVydCBhIEMgc3RydWN0dXJlIHRvIGFuIE16U2NoZW1lIHN0cnVjdHVyZSwgdXNlIHRoZSBuZXcgcnVudGltZSBtYWNybwoJICAgIFNXSUdfTmV3U3RydWN0RnJvbVB0ciBpbiBhIHR5cGVtYXAuICBQYXRjaCBmcm9tIERtaXRyaXkgWmF2aW4uIAoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzgzNzcxNSBmcm9tIEJlbiBSZXNlciB0byBjb3JyZWN0bHkgZGV0ZWN0IFB5dGhvbiBsaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIG9uIDY0IGJpdCBzeXN0ZW1zLgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSBvZiBlYXJseSByZXR1cm4KICAgICAgICAgICAgZnJvbSB3cmFwcGVyIG1ldGhvZHMgdXNpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbWV0ZXJzLiBNb2RpZmllZAogICAgICAgICAgICBNYXJrIFRyYXVkdCBwYXRjaCAjOTUxNTY1LgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQnVnICM5NDM3ODMgd2l0aCBwYXRjaCBmaXhlcyBwaHAgY2hhciAqIG91dCB0eXBlbWFwIE5VTEwgdmFsdWVzLgoKMDgvMDMvMjAwNDogQWhtb24gRGFuY3kgIDxkYW5jeUBkYW5jeT4KCiAgICAgICAgICAgIFthbGxlZ3JvY2xdIEFkZGl0aW9uYWwgY2FzZSBtb2RlIGZpeGVzLiAgQWxzbywgbWFrZSBzdXJlCgkgICAgZm9yZWlnbiB0eXBlcyBhcmUgZXhwb3J0ZWQuCgowNy8yNC8yMDA0OiBta29lcHBlIAoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBTV0lHIG1vZHVsZXMgbm93IGV4Y2hhbmdlIHRoZWlyIHBvaW50ZXIgdHlwZQoJICAgIGluZm9ybWF0aW9uIHZpYSB0aGUgR3VpbGUgaW50ZXJwcmV0ZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEKCSAgICBydW50aW1lIGxpYnJhcnkgb3IgdG8gdXNlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGV0Yy4KCSAgICAKCSAgICBUaGUgbW9kdWxlIChTd2lnIHN3aWdydW4pIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBjaGFuZ2Ugb2YgMDUvMTcvMjAwNCBpcwoJICAgIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGJ1aWx0LiAgSWYgeW91IG5lZWQgaXQsIHJ1biBTV0lHIG9uIHRoZSBpbnRlcmZhY2UgZmlsZQoJICAgIHN3aWdydW4uaS4gCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEJ1ZyAjOTE3NjAxIE1hcHBpbmcgQysrIGJvb2wgZml4IGZyb20gTWFyayBUcmF1ZHQKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJQTSBmaXhlcyBmb3IgbGF0ZXN0IENWUyB2ZXJzaW9uIGluY2x1ZGluZyByZW1vdmFsIG9mIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyeS4KCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5MDg5NTUgZnJvbSBSb2JlcnQgSCBEZSBWcmllcy4KICAgICAgICAgICAgUlBNIGZpbGUgZ2VuZXJhdGlvbiBmaXggZm9yIEZlZG9yZSBDb3JlIDEgYW5kIFJlZGhhdCBBUzIuMS4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4NjQ2ODkgZnJvbSBSb2JpbiBEdW5uOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0cyB0d28gcHJvYmxlbXMgaW4gdGhlIFhNTCBvdXRwdXQgb2YgU1dJRzoKICAgICAgICAgICAgIAogICAgICAgICAgICAgIDEuIFRoZXJlIHdlcmUgb2Z0ZW4gZXh0cmEgJy8+XG4nIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgMi4gdmFsdWUgYXR0cmlidXRlcyB3ZXJlIG91dHB1dCB3aXRoICdcbicgaW4gdGhlbSBidXQKICAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG5vdCB0ZWNobmljYWxseSBsZWdhbCBtb3N0IChhbGw/KSBYTUwKICAgICAgICAgICAgICBwYXJzZXJzIHdpbGwgc3RyaXAgdGhlbSBvdXQuIFJlcGxhY2luZyB0aGUgJ1xuJyB3aXRoCiAgICAgICAgICAgICAgdGhlICcmIzEwOycgZW50aXR5IHJlZmVyZW5jZSBzb2x2ZXMgdGhpcyBhcyB0aGF0IGlzCiAgICAgICAgICAgICAgbGVnYWwgYW5kIFhNTCBwYXJzZXJzIHdpbGwgY29udmVydCBpdCB0byBhICdcbicgd2hlbgogICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHZhbHVlcyBiYWNrIGluLgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGEgbmV3IGdsb2JhbCBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgICAgICAgICAgdGhhdCB3aWxsIGFsbG93IHRoZSBwYXJzZSB0cmVlIHRvIGJlIHdyaXR0ZW4gb3V0IGluIFhNTAogICAgICAgICAgICAgICphZnRlciogc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGUgaGFzIGJlZW4gcnVuLCBpbgogICAgICAgICAgICAgIG9yZGVyIHRvIGJlIGFibGUgdG8gZ2V0IGV4dHJhIGluZm8gdGhhdCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICBtb2R1bGUgcHV0cyBpbiB0aGUgdHJlZS4gSW4gdGhpcyB3YXkgdGhlIFhNTCBpcyBhCiAgICAgICAgICAgICAgcG9zdC1wcm9jZXNzZWQgdmVyc2lvbiBvZiB0aGUgdHJlZSByYXRoZXIgdGhhbiBhCiAgICAgICAgICAgICAgcHJlLXByb2Nlc3NlZCB2ZXJzaW9uLiAKIAogICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb24gaXMgLWR1bXBfeG1sIG9yIC14bWxvdXQgPGZpbGU+CgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgdG8gZml4IHR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMKICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24gKG1ha2VjaGFwLnB5KSBmaWxlIGdlbmVyYXRvciBtaXNzaW5nIGVuZCBvZiBsaW5lCiAgICAgICAgICAgIHBhdGNoICM5MDg5NTEgZnJvbSBSb2JlcnQgZGUgVnJpZXMuCgowNy8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBydW50aW1lIGxpYnJhcnkgYnVpbGQgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcyBhbHNvIHJlbW92ZXMKICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgb24gTGlidG9vbC4gTGlidG9vbCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gYnVpbGQgU1dJRy4KICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgLWxkZmxhZ3MgU1dJRyBjb21tYW5kbGluZSBvcHRpb24gaGFzIGFsc28gYmVlbiByZW1vdmVkLgoKICAgICAgICAgICAgVGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRlc3RjYXNlcyB0aGF0IHVzZWQgdGhlIHJ1bnRpbWUgbGlicmFyeSBoYXZlCiAgICAgICAgICAgIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHJlcGxhY2VtZW50IGFwcHJvYWNoIHRvIHVzaW5nIFNXSUcgYWNyb3NzIAogICAgICAgICAgICBtdWx0aXBsZSBtb2R1bGVzLCB0aGF0IGlzIHRoZXkgdXNlIHRoZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLCBzZWUgTW9kdWxlcy5odG1sLiBFZmZlY3RpdmVseSB0aGV5IGJ1aWxkIHRoZWlyIG93biBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcmllcyB1c2luZyAtcnVudGltZS4gVGhlIGV4YW1wbGVzIGFyZSBpbXBvcnQgYW5kIGltcG9ydF90ZW1wbGF0ZS4KICAgICAgICAgICAgVGhlIHRlc3QgY2FzZXMgYXJlIGluIHRoZSBpbXBvcnRzIGFuZCB0ZW1wbGF0ZV90eXBlZGVmX2ltcG9ydCBkaXJlY3Rvcmllcy4KCiAgICAgICAgICAgIEFueW9uZSB3aG8gd2FudHMgdGhlIG9yaWdpbmFsIHJ1bnRpbWUgbGlicmFyaWVzIGNhbiBlaXRoZXIgcnVuIHRoZSB0ZXN0LXN1aXRlCiAgICAgICAgICAgIG9yIGJ1aWxkIHRoZSBleGFtcGxlcyBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFyZWQgb2JqZWN0L0RMTCB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aXRoIHRoZSAtcnVudGltZSBjb21tYW5kbGluZSBvcHRpb24uIEZvciBleGFtcGxlIGxpYmltcG9ydHNfcnVudGltZS5zbwogICAgICAgICAgICAoUHl0aG9uIGNhbGxzIGl0IGxpYl9pbXBvcnRzX3J1bnRpbWUuc28pIGlzIGdlbmVyYXRlZCBhZnRlciBydW5uaW5nIHRoZSAKICAgICAgICAgICAgJ21ha2UgaW1wb3J0cy5tdWx0aWNwcHRlc3QnIHRlc3RjYXNlIGluIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlLzxsYW5nPgogICAgICAgICAgICBkaXJlY3RvcnkuIE9yIHVzZSBsaWJydW50aW1lLnNvIC8gcnVudGltZS5kbGwgYWZ0ZXIgYnVpbGRpbmcgdGhlIGltcG9ydAogICAgICAgICAgICBleGFtcGxlcyBpbiBFeGFtcGxlcy88bGFuZz4vaW1wb3J0LgoKMDcvMDcvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBDb252ZXJ0IGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGluIGNvbnN0YW50cyB0byAKCSAgICBDTCBzeW50YXguICBGaXggRkY6REVGLUZPUkVJR04tQ0FMTCBmb3IgbWl4ZWQtY2FzZSBDIGZ1bmN0aW9ucy4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZmVhdHVyZSBmb3IgSmF2YSBleGNlcHRpb25zIHdpdGggZm9ybWF0ICVqYXZhZXhjZXB0aW9uKGV4Y2VwdGlvbmNsYXNzZXMpLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgYSBzbGlnaHQgZW5oYW5jZW1lbnQgdG8gJWV4Y2VwdGlvbiBhbmQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgCiAgICAgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBleGNlcHRpb24gY2xhc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGludG8gYSB0aHJvd3MgY2xhdXNlLgogICAgICAgICAgICBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBhc3NvY2lhdGVkIHByb3h5IG1ldGhvZCdzIHRocm93cyBjbGF1c2UuIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycKICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBsaWtlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBpbiB0aGUgJ3Rocm93cycgYXR0cmlidXRlIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwcy4gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGZvciBjb3JyZWN0bHkgaGFuZGxpbmcgY2hlY2tlZCBleGNlcHRpb25zCiAgICAgICAgICAgIHRocm93biBmcm9tIEpOSSBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFleGNlcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iKSB0aHJvd0V4Y2VwdGlvbiAlewogICAgICAgICAgICAgICAgLi4uIGNvbnZlcnQgYSBzdGQ6OmxvZ2ljX2Vycm9yIGludG8gYSBqYXZhLmxhbmcuRXhjZXB0aW9uIHVzaW5nIEpOSSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAgICAgICAgICAgICAgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkxvZ2ljIGVycm9yISIpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2Qgd2l0aCBhIHRocm93cyBjbGF1c2UgaW4gdGhlIG1vZHVsZSBjbGFzczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geyAuLi4gfQoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgJWNzY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFRoaXMgd29ya3MgdGhlIHNhbWUgd2F5IGFzICVqYXZhY29uc3R2YWx1ZS4gRm9yIEMjLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgICBpcyB0aGUgb25seSB3YXkgdGhhdCBvbmUgY2FuIGZpeCB3cmFwcGluZyBvZiBDL0MrKyBlbnVtcyB3aXRoIHByb3BlciBDIwogICAgICAgICAgICBlbnVtcyBpZiB0aGUgZW51bSBpdGVtJ3MgaW5pdGlhbGlzZXIgY2Fubm90IGNvbXBpbGUgYXMgQyMgY29kZS4gVGhpcyBpcwogICAgICAgICAgICBiZWNhdXNlIEphdmEgZW51bXMgY2FuIHVzZSBhIGNhbGwgaW50byBDIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZW51bSBpdGVtLAogICAgICAgICAgICB3aGVyZWFzIGluIEMjLCB0aGUgZW51bSB2YWx1ZSBtdXN0IGJlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiBUaGF0IGlzLAogICAgICAgICAgICB1c2luZyAlY3Njb25zdCgwKSBjYW5ub3QgYmUgdXNlZCBpbiBDIyB0byBpbml0aWFsaXNlIHRoZSBDIyBlbnVtIGl0ZW0gdmlhCiAgICAgICAgICAgIGEgUElOVk9LRSBjYWxsLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyAlamF2YWNvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBTb21ldGltZXMgdGhlIHVzZSBvZiAlamF2YWNvbnN0KDEpIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZQogICAgICAgICAgICB1bmRlciBKYXZhLiBJZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBpcyByZXF1aXJlZCwgJWphdmFjb25zdCgwKSBpcyBub3QgYW4KICAgICAgICAgICAgb3B0aW9uLiBUaGUgJWphdmFjb25zdHZhbHVlIGRpcmVjdGl2ZSBhY2hpZXZlcyB0aGlzIGdvYWwgYW5kIHRoZSB2YWx1ZSBzcGVjaWZpZWQKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGFzIEphdmEgY29kZSB0byBpbml0aWFsaXNlIHRoZSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMDAwKSBCSUc7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKCJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIyMDAwXCIpIikgTEFSR0U7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwKSBiYXI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXIgPSAxMDsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICNkZWZpbmUgQklHIDEwMDBMTAogICAgICAgICAgICAgICAgI2RlZmluZSBMQVJHRSAyMDAwVUxMCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7IEJBUiA9IDo6YmFyIH07CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEdlbmVyYXRlczoKCiAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBleGFtcGxlQ29uc3RhbnRzIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMDAwOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBMQVJHRSA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMjAwMCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9vIEJBUiA9IG5ldyBGb28oIkJBUiIsIDEwKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHksIG5vbmUgb2YgQklHLCBMQVJHRSBvciBCQVIgd291bGQgaGF2ZSBwcm9kdWNlZCBjb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgZW5oYW5jZW1lbnRzLiBGZWF0dXJlcyBjYW4gbm93IHRha2UgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGluIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlIG5hbWUgYW5kIGZlYXR1cmUgdmFsdWUuIFRoZSBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbCAKICAgICAgICAgICAgYW5kIGFyZSBtdWNoIHRoZSBzYW1lIGFzIHRoZSB0eXBlbWFwIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHNwZWNpZmllcyB0d28gb3B0aW9uYWwgYXR0cmlidXRlcywgYXR0cmliMSBhbmQgYXR0cmliMjoKCiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lICJ2YWwiOwogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIHZhbCwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lOwoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciB0aGUgc3ludGF4IHRoYXQgdGFrZXMgdGhlIGZlYXR1cmUgdmFsdWUgd2l0aGluIHRoZQogICAgICAgICAgICAlZmVhdHVyZSgpIGJyYWNrZXRzLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vIGxvbmdlciByZXN0cmljdGVkIHRvIGJlaW5nIGp1c3QKICAgICAgICAgICAgYSBzdHJpbmcuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IGFjY2VwdGFibGUKICAgICAgICAgICAgc3ludGF4OgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsMjAuMCk7CiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZCBoYXZlIHRvIGhhdmUgYmVlbjoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLCIyMC4wIik7CiAgICAgICAgICAgIFVzZWZ1bCBmb3IgZmVhdHVyZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSAlc29tZWZlYXR1cmUodmFsdWUpICAgICAgJWZlYXR1cmUoInNvbWVmZWF0dXJlIix2YWx1ZSkKICAgICAgICAgICAgVGhlc2Ugd2lsbCBub3cgd29yayBhY2NlcHRpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyOgogICAgICAgICAgICAgICVzb21lZmVhdHVyZSgiRnJlZCIpOwogICAgICAgICAgICAgICVzb21lZmVhdHVyZSg0KTsKCjA2LzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbiwgR3VpbGVdCiAgICAgICAgICAgICAtIENyZWF0ZWQgdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvc2NoZW1lcnVubWUgZGlyZWN0b3J5LCB3aGljaCBob2xkcyBhbGwgdGhlCgkgICAgICAgcnVubWUgc2NyaXB0cyBmb3IgZ3VpbGUgYW5kIGNoaWNrZW4gKGFuZCBwb3NzaWJseSBtenNjaGVtZS4uLikuICBUaGUgZ3VpbGUKCSAgICAgICBhbmQgY2hpY2tlbiBfcnVubWUgZmlsZXMgdGhlbiAobG9hZCAiLi4vc2NoZW1lcnVubWUvZm9vLnNjbSIpLgogICAgICAgICAgICAgLSBJbiBjaGlja2VuIG1vZHVsZSwgZml4IGEgZmV3IGJ1Z3MgaW52bG9sdmluZyBkeW5hbWljIGNhc3RzLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggdG8gZml4IHdyYXBwaW5nIG9mIHRlbXBsYXRlZCBtZXRob2RzLiBJU08gY29tcGxpYW50IGNvbXBpbGVycywgbGlrZQogICAgICAgICAgICBDb21lYXUgYW5kIEdDQy0zLjQuMCwgZG9uJ3QgbGlrZSB0aGUgdGVtcGxhdGUgc3BlY2lmaWVyIHRoYXQgU1dJRyB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICB3aGVuIGNhbGxpbmcgdGhlIG1ldGhvZC4gVGhpcyBmaXggbWF5IGJyZWFrIHNvbWUgbm9uIHN0YW5kYXJkIGNvbXBsaWFudCBjb21waWxlcnMsCiAgICAgICAgICAgIGZvciBleGFtcGxlLCBTdW4gd29ya3Nob3AgY29tcGlsZXJzIHByaW9yIHRvIHZlcnNpb24gNi4yLnAyLiBQYXRjaCBzdWJtaXR0ZWQKICAgICAgICAgICAgYnkgQmlsbCBDbGFya2UuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFVuZG9jdW1lbnRlZCBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZSByZW1vdmVkLgogICAgICAgICAgICBOZXcgc3BlY2lhbCB2YXJpYWJsZSAkbW9kdWxlIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYXMgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5ICVtb2R1bGUgb3IgLW1vZHVsZSBjb21tYW5kbGluZSBvcHRpb24uICRpbWNsYXNzbmFtZSBjYW4gYmUgY3JlYXRlZCBmcm9tICRtb2R1bGUuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNhbWUgYXMgZm9yIEphdmEgYmVsb3cuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5LCBuYW1lbHksCiAgICAgICAgICAgIGNzYm9keSBhbmQgY3Nib2R5X2Rlcml2ZWQuIFRoZSBkZXByZWNhdGVkIHR5cGVtYXBzIGFyZSBjc2dldGNwdHIgYW5kCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFR5cGVtYXAgY2hhbmdlcyBmb3IgdGhlIEphdmEgcHJveHkgLyB0eXBld3JhcHBlciBhbmQgZW51bSBjbGFzc2VzLiBBIG5ldwogICAgICAgICAgICB0eXBlbWFwIGNhbGxlZCBqYXZhYm9keSBjb250YWlucyB0aGUgZXNzZW50aWFsIHN1cHBvcnQgY29kZSBmb3IgZ2VuZXJhdGlvbiBpbnRvIHRoZSBib2R5CiAgICAgICAgICAgIG9mIHRoZXNlIGNsYXNzZXMuIFRoZXJlIGlzIGFsc28gYSBuZXcgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwIHdoaWNoIGlzIHVzZWQgaW5zdGVhZCBmb3IKICAgICAgICAgICAgd3JhcHBlZCBjbGFzc2VzIHRoYXQgaGF2ZSBhIHdyYXBwZWQgYmFzZSBjbGFzcy4gVGhlIGNvZGUgaXMgYmFzaWNhbGx5LCB0aGUgZ2V0Q1B0cigpCiAgICAgICAgICAgIG1ldGhvZCBhbmQgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMuIFRoZXNlIHVzZWQgdG8gYmUgaGFyZCBjb2RlZAogICAgICAgICAgICB3aXRoIG5vIHdheSB0byBtb2RpZnkgdGhlIGNvZGUuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhpcyB0eXBlbWFwIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgICB0aGUgdXNlciB0byB0YWlsb3IgbmVhcmx5IGV2ZXJ5IGFzcGVjdCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uLgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIG5vdyBpcyB0aGUgY29kZSBmb3IgZGlyZWN0b3IgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciBhbmQgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIHR5cGVtYXBzIGFyZSBkZXByZWNhdGVkIGFuZCBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgdGhhdCB0aGVzZSBnZW5lcmF0ZWQgY2FuIGJlIHB1dCBpbiB0aGUgbW9yZSBmbGV4aWJsZQogICAgICAgICAgICBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbCBtYXkgaGVscCB5b3UgdXBncmFkZSBpZiB5b3UgaGF2ZSB1c2VkCiAgICAgICAgICAgIHRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwOgoKICAgICAgICAgICAgICAgIC8qIFV0aWxpdHkgbWFjcm8gZm9yIG1hbmlwdWxhdGluZyB0aGUgSmF2YSBib2R5IGNvZGUgbWV0aG9kIGF0dHJpYnV0ZXMgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgQ1RPUl9BVFRSSUIsIEdFVENQVFJfQVRUUklCKQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHkpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3dpZ0NNZW1Pd247CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN3aWdDTWVtT3duID0gY01lbW9yeU93bjsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5X2Rlcml2ZWQpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIoJG1vZHVsZUpOSS5TV0lHJGphdmFjbGFzc25hbWVVcGNhc3QoY1B0ciksIGNNZW1vcnlPd24pOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogVGhlIGRlZmF1bHQgaXMgcHJvdGVjdGVkIGdldENQdHIsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhTV0lHVFlQRSwgcHJvdGVjdGVkLCBwcm90ZWN0ZWQpCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0dFVENQVFIoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwcm90ZWN0ZWQsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHB1YmxpYyBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfQk9EWU1FVEhPRFMoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwdWJsaWMsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBtb2RpZmllciB0eXBlbWFwcyBhbmQgcHJhZ21hcyBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgIFRoZXkgbXVzdCBub3cgaW5jbHVkZSB0aGUgY2xhc3MgdHlwZS4gUHJldmlvdXNseSAnY2xhc3MnIHdhcyBoYXJkIGNvZGVkLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBlbmFibGVzIGZsZXhpYmlsaXR5IGludG8gd2hhdCB0eXBlIG9mIGNsYXNzIGlzIGdlbmVyYXRlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgdGhlIHByb3h5IGNsYXNzIGNvdWxkIGJlIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MuCgogICAgICAgICAgICBGb3IgSmF2YSB0aGlzIGFmZmVjdHMgdGhlIGphdmFjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIEZvciBDIyB0aGlzIGFmZmVjdHMgdGhlIGNzY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIFVubGVzcyB5b3UgaGF2ZSBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IHZlcnNpb25zIG9mIHRoZXNlIHR5cGVtYXBzIG9yIHByYWdtYXMsIHlvdQogICAgICAgICAgICBzaG91bGRuJ3QgYmUgYWZmZWN0ZWQuIEhvd2V2ZXIsIGlmIHlvdSBoYXZlLCB1cGdyYWRpbmcgaXMgZWFzeSwgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIgoKICAgICAgICAgICAgbXVzdCBub3cgYmU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCBjbGFzcyIKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gUHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBPcmVuIE1pbGxlci4gQWxzbyBpbXByb3ZlcyB0aGUgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhdGNoIGhhbmRsZXIgZm9yIHBvaW50ZXJzIC0gYSBwb2ludGVyIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0bwogICAgICAgICAgICBhIHBvaW50ZXIuIEFkZGVkIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIGZvciBTV0lHVFlQRSAmLCBTV0lHVFlQRSAqIGFuZAogICAgICAgICAgICBTV0lHVFlQRVtBTlldIChKYXZhIGFuZCBDIykuCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgbWlub3IgdHlwZXNhZmUgZW51bSBpbXByb3ZlbWVudHMsIGluY2x1ZGluZyBzdG9yaW5nIHRoZSBuYW1lIG9mCiAgICAgICAgICAgIHRoZSBlbnVtIGl0ZW0uIFRoZSB0b1NyaW5nKCkgLyBUb1N0cmluZygpIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoaXMgbmFtZS4KCjA1LzMwLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgIC0gVXBkYXRlIGhvdyBleGFtcGxlcyBhbmQgdGhlIHRlc3Qgc3VpdGUgYXJlIGJ1aWx0LgoJICAgICAtIFN5bWJvbCBuYW1lcyBhcmUgbm8gbG9uZ2VyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlCgkgICAgIC0gQWRkZWQgdW5pb25fcnVubWUuc3MsIHdoaWNoIHdhcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gdGhlIGd1aWxlIG1vZHVsZQoKMDUvMjYvMjAwNDogbGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgQ29tbWl0dGVkIG9uIGJlaGFsZiBvZiBNYXJjZWxvICh3aG8gc3RpbGwgaGFzIHByb2JsZW1zIHdpdGggCgkgICAgdGhlIFNvdXJjZUZvcmdlIENWUy4pCgoJICAgIEFkZGVkIFB5dGhvbiB0eXBlbWFwcyBmb3IgRklMRSogd2l0aCAoUHl0aG9uLW9ubHkpIHRlc3QuCgo1LzI0LzIwMDQ6ICBkYW5jeQoKCSogQWxsZWdybyBDTCBtb2R1bGU6ICBOb3cgdXNpbmcgc29tZSBtYWNyb3MgKGRlZmluZWQgaW4KCUxpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZyksIHN3aWctZGVmY29uc3RhbnQgYW5kIHN3aWctZGVmdW4sIGZvcgoJZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBmb3JlaWduIGZ1bmN0aW9ucy4gIFRoaXMgbWFrZXMgdGhlCglnZW5lcmF0ZWQgZmlsZSBhIGJpdCBuZWF0ZXIuICAgIAoKCU5vdyBzdHJpcHMgYSBsYXllciBvZiBwYXJlbnRoZXNpcyBmcm9tIGNvbnN0YW50cy4KCglVc2VzICgqIDp2b2lkKSBpbnN0ZWFkIG9mIDpmb3JlaWduLWFkZHJlc3Mgbm93LgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVW5uYW1lZCBlbnVtIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gYWRkaXRpb24KICAgICAgICAgICAgdG8gdGhlIHJlY2VudGx5IGFkZGVkIHN1cHBvcnQgZm9yIHVubmFtZWQgZW51bSBtZW1iZXIgdmFyaWFibGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgZW51bSB7IGVudW0xLCBlbnVtMiB9IE1lbWJlckluc3RhbmNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMywgZW51bTQgfSBHbG9iYWxJbnN0YW5jZTsKCiAgICAgICAgICAgIFRoZSBpbnQgdHlwZW1hcHMgYXJlIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSBnZXQvc2V0IGFjY2Vzc29yIG1ldGhvZHMuCiAgICAgICAgICAgIElmIHRoZSBzaXplb2YgYW4gZW51bSBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcyBhbiBpbnQgdGhlbiBzZXR0aW5nIHRoZQogICAgICAgICAgICB2YXJpYWJsZSB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcgYXMgdGhlIGNhc3RzIGNhbm5vdCBiZSBlYXNpbHkgYW5kIHBvcnRhYmx5CiAgICAgICAgICAgIGdlbmVyYXRlZC4gSWYgeW91IG5lZWQgdG8gc29sdmUgdGhpcyBoaWdobHkgb2JzY3VyZSBzaXR1YXRpb24sIHdyaXRlCiAgICAgICAgICAgIHRoZSBhc3NpZ25tZW50IHVzaW5nIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEMjIGVudW0gd3JhcHBpbmcgbW9kcy4gU2ltaWxhciB0byB0aGUgSmF2YSBtb2R1bGUsIGVudW1zIGNhbiBiZSB3cmFwcGVkIHVzaW5nCiAgICAgICAgICAgIG9uZSBvZiAzIGFwcHJvYWNoZXM6CgogICAgICAgICAgICAxKSBQcm9wZXIgQyMgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlY3NlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgW05vIGltcGxlbWVudGF0aW9uIGRlZW1lZCBuZWNlc3NhcnkgZm9yIHR5cGUgdW5zYWZlIGVudW1zXS4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHByb3BlciBDIyBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEphdmEgZW51bSBzdXBwb3J0IGFkZGVkLiBUaGVyZSBhcmUgbm93IDQgd2F5cyBpbiB3aGljaCBlbnVtcyBjYW4gYmUgd3JhcHBlZDoKCiAgICAgICAgICAgIDEpIFByb3BlciBKYXZhIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBUeXBlIHVuc2FmZSBlbnVtcyAoY29uc3RhbnQgaW50ZWdlcnMpIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXVuc2FmZS5zd2ciCiAgICAgICAgICAgIDQpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlamF2YWVudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwcyB3aWxsIGhhbmRsZSBlbnVtcyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgc3BlY2lmaWVkIGluaXRpYWwKICAgICAgICAgICAgdmFsdWVzLCBmb3IgZXhhbXBsZSB0ZW4gaXMgc3BlY2lmaWVkOgoKICAgICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IHplcm8sIHRlbigxMCkgfTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBhbW91bnQgb2YgZ2VuZXJhdGVkIEphdmEgY29kZSBjYW4gYmUgY3V0IGRvd24sIGJ5IG1vZGlmeWluZyB0aGVzZSB0eXBlbWFwcwogICAgICAgICAgICBpZiBub25lIG9mIHRoZSBlbnVtcyBoYXZlIGluaXRpYWwgdmFsdWVzIChwcm9wZXIgSmF2YSBlbnVtcyBhbmQgdHlwZXNhZmUgZW51bXMgYXBwcm9hY2gpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgdHlwZXNhZmUgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggYnVnIHVzaW5nICVyZW5hbWUgb24gZW51bSBpdGVtcyBhbmQgd2hlbiB1c2luZwogICAgICAgICAgICAlamF2YWNvbnN0KDEpIC8gJWNzY29uc3QoMSkKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKE9iaikgT2JqZWN0OwogICAgICAgICAgICAgICAgZW51bSBHcmFtbWFyIHsgU3ViamVjdCwgT2JqZWN0IH07CgowNC8yOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE1pbm9yIGZpeGVzIHdoZW4gdXNpbmcgY29tYmluYXRpb25zIG9mIHRoZSAKICAgICAgICAgICAgamF2YWludGVyZmFjZXMsIGphdmFiYXNlLCBjc2ludGVyZmFjZXMgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCjA1LzE4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKVk0gbGluayBmYWlsdXJlIG9uIHNvbWUgc3lzdGVtcyBmaXhlZCB3aGVuIHVzaW5nIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgQWxzbyBhZGRzIGRlZmF1bHQgdmVjdG9yIGNvbnN0cnVjdG9yIGZvciB1c2UgZnJvbSBKYXZhLgoKMDUvMTcvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoKCSAgICBbR3VpbGVdIE5ldyBydW50aW1lIGZ1bmN0aW9ucyBTV0lHX1BvaW50ZXJBZGRyZXNzLAoJICAgIFNXSUdfUG9pbnRlclR5cGUsIFNXSUdfSXNQb2ludGVyT2ZUeXBlLCBTV0lHX0lzUG9pbnRlci4KCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHdyYXAgc2V2ZXJhbCBTV0lHIHJ1bnRpbWUgZnVuY3Rpb25zCgkgICAgYW5kIGV4cG9ydCB0aGVtIGludG8gdGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKS4gIFRoZQoJICAgIHJ1bnRpbWUgbW9kdWxlIGlzIG5vdyBidWlsdCB3aXRoICJtb2R1bGUiIGxpbmthZ2UuCgoJICAgIFtHdWlsZV0gR09PUFMgcHJveHkgb2JqZWN0cyBub3cgYWxzbyBwcmludCB0aGUgcG9pbnRlcgoJICAgIGFkZHJlc3Mgb2YgdGhlIEMgb2JqZWN0LgoKMDUvMTQvMjAwNDogbHlsZQogICAgICAgICAgICBBZGRlZCBLb3UncyBwYXRjaCBmb3IgdGhlIFJ1YnkgJWltcG9ydCBkaXJlY3RpdmUgc28gdGhhdCBtb2R1bGVzCiAgICAgICAgICAgIHdpdGggIm5lc3RlZCIgbmFtZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkuIENvbnNpZGVyIGFuIGludGVyZmFjZQogICAgICAgICAgICBmaWxlIGZvby5pIHRoYXQgaGFzIHRoaXMgJW1vZHVsZSBkZWNsYXJhdGlvbiBhdCBpdHMgdG9wOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIm1pc2M6OnRleHQ6OmZvbyIKCiAgICAgICAgICAgIE5vdyBjb25zaWRlciBhbm90aGVyIGludGVyZmFjZSBmaWxlIHNwYW0uaSB0aGF0IGltcG9ydHMgZm9vLmk6CgogICAgICAgICAgICAgICAgJWltcG9ydCBmb28uaQogICAgICAgICAgICAKICAgICAgICAgICAgQmVmb3JlIHRoaXMgcGF0Y2gsIHRoaXMgd291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29kZSBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIHNwYW1fd3JhcC5jOgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2M6OnRleHQ6OmZvbyIpOwoKICAgICAgICAgICAgV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UnbGwgZ2V0IHRoZSBjb3JyZWN0IHBhdGggbmFtZQogICAgICAgICAgICBmb3IgdGhlIGNhbGwgdG8gcmJfcmVxdWlyZSgpLCBlLmcuCgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYy90ZXh0L2ZvbyIpOwoKICAgICAgICAgICAgU2VlIFNvdXJjZUZvcmdlIEJ1ZyAjOTI4Mjk5LgoKMDUvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZm9yIGVtaXR0aW5nIGRpcmVjdG9ycyB3aGVuICVmZWF0dXJlKCJkaXJlY3RvciIpIHNwZWNpZmllZAogICAgICAgICAgICBmb3IgYSBjbGFzcyB3aXRoIG5vIHZpcnR1YWwgbWV0aG9kcywgYnV0IGRvZXMgaGF2ZSBhIHZpcnR1YWwgZGVzdHJ1Y3Rvci4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEtldmluIFNtaXRoLgoKMDUvMDYvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBTV0lHIHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUHJldHR5TmFtZSwgd2hpY2ggCgkgICAgcmV0dXJucyBhbiB1bm1hbmdsZWQgdHlwZSBuYW1lIGZvciBhIHN3aWdfdHlwZV9pbmZvCgkgICAgb2JqZWN0LiAKCgkgICAgW0d1aWxlXTogVXNlIGl0IGZvciBwcmludGluZyBwb2ludGVyIG9iamVjdHMuCgowNS8wMy8yMDA0OiAgZGFuY3kgKEFobW9uIERhbmN5KQoKCSogTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnOiAgVXBkYXRlZCBjb21tZW50cyBhYm91dCBpZGVudGlmZXIKCWNvbnZlcnNpb24uICAKCgkqIFNvdXJjZXMvTW9kdWxlcy9hbGxlZ3JvY2wuY3h4OiAgUmVnaXN0ZXIgL2Rldi9udWxsIGZvciAiaGVhZGVyIgoJdGFyZ2V0LiAgIEFsc28sIGRpc3JlZ2FyZCAiY29uc3QiIHF1YWxpZmllcnMgZHVyaW5nIHR5cGUKCWNvbnZlcnNpb24uICAKCgkKMDUvMDIvMjAwNDogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEZpeCBidWcgNzgyNDY4LgoJICAgIFRvIGZpeCB0aGlzIGJ1ZywgdGhlIHJ1bnRpbWUgY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4sIGFuZAoJICAgIHBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgYSBDX1NXSUdfUE9JTlRFUl9UWVBFLgoKCSAgICBDaGlja2VuIHZlcnNpb24gPiAxLjQwIGlzIG5vdyByZXF1aXJlZCEKCgkgICAgKiBUeXBlbWFwIGluY29tcGF0aWJpbGl0eTogIHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgY2hpY2tlbl93b3Jkcy4KCSAgICAgIElmIGEgdHlwZW1hcCBuZWVkcyBzb21lIHNwYWNlLCBpdCBzaG91bGQganVzdCBjYWxsIENfYWxsb2MKCgkgICAgKiBhcmdvdXQgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSB0aGUgLyogaWYgT05FICovIGNvbnN0cnVjdCB0bwoJICAgICAgYnVpbGQgYW4gb3V0cHV0IGxpc3QuICBBIFNXSUdfQVBQRU5EX1ZBTFVFIG1hY3JvLCBleGFjdGx5IGxpa2UKCSAgICAgIGd1aWxlIGFuZCBtenNjaGVtZSBpcyBub3cgdXNlZC4KCjA0LzI1LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIHRoZSBnZW5lcmF0ZWQgR09PUFMgY29kZSwgZG9uJ3QgY3JlYXRlIG1ldGhvZHMKCSAgICB0aGF0IHdvdWxkIG5vdCBzcGVjaWFsaXplIGFueSBhcmd1bWVudHM7IHNpbXBseSByZS1leHBvcnQKCSAgICB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucy4gIChUaGlzIGlzIGEgcGVyZm9ybWFuY2UKCSAgICBvcHRpbWl6YXRpb24gd2hpY2ggcmVkdWNlcyBsb2FkIHRpbWUgYW5kIGV4ZWN1dGlvbiB0aW1lLikKCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZml4IHRoZSAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIiBlcnJvcgoJICAgIHdoaWNoIHdhcyBjYXVzZWQgYnkgYW4gaW5jb21wYXRpYmxlIHN3aWdfdHlwZV9pbmZvIGxheW91dC4KCgkgICAgW0d1aWxlXSBUaGUgdHlwZW1hcCBmb3IgRklMRSAqIGluIHBvcnRzLmkgbm93IGFsc28gYWNjZXB0cwoJICAgIGEgcmVndWxhciBGSUxFICogcG9pbnRlciBvYmplY3QuICBBbHNvIGEgYnVnIHdpdGggU2NoZW1lCgkgICAgZmlsZSBwb3J0cyB0aGF0IGFyZSBvcGVuIGZvciBpbnB1dCBhbmQgb3V0cHV0IGhhcyBiZWVuCgkgICAgZml4ZWQuIAoKMDQvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlIGVudHJ5IDAzLzIxLzIwMDQgcmV2b2tlZC4gVGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGFub3RoZXIKICAgICAgICAgICAgaW5jb25zaXN0ZW5jeSAocmVmZXJlbmNlIHR5cGVtYXBzIGJlaW5ncyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlciB0eXBlbWFwcyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHN0YXRpYwogICAgICAgICAgICBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIGZvciBzb21lIGxhbmd1YWdlcywKICAgICAgICAgICAgYnV0IG9ubHkgZm9yIEMrKyBhbmQgbm90IEMpLiBUaGlzIHdvdWxkIGJyZWFrIHVzZXIncyBjdXJyZW50CiAgICAgICAgICAgIHR5cGVtYXBzIGFuZCBpbnRyb2R1Y2UgZnVydGhlciBpbmNvbnNpc3RlbmNpZXMuIEFsdGVybmF0aXZlCiAgICAgICAgICAgIHNvbHV0aW9uIHJlcXVpcmVkIGFuZCBiZWluZyBkaXNjdXNzZWQuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIEFkZGVkIHRoZSAtZGlyZWN0b3JzIGZsYWcuIFRoaXMgZW5hYmxlcyB0aGUgZGlyZWN0b3IKCSAgICBtb2RlIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBhbGwgdGhlIGNsYXNzZXMgdGhhdAoJICAgIGRvbid0IHNldCB0aGUgImZlYXR1cmU6bm9kaXJlY3RvciIgZXhwbGljaXRseS4KCgkgICAgWW91IGNhbiB1c2UgdGhpcyBpbiB5b3VyIG1vZHVsZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlCgkgICAgZGlyZWN0b3IgZmVhdHVyZSBpbiBhbGwgeW91ciBjbGFzc2VzLCBidXQgaXQgaXMgbW9zdAoJICAgIGludGVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBsaWtlOgoKCSAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoKCSAgICBUaGVzZSBjb21tYW5kcyB3aWxsIHJ1biB0aGUgZW50aXJlIHRlc3Qtc3VpdGUgdXNpbmcKCSAgICBkaXJlY3RvcnMsIGFuZCBub3Qgb25seSB0aGUgc3BlY2lmaWMgJ2RpcmVjdG9yc18qJwoJICAgIGNhc2VzLiBUaGlzIHNob3VsZCBiZSBkb25lIGZyb20gdGltZSB0byB0aW1lLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QsCgkgICAgZm9yIGNvbXBpbGVyIGFuZCBweXRob24gdmVyc2lvbnMgdGhhdCBzdXBwb3J0IHRoZW0uCgkgICAgCgkgICAgV2hlbiBuZWVkZWQsIHVzZSAKCgkgICAgICVpbmxjdWRlIHN0ZF9zdHJpbmcuaSAgICAgIC8vICdjaGFyJyBzdHJpbmdzCgkgICAgICVpbmxjdWRlIHN0ZF93c3RyaW5nLmkgICAgIC8vICd3Y2hhcl90JyBzdHJpbmdzCgkgICAgCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEZpeCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgKHNlZy4gZmF1bHQpIHdoZW4gYW4KCSAgICBpbnBsYWNlIG9wZXJhdG9yICgrPSwtPSwuLi4pIHdhcyB3cmFwcGVkLCBhcyByZXBvcnRlZCBieQoJICAgIEx1Y3JpeiAobHVjcml6QHNpdGlsYW5kaWEuaXQpLCB3aGVuIHRoZSBtb3N0IGNvbW1vbgoJICAgIGZvcm0gd2FzIHVzZWQ6CgogICAgICAgICAgICAgICAgICAgQSYgIEE6Om9wZXJhdG9yKz0oaW50IGkpIHsgLi4uOyByZXR1cm4gKnRoaXM7IH0KICAgICAgICAgICAgICAgICAgXl5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgoJICAgIAoKCSAgICBpZSwgYW4gb2JqZWN0IGlzIHJldHVybmVkIGFuZCBpdHMgY29udGFpbnMgdGhlIHNhbWUgJ3RoaXMnCgkgICAgdmFsdWUgdGhhbiB0aGUgaW5wdXQgb2JqZWN0LCB3aGljaCBpcyBkZWxldGVkIGFmdGVyIHRoZQoJICAgIG9wZXJhdGlvbiAiYSArPSBiIiwgbGVhdmluZyB0aGUgcmVzdWx0IHdpdGggbm8gcmVhbAoJICAgIG9iamVjdCwgYnV0IGEgc2VnLiBmYXVsdC4KCgkgICAgVG8gZml4IGl0LCB3ZSBuZWVkZWQgdG8gaW50cm9kdWNlIGEgbmV3IGZlYXR1cmUgYW5kIHVzZSBhbgoJICAgIG9sZCBvbmU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IikgQTo6b3BlcmF0b3IrPTsKCSAgICAKCSAgICBoZXJlLCAic2VsZjpkaXNvd24iIGRpc2FibGUgdGhlIG93bmVyc2hpcCBvZiB0aGUgJ3NlbGYnCgkgICAgb3IgaW5wdXQgb2JqZWN0LCBhbmQgdGhlICJuZXciIGZlYXR1cmUgdHJhbnNmZXJzIHRoZQoJICAgIG93bmVyc2hpcCB0byB0aGUgcmVzdWx0IG9iamVjdC4KCSAgICAKCSAgICBUaGUgZmVhdHVyZS9zb2x1dGlvbiBjb3VsZCBhbHNvIGJlIHVzZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCB1c2UgZ2MgYW5kIGltcGxlbWVudCB0aGUgaW5wbGFjZSBvcGVyYXRvcnMsIG9yIG90aGVyCgkgICAgb3BlcmF0b3JzLCBpbiBhIHNpbWlsYXIgd2F5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFB5dGhvbiBNT0RVTEUgKioqCgoJICAgIElmIHlvdSBhbHJlYWR5IGFyZSB1c2luZyB0aGUgaW5wbGFjZSBvcGVyYXRvcnMgaW4gcHl0aG9uLAoJICAgIGFuZCB5b3UgaW1wbGVtZW50ZWQgc29tZSBraW5kIG9mIHdvcmthcm91bmQgdG8gdGhlIHByb2JsZW0KCSAgICBmaXhlZCBoZXJlLCBpdCBpcyBwb3NzaWJsZSB5b3UgY291bGQgZW5kIHdpdGggJ2ZyZWUnCgkgICAgb2JqZWN0cyB0aGF0IG5ldmVyIGdldCBkZWxldGVkLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBhbmQKCSAgICB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjdXJyZW50IGZpeCwgdXNlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIiwiIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIsIiIpIEE6Om9wZXJhdG9yKz07CgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQysrIGVudW1zIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBpbnRlZ2VycywgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgCiAgICAgICAgICAgIEMjIGVudW1zLiBGb3IgRXhhbXBsZSwgZ2l2ZW4gQysrOgoKICAgICAgICAgICAgICAgIGVudW0gQW5FbnVtIHsgZm9vLCBiYXIgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgQW5FbnVtIEFuRW51bWVyYXRpb247CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtZXJhdGlvbiBmKTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBlbnVtIEFuRW51bSB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW0gZikgey4uLn0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBhIGdsb2JhbCBlbnVtIGxpa2UgQW5FbnVtIGFib3ZlIGlzIGdlbmVyYXRlZCBpbnRvIGl0cyBvd24KICAgICAgICAgICAgZmlsZSBjYWxsZWQgQW5FbnVtLmNzLiBFbnVtcyBkZWZpbmVkIHdpdGhpbiBhIEMrKyBjbGFzcyBhcmUgZGVmaW5lZAogICAgICAgICAgICB3aXRoaW4gdGhlIEMjIHByb3h5IGNsYXNzLiBTb21lIG9mIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nIEMjIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMgYWxzbyB3b3JrIGZvciBlbnVtcy4gRm9yIGV4YW1wbGUgZ2xvYmFsIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2ltcG9ydHMpIHRvIGFkZCBpbiBleHRyYSB1c2luZyBzdGF0ZW1lbnRzLgoKICAgICAgICAgICAgR2xvYmFsIGVudW1zIGFuZCBjbGFzcyBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgdG8gbWFrZSB0aGUgZW51bSBwcml2YXRlLCBwdWJsaWMgZXRjLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZW51bSB0eXBlIChlbnVtIGJhc2UpCgogICAgICAgICAgICBJZiB3ZSBhZGQgdGhpcyBmb3IgdGhlIGFib3ZlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgQW5FbnVtICJwcm90ZWN0ZWQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIEFuRW51bSAibG9uZyIKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb3RlY3RlZCBlbnVtIEFuRW51bSA6IGxvbmcgewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBlbXB0eSBlbnVtcywgbGlrZQogICAgICAgICAgICAgICAgZW51bSBGb28ge307CgowMy8yMS8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW05vdGU6IHRoaXMgY2hhbmdlIHJldm9rZWQgb24gMDQvMjUvMjAwNF0KCSAgICBbUHl0aG9uXSBNYWtlcyB0aGUgZm9sbG93aW5nICd2YXInIGNhc2VzIG1vcmUgdW5pZm9ybToKCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBnYTsKIAogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2E7CiAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBub3cgdGhlIHRocmVlIHZhcmlhYmxlcyAoZ2EsIHNhLCBtYSkgY2FuIGJlIGFzc2lnbmVkIGFzOgoKCiAgICAgICAgICAgICAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBBLnNhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgYS5tYSA9ICJoZWxsbyI7CgogICAgICAgICAgICBpZSwgbm93ICdtYScgd2lsbCBhbHNvIHVzZSBhIHN0ZDo6c3RyaW5nIHR5cGVtYXAgJ2luJyBpZgogICAgICAgICAgICBkZWZpbmVkLCBiZWZvcmUgaXQgd2FzIG9ubHkgYWNjZXB0aW5nIGEgJ3Bfc3RkX3N0cmluZycKICAgICAgICAgICAgcG9pbnRlci4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgJ21hJyB3aWxsIG5vdCB1c2UgdGhlCiAgICAgICAgICAgICd2YXJpbi92YXJvdXQnIHR5cGVtYXBzICh0aGF0IHByb2JhYmx5IGNvdWxkIGJlIG1vcmUKICAgICAgICAgICAgbmF0dXJhbCksIGJ1dCBpdCB3aWxsIHBpY2sgdXAgdGhlICdpbicgdHlwZW1hcCBmb3IgY29uc3QKICAgICAgICAgICAgc3RkOjpzdHJpbmcmICh3aGljaCBpcyBlYXNpZXIpLgoKCSAgICBUaGUgY2hhbmdlcyBpbiBjd3JhcC5jIGFuZCBsYW5nLmN4eCB3aWxsIHByb2JhYmx5IGZpeCB0aGUKCSAgICBiZWhhdmlvdXIgaW4gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IG92ZXJsb2FkIHRoZQoJICAgIG1lbWJlcnZhckhhbmRsZXIgbWV0aG9kICJ0b28gbXVjaCIuCiAKICAgICAgICAgICAgCjAzLzIxLzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIERpc2FibGluZyB0aGUgZGVmYXVsdCBpbnN0YW50aWF0aW9ucyBsaWtlOgoKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxpbnQsaW50PjsKCiAgICAgICAgICAgIGZvciBhbGwgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgU1RMIGNvbnRhaW5lcnMvY2xhc3Nlcy4KCSAgICBUaGV5IGFyZSBleHBlbnNpdmUsIHNwZWNpYWxseSBmb3IgcGFpciBhbmQgbWFwLCBhbmQgdGhlCgkgICAgcHJldmlvdXMgYmVoYXZpb3VyIGFsc28gcmVxdWlyZXMgdGhlIHVzZXIgdG8gcGVyZm9ybQoJICAgIG1hbnVhbCBpbnN0YW50aWF0aW9ucy4gU3RpbGwsIGlmIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGlzCgkgICAgbm90IGltcG9ydGFudCwgaXQgY2FuIGJlIHJlLWVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIG1hY3JvCgkgICAgU1dJR19TVERfREVGQVVMVF9JTlNUQU5USUFUSU9OIChzZWUgc3RkX2NvbW1vbi5pKS4KCgkgICAgQWxzbywgbm9ybWFsaXppbmcgdGhlIElOUFVUL09VVFBVVC9JTk9VVCB0eXBlbWFwcy4gTm93CgkgICAgdGhleSB1c2UgdGhlIHNhbWUgY29udmVyc29ycyB0aGFuIHRoZSByZXN0IG9mIHRoZQoJICAgIHR5cGVtYXBzLCBhbmQgeW91IGNhbiB1c2UgdGhlbSBmb3Igc3RkOjpwYWlyLCBzdGQ6OnN0cmluZwoJICAgIGFuZCBhbGwgdGhlIG90aGVyIFNUTCB0eXBlcywgbGlrZSBpbjoKCgkgICAgICB2b2lkIHBfaW5vdXRkKHN0ZDo6cGFpcjxkb3VibGUsIGRvdWJsZT4gKklOT1VUKTsKCgkgICAgQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGFuZCBpbXBsaWNpdC5pIGZpbGVzIHdpdGggbWFjcm9zIHRvCgkgICAgdHJhbnNmb3JtIGZ1bmN0aW9ucyBwYWlycyBsaWtlICdzZXRfeCcvJ2dldF94JyAKCSAgICAob3IgJ1QmIHgoKScvJ2NvbnN0IFQmIHgoKSBjb25zdCcpIGludG8gYW4gYXR0cmlidXRlLAoJICAgIGFuZCBhbGxvd2luZyB0aGUgdXNlIG9mIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBpbiB0eXBlbWFwcwoJICAgIChzZWUgdGhlIGZpbGVzIGZvciBtb3JlIGRldGFpbHMpLgoKMDMvMjEvMjAwNDogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZ3Mgb2YgZnVuY3Rpb25zIHdpdGgKCSAgICBhbm9ueW1vdXMgYXJndW1lbnRzLgoKMDMvMTgvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gTW9yZSBnZW5lcmFsIHN0ZF9zdHJpbmcuaSBpbnRlcmZhY2UuCgkgICAgTm93IHlvdSBjYW4gd3JhcCBpdCB1c2luZwoKCSAgICAgICV0ZW1wbGF0ZShzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OwoKICAgICAgICAgICAgYW5kIHVzZSB0aGUgc3RkOjpzdHJpbmcgYXMgYSBiYXNlIGNsYXNzOgoKCSAgICAgIHN0cnVjdCBBIDogc3RkOjpzdHJpbmcgewogICAgICAgICAgICAgIH07CgoJICAgIEJ1dCBtb3JlIGltcG9ydGFudCwgc3dpZyB3aWxsIHJlY29nbml6ZSAKCSAgICBib3RoIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+IGFuZCBzdGQ6OnN0cmluZyBhcwoJICAgIHRoZSBzYW1lIHR5cGUuCgowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBQcmV2aW91c2x5IGFkZGVkLCBidXQgbm90IG1lbnRpb25lZCBiZWZvcmU6CgoJICAgIC0gZnJpZW5kIGRlY2xhcmF0aW9uIHN1cHBvcnQsIHN3aWcgbm93IGVtaXRzIGEgZ2xvYmFsCgkgICAgICBmdW5jdGlvbiBpbiB0aGUgc2FtZSBjbGFzcyBzY29wZS4KCgkgICAgLSByZWYvdW5yZWYgZmVhdHVyZXM6IHRvIG1peCByZWYgY291bnRpbmcgQysrIGNsYXNzZXMKCSAgICAgIGFuZCBuYXRpdmUgc2NyaXB0IHJlZiBjb3VudGluZyBtZWNoYW5pc21zIChsaWtlIGluIHB5dGhvbikuCgkgICAgCgkgICAgICBVc2UgaXQgbGlrZToKCiAJICAgICAgICAlZmVhdHVyZSgicmVmIikgICBSQ09iaiAiJHRoaXMtPnJlZigpOyIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ1bnJlZiIpIFJDT2JqICIkdGhpcy0+dW5yZWYoKTsiCgoJICAgICAgQW5kIHRoZSBjbGFzcyBSQ09iaiwgYW5kIGFsbCB0aGUgZGVyaXZlZCBvbmVzLCB3aWxsCgkgICAgICBwZXJmb3JtIHRoZSByaWdodCByZWYvdW5yZWYgY2FsbHMgd2hlbiBhIG5ldyBwb2ludGVyICAKCSAgICAgIGlzIHJldHVybmVkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIG9yIHdoZW4gdGhlIHRhcmdldAoJICAgICAgbGFuZ3VhZ2UgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZSBvYmplY3QuCgkgICAgICAKCSAgICAgIFNlZSB0aGUgcmVmY291bnQuaSBmaWxlIGluIHRoZSB0ZXN0LXN1aXRlIGZvciBtb3JlCgkgICAgICBkZXRhaWxzLgoKCSAgICAKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gVXNpbmcgdGhlIG5ldyAlZnJhZ21lbnQgc3VwcG9ydCwgbWFqb3IgcmV3cm90ZSAKCSAgICBvZiB0aGUgcHl0aG9uIHN3aWcgbGlicmFyeSwgaW5jbHVkaW5nOgoKCSAgICAtIEFsbW9zdCBhdXRvbWF0aWMgdGVtcGxhdGUvdHlwZW1hcCBpbnN0YW50aWF0aW9uIGZvcgoJICAgICAgdGhlIFNUTCBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgbm93IHlvdSBjYW4gd3JpdGU6CgoJCSAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgYW5kIGEgc3BlY2lhbGl6ZWQgdmVjdG9yX2kgY2xhc3MgaXMgZW1pdHRlZCB3aXRoIGFsbAoJICAgICAgdGhlIG5lZWRlZCB0eXBlbWFwcy4gTm8gbmVlZCB0byB1c2UgdGhlIG9sZAoJICAgICAgJ3NwZWNpYWxpemVfdmVjdG9yJyBtYWNyb3MuCgoJICAgICAgTm90ZSB5b3UgY2FuIGFsc28gZGVmaW5lCgoJICAgICAgICAgICV0ZW1wbGF0ZShtYXRyaXhfaSkgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID47CgkgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9waWkpIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsaW50PiA+OwoKCSAgICAtIFRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogCSAKICAgICAgICAgICAJICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIGRlZmluZXMgdGhlIHZlY3RvciB0eXBlbWFwcywgYnV0IG5vIHByb3h5IGNsYXNzLiBGb3IgYWxsIHRoZQogICAgICAgICAgICAgIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBhcmUKICAgICAgICAgICAgICBkZWZpbmVkLCBzbywgeW91IGNhbiBzYXkKCgkgICAgICAlaW5jbHVkZSBzdGRfdmVjdG9yCgoJICAgICAgaW50IGZ1bmMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYSk7CgkgICAgICAKCSAgICAgIHdoZXJlIHRoZSBwcm9wZXIgdHlwZW1hcCBpcyBhcHBsaWVkIHRvICdhJywgYnV0IG5vCgkgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHByb3h5IGlzIGdlbmVyYXRlZC4KCSAgICAgIAoKICAgICAgICAgICAgLSBBbGwgdGhlIFNUTCBjb250YWluZXJzIHByZXNlbnQgYSBtb3JlIHVuaWZvcm0gYmVoYXZpb3IgYW5kCgkgICAgICBtb3JlIGNvbXBsZXRlIGludGVyZmFjZSBkZWNsYXJhdGlvbi4gVGhlIGZvbGxvd2luZyBhcmUgCgkgICAgICBub3cgc3VwcG9ydGVkOgoKCQkgIHN0ZDo6dmVjdG9yPFQ+CgkJICBzdGQ6Omxpc3Q8VD4KCQkgIHN0ZDo6ZGVxdWU8VD4KCQkgIHN0ZDo6c2V0PFQ+CgkJICBzdGQ6Om11bHRpc2V0PFQ+CgkJICBzdGQ6Om1hcDxUPgoJCSAgc3RkOjptdWx0aW1hcDxUPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIG5vdCBhIGNvbnRhaW5lciwgYnV0IGFsc28gc3VwcG9ydGVkOgoKCQkgIHN0ZDo6cGFpcjxULFU+CgogICAgICAgICAgICAgIGFsc28sIG1vcmUgdHlwZW1hcHMgYXJlIGRlZmluZWQgZm9yIGFsbCBvZiB0aGVtLAoJICAgICAgaW5jbHVkaW5nIHZhcmluLCB2YXJvdXQsIHR5cGVjaGVjaywgZXRjLgoKICAgICAgICAgICAgLSBJbml0aWFsIGF0dGVtcHQgdG8gaW1wbGVtZW50IHRoZSBTVEwgY29udGFpbmVycwogICAgICAgICAgICAgIGNvbnNpZGVyaW5nIGFsbG9jYXRvcnMsIGllOgoKCSAgICAgICAgICBzdGQ6OnZlY3RvcjxULEE+CQkJCgoJICAgICAgaXQgaXMgcGFydGlhbGx5IHdvcmtpbmcsIGJ1dCBpdCBpcyBqdXN0IGEgd29ya2Fyb3VuZAoJICAgICAgd2hpbGUgc3dpZyBpbXByb3ZlcyBpdHMgdGVtcGxhdGUgdHlwZSBzdXBwb3J0LgoJICAgICAgCgkgICAgICAKCSAgICAgUGxlYXNlIHRlc3Qgd2l0aCB5b3VyIHBhcnRpY3VsYXIgc2V0dXAuIEl0IHNlZW1zIHRvIGJlCgkgICAgIHdvcmtpbmcgd2l0aCBnKysgMy4yLjIsIGcrKyAyLjk2LCBJbnRlbCBpY2MgYW5kIFNHSSBDQwoJICAgICBjb21waWxlcnMsIHBsdXMgcHl0aG9uIDEuNS4yLCAyLjAgYW5kIDIuMywgYnV0IHNpbmNlCgkgICAgIHdlIGFyZSB1c2luZyB0ZW1wbGF0ZXMsIHRoZXJlIGlzIGEgY2hhbmNlIHlvdSBjYW4gZmluZAoJICAgICBzb21lIHByb2JsZW1zIHdoZW4gdXNpbmcgd2l0aCBhbiBvbGQgQysrIGNvbXBpbGVyLgoKMDMvMTYvMjAwNDogbW1hdHVzCgogICAgICAgICAgICAtIEFsbG93aW5nIHRoZSBlbXB0eSAldGVtcGxhdGUgZGlyZWN0aXZlLCBzdWNoIGFzCgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgdG8gcHJvY2VzcyB0aGUgY2xhc3MgInR5cGVkZWYicyBhbmQgInR5cGVtYXAicy4gQmVmb3JlCgkgICAgICBvbmx5IHRoZSBpbnRlcm5hbCAidHlwZWRlZiJzIHdlcmUgcHJvY2Vzc2VkLgoKICAgICAgICAgICAgICBUaGlzIG1ha2VzIHBvc3NpYmxlIHRvIGVtaXQgdGhlIGRlZmF1bHQgaW4vb3V0CiAgICAgICAgICAgICAgdHlwZW1hcHMgd2l0aG91dCB0aGUgbmVlZCBvZiB3cmFwcGluZyBhbiBzcGVjaWFsaXplZAogICAgICAgICAgICAgIHZlY3RvciBpbnN0YW5jZS4KCgkgICAgLSBBZGRpbmcgdGhlIHByZXByb2Nlc3NvciBleHRlbnNpb24gI0Agd2hpY2ggbWFuZ2xlcyB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgbWFjcm8gYXJndW1lbnQsIGxpa2UgaW46CgogICAgICAgICAgICAgICAgI2RlZmluZSBtYWNybyhYKSAgI0BYCiAgICAgICAgICAgICAgICBtYWNybyhpbnQpICAgICAgICAgLT4gaW50CiAgICAgICAgICAgICAgICBtYWNybyhzdGQ6OnN0cmluZykgLT4gc3RkX3Nfc19zdHJpbmcKICAgICAgICAgICAgICAgIAoJICAgIC0gRnJhZ21lbnRzIGNhbiBub3cgYmUgInR5cGUgc3BlY2lhbGl6ZWQiLCBhcyB0aGUgdHlwZW1hcHMuIFRoZQoJICAgICAgc3ludGF4IGlzIGFzIGZvbGxvd3MKIAogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiwiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogYSB0eXBlIGluZGVwZW5kZW50IGZyYWdtZW50IChvbGQgc3ludGF4KSAqLyB9CiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiIHtUeXBlfSwgImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIHRoZSBmcmFnbWVudCBpcyB0eXBlIGRlcGVuZGVudCAqL30KIAogICAgICAgICAgICAgIE5vdyBmcmFnbWVudHMgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzOiAKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICVmcmFnbWVudCgiaW5jb2RlIntBPFQ+fSwiaGVhZGVyIikgewoJCSAgICAgIC8qICdpbmNvZGUnIHNwZWNpYWxpemVkIGZyYWdtZW50ICovCgkJICAgfQogCgkJICAgJXR5cGVtYXAoaW4sZnJhZ21lbnQ9ImluY29kZSJ7QTxUPn0pIHsKCQkgICAgICAvKgoJCSAgICAgICAgIGhlcmUgd2UgdXNlIHRoZSAndHlwZSBzcGVjaWFsaXplZCcgCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCAiaW5jb2RlIntBPFQ+fQogICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgfQogICAgICAgICAgICAgICAgfTsKCQkJICAgICAJCgowMy8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIGJ1ZyB3aGljaCBtZWFudCB0aGF0IHNvbWUgdmlydHVhbCBmdW5jdGlvbnMgb3ZlcnJpZGRlbiBpbgogICAgICAgICAgICBKYXZhIHdlcmUgbm90IGJlaW5nIGNhbGxlZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiBCdWcgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgICAgICAgICAgIGJ5IFJvYmVydCBkZSBWcmllcyBhbmQgU2NvdHQgTWljaGVsLgoKMDMvMDIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2hlY2sgdGhlIHR5cGUgb2Ygc3RyaW5nIGFyZ3VtZW50cy4KCjAyLzI0LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW5hbWVzcGFjZSA8bmFtZT4uIFRoaXMgYWxsb3dzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIGEgQyMgbmFtZXNwYWNlIGludG8gd2hpY2ggYWxsIEMjIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KCjAyLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkgCgkgICAgW016U2NoZW1lXSBVc2UgRlVOQ19OQU1FIHJhdGhlciB0aGFuIGEgYm9ndXMgdHlwZW1hcCB2YXJpYWJsZSBmb3Igc2lnbmFsbGluZwoJICAgIGVycm9ycy4gIENhbGwgc2NoZW1lX3dyb25nX3R5cGUgd2l0aCBhIHplcm8tYmFzZWQgYXJndW1lbnQgbnVtYmVyLiAgCgkgICAgUmVwb3J0ZWQgYnkgT25kcmVqIFBhY292c2t5LCBTRiAjOTAyNjIxLgoKCSAgICBbR3VpbGVdIERlZmluZSBGVU5DX05BTUUgYWxzbyBpbiB0aGUgZGlzcGF0Y2ggd3JhcHBlciBmb3Igb3ZlcmxvYWRlZAoJICAgIGZ1bmN0aW9ucy4gIFBhdGNoIGJ5IEpvaG4gTGVueiwgU0YgIzg5NjI1NS4KCjAyLzIyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgdHJ5IHRvIGludm9rZSBhIG51bGwgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KCjAyLzIwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBzbyB0aGF0IHRoZSBTV0lHIHNvdXJjZSB3aWxsIGNvbXBpbGUgdXNpbmcgdGhlIERpZ2l0YWwgTWFycyBDb21waWxlcgogICAgICAgICAgICAoZm9ybWVybHkgU3ltYW50aWMgY29tcGlsZXIpIG9uIFdpbmRvd3MuIFN1Ym1pdHRlZCBieSBTY290dCBNaWNoZWwuCgowMi8xMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBOZXcgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1ub2luaXQuICBVc2UgaXQgZm9yIGJ1aWxkaW5nCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyeSwgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIGZ1bmN0aW9ucwoJICAgIHNjaGVtZV9pbml0aWFsaXplIGV0Yy4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTc1NC4KCgkgICAgW016U2NoZW1lXSBEb24ndCBwcm9kdWNlIGludmFsaWQgQyBjb2RlIHdoZW4gaW52b2tlZCB3aXRoIHRoZQoJICAgIC1kZWNsYXJlbW9kdWxlIG9wdGlvbi4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTEwOC4KCSAgICAKCSAgICBbR3VpbGVdIEJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcnkgd2l0aCBwYXNzaXZlIGxpbmthZ2UsIHRvIHJlbmFtZQoJICAgIHRoZSBTV0lHX2luaXQgZnVuY3Rpb24gdW5pcXVlbHkuCgowMi8xMi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCBzdWJtaXR0ZWQgYnkgQmlsbCBIb2ZmbWFuIHdoaWNoIHByZXZlbnRzIFNXSUcgZnJvbSBjcmFzaGluZwogICAgICAgICAgICB3aGVuIGEgZmlsZSBmb3IgdGhlIHR5cGV3cmFwcGVyIGNsYXNzIGNhbm5vdCBiZSBvcGVuZWQuCgowMi8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBPdmVybG9hZGluZyBjaGFuZ2VzOgogICAgICAgICAgICAgIC0gTWV0aG9kcyB3aGljaCBhcmUgb3ZlcmxvYWRlZCBpbiBjb25zdCBvbmx5IG5vIGxvbmdlciBnZW5lcmF0ZSBKYXZhCiAgICAgICAgICAgICAgICBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZSAtIHRoZSBmaXJzdCBtZXRob2QgcGFyc2VkIGlzIHVzZWQgYW5kIGEKICAgICAgICAgICAgICAgIHdhcm5pbmcgaXMgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGljaCBhbHdheXMgdXNlcyB0aGUgbm9uLWNvbnN0IG1ldGhvZC4KICAgICAgICAgICAgICAtIFdhcm5pbmcgbWVzc2FnZXMgNTA5IGFuZCA1MTIgcmVwbGFjZWQgYnkgbmV3IHdhcm5pbmcgbnVtYmVyIDUxNiwgd2hpY2ggCiAgICAgICAgICAgICAgICBpcyBtb3JlIHJlbGV2YW50IHRvIHRoZXNlIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIGFzIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgICAgICBtZXRob2RzIGFyZW4ndCAnc2hhZG93ZWQnLCB0aGV5IGFyZSBpZ25vcmVkLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVwbGFjZSB0aGUgImtub3duX2NsYXNzZXMiIGhhc2ggdGFibGUgYnkgYSBub2RlCgkgICAgYXR0cmlidXRlLiAgTWV0aG9kcyBvZiBjbGFzc2VzIGluIEMrKyBuYW1lc3BhY2VzIG5vdyBnZXQKCSAgICB0aGUgcHJvcGVyIHNwZWNpYWxpemVyIGluIHRoZSBHT09QUyBkZWNsYXJhdGlvbi4KCSAgICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFVuaXF1aWZ5IHRoZSBhcmd1bWVudCBuYW1lcyBpbiBHT09QUyBzaGFkb3cgbWV0aG9kCgkgICAgZGVjbGFyYXRpb25zLiAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMS8yMDA0OiBzdW5zaGluZSAoRXJpYyBTdW5zaGluZSkKICAgICAgICAgICAgUmV2aXZlZCB0aGUgTmV4dFN0ZXAgcG9ydCBvZiBTV0lHLgoKICAgICAgICAgICAgRml4ZWQgZmF0YWwgcHJvYmxlbSBpbiBEb2hTdHJzdHIoKSBjYXVzZWQgYnkgZGlmZmVyZW5jZSBpbiBzdHJzdHIoKQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYWRlICVhcHBseSBiZWNvbWUgZW50aXJlbHkgZHlzZnVuY3Rpb25hbC4gIE9uCiAgICAgICAgICAgIE5leHRTdGVwLCBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRlcyB0byBOVUxMOyB3aGVyZWFzLCBvbiBtb2Rlcm4KICAgICAgICAgICAgcGxhdGZvcm1zLCBpdCBldmFsdWF0ZXMgdG8gImZvbyIuICAlYXBwbHkgcmVsaWVzIGV4dGVuc2l2ZWx5IHVwb24KICAgICAgICAgICAgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0aW5nIHRvIG5vbi1OVUxMLCB0aGVyZWZvcmUgaXQgZmFpbGVkCiAgICAgICAgICAgIGNhdGFzdHJvcGhpY2FsbHkgd2hlbiBmYWNlZCB3aXRoIE5leHRTdGVwJ3Mgc3Ryc3RyKCkuCgogICAgICAgICAgICBBZGRlZCBgYm9vbCcgY2hlY2sgdG8gY29uZmlndXJlLmluIHNpbmNlIE5leHRTdGVwJ3MgQysrIGNvbXBpbGVyCiAgICAgICAgICAgIGRvZXMgbm90IHN1cHBseSB0aGlzIHR5cGUuICBzd2lnLmggbm93IGZha2VzIHVwIGBib29sJyBpZiBuZWVkZWQuCgogICAgICAgICAgICBXb3JrZWQgYXJvdW5kIE5leHRTdGVwIEMrKyBjb21waWxlciBidWcgaW4gd2hpY2ggQysrIGNvZGUgaXMKICAgICAgICAgICAgZGlzYWxsb3dlZCBpbnNpZGUgZXh0ZXJuICJDIiBmdW5jdGlvbnMuICBUaGlzIHByb2JsZW0gYWZmZWN0ZWQgYWxsCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMsIHNpbmNlIHRoZXkgcHVibGlzaCBob29rIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICBGaXhlZCBieSBjcmVhdGluZyBhIEMrKyB3cmFwcGVyOgogICAgICAgICAgICAgICAgc3RhdGljIExhbmd1YWdlICpuZXdfc3dpZ19mb28oKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ld19zd2lnX2ZvbygpOyB9CgogICAgICAgICAgICBFbnN1cmVkIHRoYXQgU3dpZ19jb3B5X3N0cmluZygpIGlzIHVzZWQgaW4gcGxhY2Ugb2Ygc3RyZHVwKCkgc2luY2UKICAgICAgICAgICAgTmV4dFN0ZXAgZG9lcyBub3Qgc3VwcGx5IHN0cmR1cCgpLgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFJ1YnkgbGlicmFyeSBuYW1lIGFuZCBsb2NhdGlvbiBpbiBjb25maWd1cmUuaW4uCiAgICAgICAgICAgIFByb2JsZW0gMTogQXNzdW1lZCB0aGF0IGxpYnJhcnkgYWx3YXlzIHJlc2lkZWQgaW4gUnVieSdzICJhcmNoZGlyIiwKICAgICAgICAgICAgd2hpY2ggd2FzIGNvcnJlY3QgZm9yIFJ1YnkgMS42LngsIGJ1dCB3aGljaCBpcyBpbmNvcnJlY3QgZm9yIFJ1YnkKICAgICAgICAgICAgMS44LngsIGluIHdoaWNoIGNhc2UgdGhlIGxpYnJhcnkgbm9ybWFsbHkgcmVzaWRlcyBpbiBSdWJ5J3MKICAgICAgICAgICAgImxpYmRpciIuICBQcm9ibGVtIDI6IEFzc3VtZWQgdGhhdCB0aGUgbGlicmFyeSBjb3VsZCBhbHdheXMgYmUKICAgICAgICAgICAgbGlua2VkIHZpYSAiLWwiK1JVQllfSU5TVEFMTF9OQU1FICh3aGVyZSBSVUJZX0lOU1RBTExfTkFNRQogICAgICAgICAgICB0eXBpY2FsbHkgaXMgInJ1YnkiKSwgaG93ZXZlciB0aGlzIGZhaWxlZCBmb3IgcGxhdGZvcm1zLCBzdWNoIGFzCiAgICAgICAgICAgIE5leHRTdGVwLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgICAgc3RhdGljIGxpYnJhcnkgbmFtZSBpbiAxLjgueCBpcyBsaWJydWJ5LXN0YXRpYy5hLCB0aHVzCiAgICAgICAgICAgIC1scnVieS1zdGF0aWMgaXMgcmVxdWlyZWQuICBUaGUgbmV3IGxvZ2ljIHdvcmtzIGNvcnJlY3RseSBmb3IKICAgICAgICAgICAgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGZvciAxLjYueCBhbmQgMS44LnguCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUGVybCBDRkxBR1MgaW4gY29uZmlndXJlLmluIGZvciBOZXh0U3RlcC4KICAgICAgICAgICAgRGV0ZWN0aW9uIGNvZGUgZXh0cmFjdGVkIENGTEFHUyBmcm9tIFBlcmwncyAlQ29uZmlnIGhhc2ggYnV0CiAgICAgICAgICAgIG5lZ2xlY3RlZCB0byBhZGQgYSBuZXdsaW5lIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdCB0aHJvdWdoCiAgICAgICAgICAgIGBzZWQnLiAgTmV4dFN0ZXAncyBhbmNpZW50IGBzZWQnIGRpc2NhcmRzIGlucHV0IHdoaWNoIGlzIG5vdAogICAgICAgICAgICB0ZXJtaW5hdGVkIHdpdGggYSBuZXdsaW5lLCB0aHVzIFBlcmwgQ0ZMQUdTIGFsd2F5cyBldmFsdWF0ZWQgdG8gdGhlCiAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KCjAxLzE2LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaWR5IHVwIGluIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0aGF0IGlzIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgICAgIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIHdyYXBwZWQgd2l0aCB0aGUgdGhyb3dzIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgcmVkdW5kYW50IGNvZGUgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdzsgCiAgICAgICAgICAgICAgICB9CgowMS8xMi8yMDA0OiB3c2Z1bHRvbiBvbiBiZWhhbGYgb2YgbW1hdHVzIChtYXJjZWxvIG1hdHVzKSAKICAgICAgICAgICAgaWYgYSBtZXRob2QgdXNlcyAlZXhjZXB0aW9uIGFuZCB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSB1c2UKICAgICAgICAgICAgb2YgdGhlIHRocm93cyB0eXBlbWFwLCB0aGUgY29kZSBpbiBhIHRocm93cyB0eXBlbWFwIHdpbGwgYmUKICAgICAgICAgICAgZ2VuZXJhdGVkIGluc2lkZSB0aGUgdHJ5IGJvZHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIG1ldGhvZCB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgRXhjZXB0ICV7CiAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBjbGFzcyBFeGNlcHQge307CiAgICAgICAgICAgICAgdm9pZCBtZXRob2QoaW50IGkpIHRocm93IChFeGNlcHQpOwoKICAgICAgICAgICAgV2lsbCBnZW5lcmF0ZToKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0ICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBBcyBjYW4gYmUgc2VlbiwgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jayBpcyBmb3IgdGhlIHRocm93cyB0eXBlbWFwcy4KICAgICAgICAgICAgUHJldmlvdXNseSwgdGhpcyB3YXMgcmV2ZXJzZWQgc28gdGhhdCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrCiAgICAgICAgICAgIHdhcyB0aGUgJWV4Y2VwdGlvbiBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaXQgd291bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgIGltcG9zc2libGUgdG8gY2F0Y2ggRXhjZXB0IGFzIHRoZSBjYXRjaCBhbGwgKC4uLikgd291bGQgY2F0Y2ggdGhlCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0ZWFkLgoKVmVyc2lvbiAxLjMuMjEgKEphbnVhcnkgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMTAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBvdXRwdXQgZm9ybWF0IGZvciBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgY2FuIGJlIHNlbGVjdGVkIGZvcgogICAgICAgICAgICBpbnRlZ3JhdGlvbiB3aXRoIHlvdXIgZmF2b3VyaXRlIElERS9lZGl0b3IuIEVkaXRvcnMgYW5kIElERXMgY2FuIHVzdWFsbHkKICAgICAgICAgICAgcGFyc2UgZXJyb3IgbWVzc2FnZXMgYW5kIGlmIGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgd2lsbCBlYXNpbHkgdGFrZSB5b3UgCiAgICAgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yLiBUaGUgc3RhbmRhcmQgZm9ybWF0IGlzIHVzZWQgYnkgCiAgICAgICAgICAgIGRlZmF1bHQgZXhjZXB0IG9uIFdpbmRvd3Mgd2hlcmUgdGhlIE1pY3Jvc29mdCBmb3JtYXQgaXMgdXNlZCBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZzdGFuZGFyZCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaTo0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRm1pY3Jvc29mdCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSg0KTogU3ludGF4IGVycm9yIGluIGlucHV0LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg3MTkwOSBdIHNpbXBsZSBuYW1lc3BhY2UgcHJvYmxlbS4KICAgICAgICAgICAgVGhpcyB3YXMgYSBwcm9ibGVtIHVzaW5nIGFub255bW91cyBzdHJ1Y3R1cmVzIGluIGEgbmFtZXNwYWNlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBuOwogICAgICAgICAgICAgICAgICAgfSBTOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIGJyb2tlbiBQZXJsIGV4YW1wbGVzLgoKMTIvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhIGFuZCBDI10gRml4ZXMgZm9yIHdyYXBwaW5nIGNvdmFyaWFudCAocG9seW1vcnBoaWMpIHJldHVybiB0eXBlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXNlKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgQmFzZSogY29weSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIERlcml2ZWQqIGNvcHkoKSBjb25zdDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgRGVyaXZlZDo6Y29weSBwcm94eSBtZXRob2QgcmV0dXJucyBCYXNlIG5vdCBEZXJpdmVkLiBBIHdhcm5pbmcgaXMgaXNzdWVkCiAgICAgICAgICAgIGFib3V0IHRoaXMuIFByZXZpb3VzbHkgdGhlIHBvaW50ZXIgdXNlZCBieSB0aGUgcHJveHkgY2xhc3Mgd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIHRyZWF0ZWQgYXMgYSBCYXNlKiBpbnN0ZWFkIG9mIGEgRGVyaXZlZCouCgoxMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IHNvIHRoYXQgV2luZG93cyBwYXRocyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuCiAgICAgICAgICAgIEFuIGVycm9yIHByZXZpb3VzbHkgd291bGQgaGF2ZSBiZWVuIHNob3duIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICAuP3hhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICAuXGV4YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKClZlcnNpb24gMS4zLjIwIChEZWNlbWJlciAxNywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBMYXN0IG1pbnV0ZSBtb2RpZmljYXRpb25zLiAgIFBlcmw1IG1vZHVsZSBub3cgZ2VuZXJhdGVzIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgIGJ5IGRlZmF1bHQgbGlrZSBhbGwgb2YgdGhlIG90aGVyIG1vZHVsZXMuICBQSFA0IHdyYXBwZXJzIG5vIGxvbmdlcgogICAgICAgICAgICBpbmNsdWRlICJjb25maWcuaCIuIAoKMTIvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBXZWFrZW5lZCB3YXJuaW5nIG1lc3NhZ2UgcmVsYXRlZCB0byBjb25zdHJ1Y3RvciBuYW1lcyBzbyB0aGF0IGFuCiAgICAgICAgICAgIHVudXN1YWwgbmVzdGVkLWNsYXNzIHdyYXBwaW5nIHRlY2huaXF1ZSB3b3VsZCB3b3JrIGFnYWluIChhcHBhcmVudGx5CiAgICAgICAgICAgIGl0IHdvcmtlZCBpbiBzb21lIG9sZGVyIFNXSUcgcmVsZWFzZXMpLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGUgewogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NBOwogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NCOwogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NBIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0IgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogIFRoZXJlIGlzIHN0aWxsIHNvbWUgb2RkIGludGVyYWN0aW9uIHdpdGggdGhlIFNXSUcgc3ltYm9sCiAgICAgICAgICAgIHRhYmxlL3R5cGUgc3lzdGVtIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGxvb2tlZCBhdCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHdXN0YXZvIE5pZW1leWVyLgoKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJvdGVjdGVkIGNsYXNzIG1ldGhvZHMgYXJlIHdyYXBwZWQgYXMgcHJvdGVjdGVkIEphdmEgbWV0aG9kcyAKICAgICAgICAgICAgd2hlbiB1c2luZyB0aGUgZGlycHJvdCBkaXJlY3RvciBmZWF0dXJlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIHRvIHNvbWV0aGluZyBlbHNlIHNob3VsZCB0aGUgbmVlZCBhcmlzZSwgZm9yCiAgICAgICAgICAgIGV4YW1wbGUsIHByaXZhdGUgb3IgcGFja2FnZSBhY2Nlc3MuCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSAKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgKEphdmEpIGFuZCAlY3NtZXRob2Rtb2RpZmllcnMgKEMjKSBvcGVyYXRlIHNsaWdodGx5IAogICAgICAgICAgICBkaWZmZXJlbnRseS4gUHJldmlvdXNseSB0aGlzIGZlYXR1cmUgaGFkIHRvIGJlIHByZXNlbnQgdG8gc2V0IHRoZSBtZXRob2QKICAgICAgICAgICAgbW9kaWZpZXJzLiBOb3cgaXQgaXMgb25seSB1c2VkIGlmIGl0IGV4aXN0cyBmb3IgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLgogICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAicHVibGljIiBhcyBwcmV2aW91cyBob3dldmVyLCB3aGVuIHdyYXBwaW5nIHByb3RlY3RlZAogICAgICAgICAgICBkaXJlY3RvciBtZXRob2RzIGl0IGlzICJwcm90ZWN0ZWQiLiBUaGlzIGNoYW5nZSB3aWxsIG5vdCBhZmZlY3QgZXhpc3RpbmcKICAgICAgICAgICAgdXNlIG9mIHRoZSAlamF2YW1ldGhvZG1vZGlmaWVycyBvciAlY3NtZXRob2Rtb2RpZmllcnMuCgoxMi8xMS8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoaXMgZml4IHNvbWUgcmVjdXJyaW5nIHJlcG9ydHMgYWJvdXQga2V5d29yZHMgbm90IGJlZW4KCSAgICBwcm9wZXJseSBpZGVudGlmaWVkIGFuZCB3YXJuZWQsIGFuZCBpdCBzb2x2ZXMgdGhlIHByb2JsZW0KCSAgICBvZiBob3cgdG8gYWRkIGEgdGVzdCBmaWxlIHRvIHRoZSB0ZXN0LXN1aXRlIHN1Y2ggdGhhdCBpdAoJICAgIGRvZXNuJ3QgdXNlIGFueSBrZXl3b3JkIG9mIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcwoJICAgIChhbmQgZG9pbmcgaXQgd2l0aG91dCBjb21waWxpbmcgdGhlIHRlc3QgZm9yIGFsbCB0aGUKCSAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCB0aGluZyB0aGF0IGlzIG5vdCBhbHdheXMgcG9zc2libGUsCgkgICAgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHlvdSB0byBrbm93IGFsbCB0aGUgc3VwcG9ydGVkCgkgICAgbGFuZ3VhZ2Uga2V5d29yZHMsIHRoaW5nIHRoYXQgaXMgYWx3YXlzIGltcG9zc2libGUpLgoKCSAgICBTbyB0aGVzZSBhcmUgdGhlIGNoYW5nZXMgZ2xvYmFsbHkgc3BlYWtpbmc6CgoJICAgIC0gVW5pZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUga2V5d29yZCB3YXJuaW5ncyB0aHJvdWdoCgkgICAgICB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogYWxsIHRoZSBsYW5ndWFnZXMgaGFzIG5vdyBhCgkgICAgICBzZXBhcmF0ZSBmaWxlIHRoYXQgZGVmaW5lcyB0aGUga2V5d29yZHMgb3IgYmFkIG5hbWVzOgoKCQkgIHB5dGhvbi9weXRob25rdy5zd2cKCQkgIGNoaWNrZW4vY2hpY2tlbmt3LnN3ZwogICAgICAgICAgICAgICAgICAuLi4uCgoJICAgIC0gQWRkZWQga2V5d29yZCBsaXN0IGZvciBtb3N0IG9mIHRoZSBsYW5ndWFnZXMgdGhhdCBkaWRuJ3QKCSAgICAgIGhhdmUgb25lICh1c2luZyB0aGUgbmV3IHNlcGFyYXRlZCBmaWxlKS4KCQkgICAgCSAgICAKCSAgICAtIEFkZGVkIHRoZSAiQWxsIGtleXdvcmRzIiB3YXJuaW5nIHN1cHBvcnQ6IC1XYWxsa3cgb3B0aW9uLgoKICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGluY2x1ZGUgYWxsIHRoZSBrbm93biBrZXl3b3JkcwoJICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcywgYW5kIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICAgICBzd2lnIC1XYWxsa3cgLi4uLgoJICAgIAoJICAgICAgVGhpcyB3aWxsIGhlbHAgdG8gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgdGVzdC1zdWl0ZQoJICAgICAgZmlsZSB0aGF0IGNhbiBiZSBjb21waWxlZCBpbiBhbGwgdGhlIHN3aWcgc3VwcG9ydGVkCgkgICAgICBsYW5ndWFnZXMsIGFuZCBpdCB3aWxsIGJlIGFsc28gaGVscGZ1bCBmb3IgdXNlcnMgd2hvCgkgICAgICB3YW50IHRvIGNyZWF0ZSBtdWx0aS1sYW5ndWFnZSBsaWJyYXJpZXMuCgkgICAgCgkgICAgQW5kIHRoZXNlIGFyZSB0aGUgZGV0YWlsZWQgY2hhbmdlcyAobW9zdGx5IGZpbGUgYWRkaXRpb24pOgoKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIHNvbWUgc29ydCBvZiBrZXl3b3JkCgkgICAgICB3YXJuaW5nIGxpc3QsIG1vdmUgaXQgdG8gYW4gZXh0ZXJuYWwgbGFuZ3VhZ2Vrdy5zd2cKCSAgICAgIGZpbGUsIGllOgoJICAgIAoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHB5dGhvbi5zd2cgLT4gcHl0aG9ua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gY2hpY2tlbi5zd2cgLT4gY2hpY2tlbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHRjbDguc3dnIC0+IHRjbGt3LnN3ZwogCiAgICAgICAgICAgICAgYW5kIHJlLWluY2x1ZGUgbGFuZ3VhZ2Vrdy5zd2cgZnJvbSBsYW5ndWFnZS5zd2cuCgkgICAgCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlIHRoYXQgZGlkbid0IGhhdmUgYSBrZXl3b3JkIGxpc3QsIGFuZAoJICAgICAgZm9yIHRoZSBvbmVzIHRoYXQgSSBjb3VsZCBmaW5kIGEgbGlzdCwgYWRkIHRoZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSwgaWU6CgogICAgICAgICAgICAgICAgIGNzaGFycC9jc2hhcnBrdy5zd2cKICAgICAgICAgICAgICAgICBqYXZhL2phdmFrdy5zd2cKICAgICAgICAgICAgICAgICBwaHA0L3BocGt3LnN3ZwoJCSBwaWtlL3Bpa2Vrdy5zd2cJIAoJCSBydWJ5L3J1Ynlrdy5zd2cKCgogICAgICAgICAgICAgIGFsc28gYWRkIGEgbGluZSBpbiBsYW5ndWFnZS5zd2cgdG8gaW5jbHVkZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2csIGJ1dCBub3cgaXQgaXMgY29tbWVudGVkISEhLCBsaWtlIGluCgkgICAgICBqYXZhLnN3ZzoKCiAgICAgICAgICAgICAgICAgIC8qIGphdmEga2V5d29yZHMgKi8KICAgICAgICAgICAgICAgICAgLyogcGxlYXNlIHRlc3QgYW5kIGFjdGl2YXRlICovCiAgICAgICAgICAgICAgICAgIC8vJWluY2x1ZGUgImphdmFrdy5zd2ciCgoJICAgICAgaWUsIHRoZXJlIHdpbGwgYmUgbm8gY2hhbmdlIGluIGhvdyBzd2lnIHJ1bnMgbm9ybWFsbHkKCSAgICAgIHVudGlsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRlc3QgYW5kIHVuY29tbWVudCB0aGF0CgkgICAgICBsaW5lLgoJICAgICAgCgkgICAgICBTbywgcGxlYXNlIGNoZWNrIGVhY2ggbGFuZ3VhZ2Vrdy5zd2cgZmlsZSAoSSBsZWZ0IHRoZQoJICAgICAgbGluayB0byB0aGUga2V5d29yZCBsaXN0IHNvdXJjZSBmb3IgY2hlY2tpbmcpLCBhbmQgYWZ0ZXIKCSAgICAgIHRlc3RpbmcsIHVuY29tbWVudCB0aGUgJWluY2x1ZGUgbGluZS4KCgkgICAgLSBBZGRlZCB0aGUgZmlsZSBhbGxrdy5zd2csIHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUKICAgICAgICAgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlcy4KCgkgICAgICBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGhhcyBubyBsYW5ndWFnZWt3LnN3ZyBmaWxlIHJpZ2h0CgkgICAgICBub3csIGFuZCBpZiB0aGV5IG5lZWQgb25lLCBhZGQgdGhlIGZpbGUgaW50byB0aGUKCSAgICAgIGxhbmd1YWdlIGRpcmVjdG9yeSwgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBpbmNsdWRlCgkgICAgICBsaW5lIGludG8gdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgCgkgICAgLSBBZGRlZCB0aGUgLVdhbGxrdyB0aGF0IGluY2x1ZGVzIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIE5vdGUgdGhhdCB0aGUgb2xkIC1sYWxsa3cuc3dnIG9wdGlvbiBjb3VsZG4ndCBiZSB1c2VkCgkgICAgICBzaW5jZSBpdCBpbmNsdWRlIHRoZSBmaWxlIGFmdGVyIGl0IHdvdWxkIGJlIG5lZWRlZC4KCgoJICAgIEhvcGVmdWxseSwgdGhlIC1XYWxsa3cgb3B0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQKCSAgICBydWxlcyBpbiB0aGUgcmVsYXRlZCB0ZXN0LXN1aXRlIE1ha2VmaWxlcywgc28sIHdoZW4KCSAgICBjcmVhdGluZyBhIG5ldyB0ZXN0LCBvciBhZGRpbmcgYSBuZXcgc3dpZyBsaWJyYXJ5IGZpbGUKCSAgICAobGlrZSBfc3RkX2RlcXVlLmkpLCBzd2lnIHdpbGwgd2FybiB5b3UgaWYgeW91IGFyZSB1c2luZyBhCgkgICAgYmFkIG5hbWUsIGNvbnNpZGVyaW5nIGFsbCB0aGUgbGFuZ3VhZ2Ugd2hlcmUgaXQgbmVlZHMgdG8KCSAgICBydW4uCgkgICAgCgkgICAgUmlnaHQgbm93IHlvdSBjYW4gdGVzdCBpdCBieSB1c2luZzoKCiAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0ic3dpZyAtV2FsbGt3IgoKCSAgICBvciB1c2luZyB5b3VyIGZhdm9yaXRlIHRhcmdldCBsYW5ndWFnZSwgaXQgZG9lc24ndCBtYXR0ZXIuCgoJICAgIEFuZCB5ZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGV4YW1wbGVzIHRoYXQgYXJlIHVzaW5nCgkgICAgcmVzZXJ2ZWQga2V5d29yZHMsIHNwZWNpYWxseSBmcm9tIGNzaGFycC4KICAgICAgICAgIAoJICAgICoqKiBSZW1lbWJlciAqKioqOiB0aGUgbmV3IGtleXdvcmQgd2FybmluZyBsaXN0cyBhcmUgbm90CgkgICAgaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbnkgb2YgbGFuZ3VhZ2UgdGhhdCBiZWZvcmUgZGlkbid0CgkgICAgaGF2ZSBvbmUuIFRvIGVuYWJsZSB0aGUga2V5d29yZCB3YXJuaW5ncyBhcyB0aGUgZGVmYXVsdAoJICAgIGJlaGF2aW9yLCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBsYW5ndWFnZWt3LnN3ZyBmaWxlIGhhcyB0bwoJICAgIGJlIHVuY29tbWVudGVkIGF0IGVhY2ggbGFuZ3VhZ2Uuc3dnIGZpbGUuCgoJICAgIFNvLCBhbGwgdGhlIGxhbmd1YWdlIG1haW50YWluZXJzLCBwbGVhc2UgY2hlY2sgdGhlCgkgICAga2V5d29yZHMgbGlzdC4gCgoJICAgIEFsc28sIHlvdSBjYW4gYWRkIGJ1aXQtaW4gbmFtZXMsIGFuZCBub3Qgb25seSBrZXl3b3JkcywgbGlrZQoJICAgICdUcnVlL0ZhbHNlJyBpbiBweXRob24uICBSZW1lbWJlciB0aGF0IHlvdSBjYW4gYmUgbW9yZQoJICAgIHNwZWNpZmljIGFuZCByZWZlciBvbmx5IHRvIG1lbWJlciBuYW1lcywgbGlrZSAqOjpjb25maWd1cmUKCSAgICBvciAqOjpjZ2V0IChzZWUgYW4gZXhhbXBsZSBpbiB0aGUgdGNsOC90Y2w4a3cuc3dnIGZpbGUpLAoJICAgIG9yIG9ubHkgZ2xvYmFsIG5hbWVzLCBsaWtlIDo6cmFuZ2UgKHNlZSBhbiBleGFtcGxlIGluIHRoZQoJICAgIHB5dGhvbi9weXRob25rdy5zd2cgZmlsZS4KCgkgICAgSnVzdCB0byBiZSBjb25zaXN0ZW50LCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlczoKCgkgICAgLSBVc2UgY29kZSAzMTQgZm9yIGtleXdvcmQgYW5kL29yIGZhdGFsIGJhZCBuYW1lcy4KCSAgICAtIFVzZSBjb2RlIDMyMSBmb3IgYnVpdC1pbiBhbmQvb3Igbm90IGZhdGFsIGJhZCBuYW1lcy4KICAgICAgICAgICAKICAgICAgICAgICAgc28sIHRoZXkgY2FuJ3QgYmUgZGlzYWJsZWQvZW5hYmxlZCBpbmRlcGVuZGVudGx5IChzZWUKCSAgICBweXRob24vcHlodG9ua3cuc3dnIGZvciBleGFtcGxlcykuCgoJICAgICoqKiogQW5kIGRvbid0IGFkZCBhbnkgbmV3IHRlc3QgZmlsZSB3aXRob3V0IGNoZWNraW5nIGl0CgkgICAgd2l0aCB0aGUgLVdhbGxrdyBvcHRpb24hISAodGhhdCBpbmNsdWRlcyBtZSkgKioqKiouCgkgIAoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNGIGJ1ZyAjODU0NjM0CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFjY2VwdGluZyB0aGUgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yICcvJyBvbiAKICAgICAgICAgICAgV2luZG93cyBhbmQgdGhlIE1hYyBpbiBhZGRpdGlvbiB0byB0aGUgbmF0aXZlIG9uZSAoICdcJyBvbiAKICAgICAgICAgICAgV2luZG93cykuIFRoaXMgY2FuIGJlIHVzZWQgaW4gJWltcG9ydCwgJWluY2x1ZGUgYW5kIGNvbW1hbmRsaW5lIAogICAgICAgICAgICBvcHRpb25zIHRha2luZyBhIHBhdGgsIGZvciBleGFtcGxlIC1JLiBPbiBDeWd3aW4sIGJvdGggdGhlIFdpbmRvd3MKICAgICAgICAgICAgYW5kIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciBjYW4gbm93IGJlIHVzZWQgKHdhcyAnLycgb25seSkuCiAgICAgICAgICAgIAoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgogICAgICAgICAgICBbcHl0aG9uXSBJbXBsZW1lbnRpbmcgdGhlIHJ1bnRpbWUgInJlcHJvdGVjdGVkIiBkaXJlY3RvcgoJICAgIG1lbWJlcnMsIGlmIHlvdSBoYXZlOgogICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhcigpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBoZWxsbygpIHsgcmV0dXJuIGRvX2hlbGxvKCk7KQoKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGkoKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oZWxsbygpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlCgogICAgICAgICAgICAgICAgaW1wb3J0IG15X21vZHVsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyhteV9tb2R1bGUuQmFyKToKICAgICAgICAgICAgICAgICAgZGVmIGRvX2hlbGxvKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAKCSAgICAgICAgYiA9IEJhcigpICMgUHVyZSBDKysgRGlyZWN0b3IgY2xhc3MKICAgICAgICAgICAgICAgIGYgPSBGb28oKSAjIEMrKyBEaXJlY3RvciArIHB5dGhvbiBtZXRob2RzCgogICAgICAgICAgICAgICAgYi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBDKysgQmFyOjpkb19oZWxsbygpCiAgICAgICAgICAgICAgICBmLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIFB5dGhvbiBGb286OmRvX2hlbGxvKCkKCiAgICAgICAgICAgICAgICBiLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogCiAgICAgICAgICAgICAgICBiLmRvX2hlbGxvKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hlbGxvKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGVsbG8oKSAjIE9rLCBzaW5jZSBpdCBpdHMgcmVkZWZpbmVkIGluIHB5dGhvbi4KCiAgICAgICAgICAgIEhlcmUgQmFyLmRvX2hlbGxvIGlzIGFsd2F5cyBwcm90ZWN0ZWQsIGJ1dCBGb28uZG9faGVsbG8KICAgICAgICAgICAgaXMgInB1YmxpYyIsIGJlY2F1c2UgaXQgaXMgcmVkZWZpbmVkIGluIHB5dGhvbi4gQmVmb3JlLAoJICAgIGFsbCB0aGUgJ2RvX2hlbGxvJyBtZXRob2RzIHdlcmUgcHVibGljLgoKCSAgICBUaGlzIHNlZW1zIHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4gQysrIGFuZCBweXRob24KCSAgICBwaGlsb3NvcGhpZXMsIGllLCBhbGwgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIGtlZXAKCSAgICBwcm90ZWN0ZWQgYXQgdGhlIHVzZXIgc2lkZSAoQysrIHdheSkgdW50aWwgdGhleSBhcmUKCSAgICByZWRlZmluZWQgKHB5dGhvbiB3YXksIHdlcmUgYWxsIGRlZmluZWQgbWV0aG9kcyBhcmUgYWx3YXlzCgkgICAgcHVibGljKS4gQW5kIHRoaXMgaXMgbm90IG9ubHkgYSBnb29kIGNvbXByb21pc2UsIGl0IGFsc28KCSAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gZG8gaXQgOikuCgoJICAgIE5vdyBydWJ5IGhhcyBuYXRpdmUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMsIGFuZCBweXRob24KCSAgICBwdXJlIHJ1bnRpbWUgc3VwcG9ydC4gSSBndWVzcyB0aGVzZSBhcmUgdGhlIHR3byBwb3NzaWJsZQoJICAgIGV4dHJlbWUgY2FzZXMuIEFuZCBob3BlZnVsbHksIHRoZXkgY291bGQgYmUgdXNlZCBhcwoJICAgIHRlbXBsYXRlcyB0byBtb2RpZnkgdGhlIG90aGVyIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQKCSAgICBkaXJlY3RvcnMsIHNvIHRoZXkgY2FuICJyZXByb3RlY3QiIHRoZSBwcm90ZWN0ZWQgZGlyZWN0b3IKCSAgICBtZW1iZXJzIGF0IHRoZSB0YXJnZXQgbGFuZ3VhZ2Ugc2lkZS4KCgkgICAgVGhpcyBmaW5pc2hlZCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIHN1cHBvcnQgZm9yIHRoZSAKCSAgICBweXRob24gbGFuZ3VhZ2UuIE9jYWxtIHdpbGwgbmVlZCB0byBhZGQgdGhlCgkgICAgInJlcHJvdGVjdGlvbiIgbGF0ZXIuCgoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoZSBmb2xsb3dpbmcgY2FzZSAocmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uKSB3YXMgZml4ZWQ6CgoJICAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAoJICAgICAgY2xhc3MgRm9vIHsgCgkgICAgICBwdWJsaWM6CgkgICAgICAgIHZvaWQgeSgpOwoKCSAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgaW50IHg7CgkgICAgICB9OwoKCSAgIHN3aWcgd2FybmVkIHRoYXQgdGhlIHN5bWJvbCAneCcgd2FzIGFscmVhZHkgZGVmaW5lZCwgYW5kCiAgICAgICAgICAgdGhlIHJlbmFtaW5nIGZhaWxzLiAneCcgd2FzIG5vdCBlbWl0dGVkLCBzaW5jZSBpdCBpcwogICAgICAgICAgIHByb3RlY3RlZCwgYnV0IGl0IHdhcyBrZXB0IGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0b28KICAgICAgICAgICBtdWNoIGluZm9ybWF0aW9uLgoKCSAgIE5vdyBzd2lnIHdvcmtzIGZvciBhbGwgdGhlIGNhc2VzIChwbGFpbiwgZGlyZWN0b3IgYW5kCgkgICBkaXJwcm90KSBhZ2Fpbi4gVGhpcyB3YXMgZml4ZWQgYnkgYWxsb3dpbmcgdGhlIHBhcnNlci55IHRvCgkgICBkZWNpZGUgbXVjaCBjbG9zZXIgd2hhdCB0byBkbyB3aXRoICd4Jy4gQmVmb3JlIGFsbCB0aGUKCSAgIGRpc2NhcmRpbmcgb3IgZ2VuZXJhdGlvbiB3YXMgcmVzb2x2ZWQgYXQgdGhlIGxhbmcuY3h4CgkgICBzdGFnZS4gQWxzbyB0aGUgY2hhbmdlcyBpbiBwYXJzZXIueSB0byBpbXBsZW1lbnQgdGhlCgkgICBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZSBhcmUgbm93IG11Y2ggbW9yZSBlbmNhcHN1bGF0ZWQsIGFuZAoJICAgdGhleSBnZXQgZGlzYWJsZWQgaWYgdGhlIG1vZGUgaXMgbm90IGVuYWJsZWQuIEJlZm9yZSB0aGUKCSAgIGRlYWN0aXZhdGlvbiB3YXMgZG9uZSBhdCB0aGUgZ2VuZXJhdGlvbiBzdGFnZSAobGFuZy5jeHgpLgoKCSAgIEJ5IHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGlyZWN0b3IgbW9kZSBpcyBlbmFibGVkLCBhbmQKCSAgICVyZW5hbWUgaXMgZG9uZSwgcmV1c2luZyBhIHByb3RlY3RlZCBtZW1iZXIgbmFtZSwgdGhlcmUgaXMKCSAgIGEgcGF0aG9sb2dpY2FsIGNhc2U6CgoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCiAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQSB7CgkgICAgIHB1YmxpYzoKCSAgICAgICB2b2lkIHkoKTsKCgkgICAgIHByb3RlY3RlZDoKCSAgICAgICBpbnQgeDsgICAgICAgICAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgaW50IHg7ICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICB2b2lkIHgoKTsgLyogd29ya3MgKi8KCSAgICAgICB0eXBlZGVmIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoKCSAgICAgICB2aXJ0dWFsIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGFzIGl0IHNob3VsZCwgc2luY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9vOjp4KCkgd2lsbCBiZSBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvciAqLwoKCSAgICAgICB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBidXQgc29tZXRpbWVzIGl0IHNob3VsZG4ndCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBGb286OngoKSB3aWxsIG5vdCBiZSBlbWl0dGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBub3QgdmlydHVhbCAqLwoKCSAgICAgfTsKCgkgICBUaGUgbGFzdCBjYXNlIGlzIG5vdCBhbHdheXMgcmlnaHQgYmVjYXVzZSBhdCB0aGUgcGFyc2VyLnB5CgkgICBzdGFnZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVjaWRlIGlmIHRoZSBwcm90ZWN0ZWQgbWVtYmVyCgkgICBGb286OngoKSBjb3VsZCBvciBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcmVuYW1lZCBGb286OnkoKSwKCSAgIHNpbmNlIEZvbzo6eCgpIGNvdWxkIGJlIHZpcnR1YWwgYnkgaW5oZXJpdGFuY2UuCgoJICAgSSBndWVzcyB0aGlzIGp1c3QgYW4gaW50cmluc2ljIGxpbWl0YXRpb24sIGFuZCBubyBtdWNoIGNhbgoJICAgYmUgZG9uZSBhYm91dCBpdCB3aXRob3V0IHJlc29ydGluZyBpbnRvIGxhcmdlciBjaGFuZ2VzIHRvCgkgICBwb3N0cG9uZSwgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUgbXVsdGlwbHkgc3ltYm9sCgkgICBkZXRlY3Rpb24gKGxhbmcuY3h4IHN0YWdlKS4KCSAgIAoJICAgU28sIGJ5IG5vdywgaXQgaXMganVzdCBjb25zaWRlcmVkIGEgd2VsbCBrbm93biAiZmVhdHVyZSIgaW4KCSAgIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZS4gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGl0IHNlZW1zCgkgICB0byBiZSBhIHJhcmUgY2FzZSwgYW5kIGl0IGNhbiBiZSBhdm9pZGVkIGJ5IHRoZSB1c2VyIGJ5CgkgICBoaWRpbmcgJ3gnIGJlZm9yZSByZW5hbWluZyAneSc6CgoJICAgICAlcmVuYW1lKF94KSBGb286OngoKTsKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKCSAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSB2aXJ0dWFsIG1ldGhvZCBkZXRlY3Rpb25zIG5vdyBwcm9wZXJseQoJICAgIHRyZWF0cyB0aGUgZm9sbG93aW5nIGNhc2VzOgoKICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28geyB0eXBlZGVmIGludCBJbnQ7IH0KCSAgICAgc3RydWN0IEEge307CgkgICAgIHR5cGVkZWYgQSBCOwoKICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICB2aXJ0dWFsIH5Gb28oKSB7fQoKICAgICAgICAgICAgICAgdmlydHVhbCBGb28qIGNsb25lcigpID0gMDsKCSAgICAgICB2aXJ0dWFsIGludCBnZXRfdmFsdWUoKSA9IDA7CgkgICAgICAgdmlydHVhbCBBKiBnZXRfY2xhc3MoKSA9IDA7CgkgICAgICAgdmlydHVhbCB2b2lkIGp1c3RfZG9faXQoKSA9IDA7CgkgICAgIH07CgogICAgICAgICAgICAgc3RydWN0IEJhciA6IEZvbwogICAgICAgICAgICAgewogICAgICAgICAgICAgICBCYXIqIGNsb25lcigpOwogICAgICAgICAgICAgICBmb286OkludCBnZXRfdmFsdWUoKTsKICAgICAgICAgICAgICAgQiogZ2V0X2NsYXNzKCk7CiAgICAgICAgICAgICAgIHZvaWQganVzdF9kb19pdCgpOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICBBbGwgdGhlIEZvbyBhbmQgQmFyIG1ldGhvZHMgYXJlIHZpcnR1YWwuICBBIG5ldyBhdHRyaWJ1dGUKCSAgICAidmlydHVhbDp0eXBlIiByZWNvcmQgdGhlIGJhc2UgcG9seW1vcnBoaWMgdHlwZS4gSW4gdGhlCgkgICAgcHJldmlvdXMgY2FzZXMgd2UgaGF2ZToKCgkgICAgICAgdHlwZSA6IEJhciAgICAgICB2aXJ0dWFsOnR5cGUgOiBGb28KCSAgICAgICB0eXBlIDogZm9vOjpJbnQgIHZpcnR1YWw6dHlwZSA6IGludAoJICAgICAgIHR5cGUgOiBCICAgICAgICAgdmlydHVhbDp0eXBlIDogQQoJICAgICAgIHR5cGUgOiB2b2lkICAgICAgdmlydHVhbDp0eXBlIDogdm9pZAoKICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGluIGxhbmd1YWdlcyAoamF2YStkaXJlY3RvcnMpCgkgICAgdGhhdCBjb3VsZCBoYXZlIHByb2JsZW1zIHJlZGVmaW5pbmcgQmFyKiBCYXI6OmNsb25lcigpLgoKCSAgICBJZiB5b3UgbmV2ZXIgaGFkIGNvZGUgbGlrZSB0aGUgYWJvdmUsIHlvdSB3aWxsIHNlZSBubwoJICAgIGVmZmVjdHMuIEJ1dCBpZiB5b3UgaGF2ZSBzb21lIGNvZGUgbGlrZSB0aGF0LCB5b3UKCSAgICB3aWxsIHNlZSBzb21lIGVmZmVjdHMgc2luY2Ugc29tZSBtZXRob2RzIHRoYXQKCSAgICBiZWZvcmUgd2VyZSBub3QgcHJvcGVybHkgdHJlYXRlZCBhcyB2aXJ0dWFsLAoJICAgIHdpbGwgc3RhcnQgdG8gYWN0IGxpa2UgdGhhdC4gVGhpcyBjb3VsZCBlbmxhcmdlCgkgICAgeW91ciBkaXJlY3RvciBjbGFzc2VzLgoJICAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgKGRpcnByb3QpCgkgICAgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICAKCSAgICBJdCBjYW4gYmUgZW5hYmxlIGJ5IHVzaW5nICctZGlycHJvdCcgb3IgYnkgYWRkaW5nCgkgICAgdGhlIG9wdGlvbiB0byB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uLCBsaWtlOgoKICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLGRpcnByb3Q9IjEiKSBteV9tb2R1bGUKCgkgICAgVGhpcyBtb2R1bGUgb3B0aW9uIHdhcyBhZGRlZCB0byBwcm9wZXJseSBjb21waWxlIHRoZQoJICAgIGRpcmVjdG9yX3Byb3RlY3RlZC5pIGFuZCBkaXJlY3Rvcl9uZXN0ZWQuaSBleGFtcGxlcy4KCSAgICAKCSAgICBUaGUgZmVhdHVyZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob25bMi4yLDIuM10gCgkgICAgYW5kIHJ1YnlbMS42LjddLCBib3RoIGF0IGNvbXBpbGF0aW9uIGFuZCBydW50aW1lLCBhbmQgCgkgICAgamF2YVtqMnNkazEuNC4xXzAxXSwgYnV0IG9ubHkgYXQgY29tcGlsYXRpb24gKG15IGphdmEKCSAgICBpbnN0YWxsYXRpb24gZG9lc24ndCBydW4gYW55IG9mIHRoZSBkaXJlY3RvciBleGFtcGxlcywKCSAgICBvbGRzIG5vciBuZXdzKS4KCgkgICAgUGxlYXNlIHRlc3QgZm9yIG9jYW1sIGFuZCBqYXZhLgoJICAgIAoJICAgIFRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgV2lsbGlhbSBhbmQgU2NvdHQgd2VyZSBmaXhlZCwKCSAgICBleGNlcHQgZm9yIGEgd2FybmluZyBhYm91dCAgU1dJR19KYXZhVGhyb3dFeGVjcHRpb24oKQoJICAgIG11bHRpcGx5IGRlZmluZWQuIEkgY2FuJ3QgcmVwcm9kdWNlIHRoaXMgZXJyb3Igd2l0aCBteQoJICAgIGV4YW1wbGVzLiBXZSB3aWxsIHdhaXQgZm9yIFNjb3R0IHRvIHNlbmQgdXMgYSBtaW5pbWFsCgkgICAgY2FzZS4KCgoxMi8wNy8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCBoYXMgYmVlbgoJICAgIGNvbXBsZXRseSBtb3ZlZCBvdXQgZnJvbSBweXRob24uY3h4LCBhbmQgbm93CgkgICAgcmVzaWRlcyBpbiB0aGUgY29tbW9uIGxhbmcuY3h4LCBlbWl0LmN4eCBhbmQKCSAgICBhbGxvY2F0ZS5jeHggZmlsZXMuIAoKCSAgICBUaGlzIG1lYW5zIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgZGlyZWN0b3JzLCBpZSwgcHl0aG9uLCBqYXZhLCBvY2FsbQoJICAgIGFuZCBydWJ5LgoKCSAgICBUaGUgY2hhbmdlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvbiAoY29tcGlsYXRpb24rcnVudGltZSkKCSAgICBhbmQgamF2YSAoanVzdCBjb21waWxhdGlvbikuCgkgICAgCgkgICAgUGxlYXNlIGFkZCBydW50aW1lIHRlc3RzIGZvciB0aGUgbWlzc2luZyBsYW5ndWFnZXMgCgkgICAgYW5kIHRlc3QgaXQuCgoJICAgIFRoZSAnLW5vZGlycHJvdCcgb3B0aW9uIHdhcyBtb3ZlZCB0byB0aGUgcHJpbmNpcGFsIG1haW4sCgkgICAgYW5kIGNhbiBiZSB1c2VkIGZyb20gYWxsIHRoZSBsYW5ndWFnZXMuCgoxMi8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIGFuZCBpbXByb3ZlZCBlcnJvciBjaGVja2luZyBvZiBTVFJJTkdfT1VUIHR5cGVtYXBzIGluIAogICAgICAgICAgICB2YXJpb3VzLmkuCgoxMi8wNC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIC0gTm93IHRoZSB2aXJ0dWFsIG1lbWJlcnMgd2l0aCBubyBleHBsaWNpdCBkZWNsYXJhdG9yCgkgICAgYXJlIHByb3Blcmx5IGlkZW50aWZpZWQ6CgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7CiAgICAgICAgICAgICAgICAgIGludCBmKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBIZXJlLCBCOjpmKCkgaXMgdmlydHVhbCwgYW5kIHRoZSBkaXJlY3RvciBhbmQgdGhlCgkgICAgdmlydHVhbCBlbGltaW5hdGlvbiBtZWNoYW5pc20gbm93IHJlY29nbml6ZSB0aGF0LgoKICAgICAgICAgICAgLSBbQyNdIFRoaXMgZml4IGFsc28gZml4ZXMgdGhlIHByb2JsZW0gd2hlcmUgJ292ZXJyaWRlJyB3YXMgbm90IGJlaW5nIAogICAgICAgICAgICB1c2VkIG9uIGFueSBvdmVycmlkZGVuIHZpcnR1YWwgbWV0aG9kLCBzbyBmb3Igc3RydWN0IEIgYWJvdmUsIAogICAgICAgICAgICB0aGlzIEMjIGNvZGUgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBCIDogQSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IGYoKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoJICAgIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBwcm90ZWN0ZWQgdmlydHVhbCBtZXRob2RzLiBUaGV5IGFyZSBub3cKCSAgICBwcm9wZXJseSBlbWl0dGVkIHdoZW4gdXNpbmcgd2l0aCBkaXJlY3RvciAocHl0aG9uIG9ubHkgYnkKCSAgICBub3cpLgoJICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBmMigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgVGhpcyBjYW4gYmUgZGlzc2FibGVkIGJ5IHVzaW5nIHRoZSAnLW5vZGlycHJvdCcgb3B0aW9uLgoKCSAgICAtIFRoZSBmZWF0dXJlICdub2RpcmVjdG9yJyBpcyB3b3JraW5nIG5vdyBhdCB0aGUgdG9wIGxldmVsLAoJICAgIHNvLCBpdCBtdXN0IHdvcmsgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7CiAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm9kaXJlY3RvciIpIEE6OmYyOwoKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYyKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgCgkgICAgaW4gdGhpcyBjYXNlLCBvbmx5ICdmMScgaXMgZXhwb3J0ZWQgdG8gdGhlIGRpcmVjdG9yIGNsYXNzLgoJICAgIAoJICAgIC0gQWRkZWQgZGlyZWN0b3Igc3VwcG9ydCBmb3IgY29uc3QgVFlQRSYgYXJndW1lbnRzIChweXRob24pLgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIElOT1VUIGFuZCBPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3Igd2hlbiB0aGUgSk5JIHR5cGUgCiAgICAgICAgICAgIGlzIGJpZ2dlciB0aGFuIHRoZSBDIHR5cGUuIEZvciBleGFtcGxlLCB1bnNpZ25lZCBsb25nICgzMmJpdHMgb24gbW9zdCBzeXN0ZW1zKQogICAgICAgICAgICBpcyBtYXBwZWQgdG8gamxvbmcgKDY0Yml0cykuIFJldHVybmVkIHZhbHVlIHdhcyBpbmNvcnJlY3QuIEJ1ZyByZXBvcnRlZCBieSAKICAgICAgICAgICAgQnJpYW4gSGF3bGV5LgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQmV0dGVyIGZpeCBmb3IgZW50cnkgZGF0ZWQgMDUvMTEvMjAwMy4gRml4ZXMgdGhlIGZvbGxvd2luZwogICAgICAgICAgICB0eXBlbWFwczoKCiAgICAgICAgICAgIEphdmE6IGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCiAgICAgICAgICAgIEMjOiBjc2Jhc2UsIGNzaW50ZXJmYWNlcywgY3NpbXBvcnRzLCBjc2NsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBjc2ZpbmFsaXplLCBjc2dldGNwdHIgJiBjc2NvZGUuCgogICAgICAgICAgICBJdCBhbHNvIGZpeGVzIGJ1ZyBpbiB1c2luZyBhcnJheXMgb2YgQyBzdHJ1Y3RzIHdpdGggYXJyYXlzX2phdmEuaSAKICAgICAgICAgICAgYXMgcmVwb3J0ZWQgU2NvdHQgTWljaGVsLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybF0gRml4ZWQgWyA4NTIxMTkgXSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaW4gb3V0cHV0IC5wbSwgcGVybDUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRG93bGluZy4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgWyA3NTUzODIgXSBjYWxsaW5nIGZ1bmMoY29uc3QgdmVjdG9yPFQ+JiBwKSBldmFsdWF0ZXMgcFswXSBpbiBpbnRlcnAuCiAgICAgICAgICAgIFRoZSBUY2wgdHlwZSBjaGVja2VyIHdhcyBpbXByb3Blcmx5IGhhbmRsaW5nIHRoZSBpbnRlcnByZXRlciByZXN1bHQgd2hlbgogICAgICAgICAgICB0eXBlIHZpb2xhdGlvbnMgd2VyZSBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGF2aXUgUG9wcC1Ob3dhay4KCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDU0NTA1OCBdIGNvbmZpZ3VyZSdzIC0td2l0aC10Y2xpbmNsIGhhcyBubyBlZmZlY3QKCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA3NjY0MDkgXSBtaXNzaW5nIHN5bWJvbCBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBkdXJpbmcgbW9kdWxlIGxvYWQKICAgICAgICAgICAgU1dJRydzIGludGVybmFsIGZ1bmN0aW9ucyBhcmUgYWxsIHN0YXRpYyBhcyB0aGVyZSBpcyBubyBuZWVkIGZvciBkaWZmZXJlbnQgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB0byBzaGFyZSBhbnkgY29kZSBhdCBydW50aW1lLgoKMTEvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDg0ODMzNSBdIERpcmVjdG9yczogI2luY2x1ZGUgd3JhcHBlciAuaCBmaWxlIC0gd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIGFkZGluZyBhIGRpcmVjdG9yeSB0byB0aGUgZ2VuZXJhdGVkICNpbmNsdWRlICJmb29fd3JhcC5oIiBzdGF0ZW1lbnQKICAgICAgICAgICAgaW4gc29tZSBzaXR1YXRpb25zLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDg0OTA2NCBdIEpBVkEgOiBBY2Nlc3MgbW9kaWZpZXIgZm9yIGRlcml2ZWQgY2xhc3Mgd3JvbmcuCiAgICAgICAgICAgIFRoZSBkZWxldGUoKSBtZXRob2QgaXMgYWx3YXlzIHB1YmxpYyBub3cuIEl0IHVzZWQgdG8gYmUgcHJvdGVjdGVkIHdoZW5ldmVyIGEgCiAgICAgICAgICAgIGRlc3RydWN0b3Igd2FzIG5vbiBwdWJsaWMuIEFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHJ1bnRpbWUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiBtYWtpbmcgZGVsZXRlKCkgcHJvdGVjdGVkIG5vdy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NTAxNTEgXSBQWVZFUlNJT04gd2l0aCBweXRob24yLjMgaW4gY29uZmlndXJlIG9mIFNXSUcgMS4zLjE5IChNYXliZSkuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICBbIDg1MDY2NiBdICNpbmNsdWRlIGV4dHJhIGxpbmUgYWRkZWQuICAKICAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHNvbWUgcHJvYmxlbXMgd2l0aCBnZXR0aW5nIGNvcnJlY3QgbGluZSBudW1iZXJzIG9uCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2VzLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhbm90aGVyIG9uZSBvZiBNYXJjZWxvJ3MgZXZpbCB0ZW1wbGF0ZSBidWdzIChpbmZpbml0ZQogICAgICAgICAgICByZWN1cnNpb24pLiBbIDg0OTUwNCBdIHRlbXBsYXRlIGFuZCB0eXBlZGVmIC0+IGluZi4gcmVjdXJzaW9uLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzOgoKCSAgICAgICAgIGludCAqeCA9ICZzb21lYXJyYXlbMF07CgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzU2NTUyIF0gbWlzc2luZyBkZWZhdWx0IGFyZ3VtZW50IGNsYXNzIHNjb3BlIHdpdGggInwiLgogICAgICAgICAgICBUaGlzIGlzIHJlYWxseSBvbmx5IGEgYmFuZC1haWQgZml4IGZvciB1c2Ugb2YgY2xhc3MtZW51bXMgaW4KICAgICAgICAgICAgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGVudW0gRmxhZyB7IGZsYWcxID0gMHgxLCBmbGFnMiA9IDB4MiB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgeCA9IGZsYWcxIHwgZmxhZzIpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZTogdGhlcmUgYXJlIHN0aWxsIHNvbWUgKG1vcmUgc3VidGxlKSBjYXNlcyB0aGF0IGFyZSBicm9rZW4sCiAgICAgICAgICAgIGJ1dCBoYXJkIHRvIGZpeCBkdWUgdG8gYW4gaXNzdWUgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uIFdpbGwKICAgICAgICAgICAgYWRkcmVzcyBsYXRlci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRG1pdHJ5IE1pcm9ub3YuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDg0MDg3OCBdIHN1cHBvcnQgZm9yICVpbmxpbmUgeyAuLi4gfSAoUEFUQ0gpLgogICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAlaW5saW5lICV7IC4uLiAlfSBpcyB0aGF0IHRoZQogICAgICAgICAgICBlbmNsb3NlZCB0ZXh0IGlzIHByb2Nlc3NlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICAgVGhpcwogICAgICAgICAgICBhbGxvd3Mgc3BlY2lhbCBtYWNyb3MgYW5kIG90aGVyIHByb2Nlc3NpbmcgdG8gYmUgdXNlZCBpbiAKICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCAlaW5saW5lLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MzY5MDMgXSBDKysgaW5jb25zaXN0ZW5jeSAod2l0aCB2b2lkIGFyZ3VtZW50cykuCiAgICAgICAgICAgIFNXSUcgd2FzIGhhdmluZyBkaWZmaWN1bHR5IHdpdGggZigpIHZzIGYodm9pZCkgaW4gQysrIHByb2dyYW1zLgogICAgICAgICAgICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYodm9pZCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKCk7ICAgIC8vIE5vdCBtYXRjaGVkIHRvIGYodm9pZCkgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgIH07IAoKICAgICAgICAgICAgVGhlIHBhcnNlciBub3cgbm9ybWFsaXplcyBhbGwgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtIGYodm9pZCkgCiAgICAgICAgICAgIGluIEMrKyBjbGFzc2VzIHRvIGYoKS4gIFRoaXMgc2hvdWxkIGZpeCBhIHZhcmlldHkgb2Ygc3VidGxlIAogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlLCBvcHRpbWl6YXRpb25zLCBvdmVybG9hZGluZywgZXRjLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhcnRobyBCaG93bWljay4KIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSW5jb3Jwb3JhdGVkIFsgODQxMDc0IF0gYmV0dGVyIGNyb2FraW5nIChQQVRDSCkuICBUaGlzIGZpeGVzIHNvbWUgcHJvYmxlbXMKICAgICAgICAgICAgd2l0aCBzdHJpbmdzIGFuZCBwcm92aWRlcyBzb21lIG5ldyBlcnJvciBmdW5jdGlvbnMuIAogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KICAgICAgICAgICAgCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE4MzUgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggY2FzdDogdHh0ID0gKGNoYXIgKikidHh0IiBzeW50YXggRXJyb3IuCiAgICAgICAgICAgIFRoZSBwYXJzZXIgc2hvdWxkIG5vdyBhY2NlcHQgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqcyA9IChjaGFyICopICJIZWxsbyIpOwoKICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBDbGF1ZGl1cyBTY2hub3JyLgoKMTEvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBwcm9ibGVtIHdpdGggY3Jvc3MgbW9kdWxlIGxpbmtpbmcuICBQcmV2aW91c2x5IG1vZHVsZXMgcmVmZXJyZWQKICAgICAgICAgICAgdG8gYmFzZSBjbGFzc2VzIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUuICAgTm93LCB0aGUgbW9kdWxlIGxvb2tzIHVwIGJhc2UKICAgICAgICAgICAgY2xhc3NlcyB0aHJvdWdoIHRoZSB0eXBlIHN5c3RlbSBpdHNlbGYtLS1hdm9pZGluZyB0aGUgbmVlZCB0byBsaW5rIHRvIGEgZ2xvYmFsCiAgICAgICAgICAgIGxpa2UgYmVmb3JlLiAgQ2F2ZWF0OiAgbW9kdWxlcyB3aXRoIGJhc2UgY2xhc3NlcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgbW9kdWxlcyB3aXRoIGRlcml2ZWQgY2xhc3Nlcy4KIAoxMS8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHVzZSAoKSB0byByZXByZXNlbnQgbnVsbCBwb2ludGVycywKCSAgICBhcyBpdCBpcyBkb25lIGluIC1naCBtb2RlLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIEFkZCBhIGdlbmVyYXRlZCBzY3JpcHQgInByZWluc3Qtc3dpZyIsIHdoaWNoIGNhbiBiZSB1c2VkCgkgICAgdG8gaW52b2tlIFNXSUcgYmVmb3JlIGl0IGhhcyBiZWVuIGluc3RhbGxlZC4gIEl0IGFycmFuZ2VzCgkgICAgdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMgZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUKCSAgICB1c2VkLiAKCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2FsbCBTV0lHX0d1aWxlX0luaXQuCgkgICAgQWRkIGEgU1dJR19jb250cmFjdF9hc3NlcnQgbWFjcm8uCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBVcGRhdGUgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhlIGR5bmV4dCBvYmplY3QgdG8gd29yawoJICAgIHdpdGggTXpTY2hlbWUgMjA1LgoKMTEvMjAvMjAwMzogbW1hdHVzCgkgICAgRml4ZWQgdGhlIGluY2x1ZGUvaW1wb3J0IGVycm9yIHJlcG9ydGVkIGJ5IEtlcmltIEJvcmNoYWV2LAoJICAgIHdoZXJlIHR3byBmaWxlcyB3aXRoIG5hbWVzIGxpa2UKCgkgICAgJ2RpcjEvaGVsbG8uaScKCSAgICAnZGlyMi9oZWxsby5pJwoJICAgIAoJICAgIGNhbiBub3QgYmUgaW5jbHVkZSBhdCB0aGUgc2FtZSB0aW1lLiBTd2lnIHdhcyBpbmNsdWRpbmcKCSAgICBqdXN0IHRoZSBmaXJzdCBvbmUsIGFzc3VtaW5nIHRoZSBzZWNvbmQgb25lIHdhcyBub3QgYQoJICAgIGRpZmZlcmVudCBvbmUsIHNpbmNlIGl0IHdhcyBjaGVja2luZy9rZWVwaW5nIGp1c3QgdGhlCgkgICAgYmFzZW5hbWUgJ2hlbGxvLmknLgoKMTEvMTkvMjAwMzogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeSBzdXBwb3J0LiAKICAgICAgICAgICAgICAtICBUaGUgLWMgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIC1ub3J1bnRpbWUKICAgICAgICAgICAgICAtICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLXJ1bnRpbWUuICBXaGVuIHN1cHBsaWVkLCB0aGlzCiAgICAgICAgICAgICAgICAgaW5zZXJ0cyB0aGUgc3ltYm9sIFNXSUdfR0xPQkFMIGludG8gdGhlIHdyYXBwZXIgY29kZS4gIFRoaXMsCiAgICAgICAgICAgICAgICAgaW4gdHVybiwgbWFrZXMgYWxsIG9mIHRoZSBydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIGdsb2JhbGx5CiAgICAgICAgICAgICAgICAgdmlzaWJsZS4KICAgICAgICAgICAgICAgLSBOZXcgbGlicmFyeSBmaWxlOiBzd2lncnVuLmkuICAgVXNlZCB0byBjcmVhdGUgbW9kdWxlcwogICAgICAgICAgICAgICAgIGZvciBydW50aW1lIGxpYnJhcnkgKGlmIG5lZWRlZCkuCiAgICAKMTEvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgICdtYWtlIHNyY3JwbScgcnBtYnVpbGQgZml4IC0gcGF0Y2ggZnJvbSBKb2UgQ29vcGVyCgoxMS8xOC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBDaGFuZ2UgbWVhbmluZyBvZiBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1ndWlsZSB0bwoJICAgIHRoZSBuYW1lIG9mIHRoZSBHdWlsZSBleGVjdXRhYmxlLiAgVGhlIG5ldyBvcHRpb24gLS13aXRoLWd1aWxlLXByZWZpeCAKCSAgICBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0cmVlIHdoZXJlIEd1aWxlIGlzCgkgICAgaW5zdGFsbGVkLiAgKEhvd2V2ZXIsIHVzdWFsbHkgaXQgc3VmZmljZXMgdG8gdXNlIHRoZQoJICAgIHNpbmdsZSBvcHRpb24gLS13aXRoLWd1aWxlLWNvbmZpZy4pICAKCSAgICBXaGVuIHJ1bm5pbmcgdGhlIHJ1biB0ZXN0cyB0ZXN0LXN1aXRlLCBtYWtlIHN1cmUgdG8gdXNlIHRoZQoJICAgIHZlcnNpb24gb2YgR3VpbGUgdGhhdCBTV0lHIHdhcyBjb25maWd1cmVkIGZvci4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEltcHJvdmVtZW50cyB0byBvYmplY3Qtb3duZXJzaGlwIG1hbmFnZW1lbnQgaW4gCgkgICAgIi1zY20iIG1vZGUuICAoVGhleSBkbyBub3QgYXBwbHkgdG8gdGhlIGRlZmF1bHQgIi1naCIgbW9kZS4pCgkgICAgKiBSZW5hbWVkIHRoZSBzbW9iIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGNhbgoJICAgICAgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgZnJvbSAiY29sbGVjdGVkIHN3aWciIHRvICJjb2xsZWN0YWJsZQoJICAgICAgc3dpZyIsIHdoaWNoIGlzIG1vcmUgcHJlY2lzZS4gIAoJICAgICogRXhwb3J0IHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9ucyBhZ2Fpbi4gIEl0IGlzIG5vdwogCSAgICAgIGFsbG93ZWQgdG8gZXhwbGljaXRseSBjYWxsIGRlc3RydWN0b3JzLCBldmVuIGZvcgoJICAgICAgZ2FyYmFnZS1jb2xsZWN0ZWQgcG9pbnRlciBvYmplY3RzLiAgQSBwb2ludGVyIG9iamVjdAoJICAgICAgdGhhdCBoYXMgYmVlbiBwYXNzZWQgdG8gYSBkZXN0cnVjdG9yIGlzIG1hcmtlZCBpbiBhCgkgICAgICBzcGVjaWFsIHdheSB1c2luZyBhIG5ldyBzbW9iIHR5cGUsICJkZXN0cm95ZWQgc3dpZyIuCgkgICAgICAoVGhpcyBoZWxwcyBhdm9pZCBuYXN0eSBtZW1vcnkgYnVncywgd2hlcmUgcmVmZXJlbmNlcyB0bwoJICAgICAgZGVhZCBDIG9iamVjdHMgYXJlIHN0aWxsIGhlbGQgaW4gU2NoZW1lLiBNb3Jlb3ZlciwgdGhlCgkgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIG5vdCB0cnkgdG8gZnJlZSBhIGRlc3Ryb3llZAoJICAgICAgb2JqZWN0IG9uY2UgbW9yZS4pCgkgICAgKiBEZXN0cnVjdG9yLWxpa2UgZnVuY3Rpb25zIGNhbiBhbHNvIG1hcmsgdGhlaXIgYXJndW1lbnRzIAoJICAgICAgYXMgZGVzdHJveWVkIGJ5IGFwcGx5aW5nIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpERVNUUk9ZRUQuCgkgICAgICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJEZXN0cm95ZWQuKQoJICAgICogRnVuY3Rpb25zIHRoYXQgImNvbnN1bWUiIHRoZWlyIG9iamVjdHMgKG9yIHRoYXQgIm93biIKCSAgICAgIHRoZW0gYWZ0ZXIgdGhlIGNhbGwpIGNhbiBtYXJrIHRoZWlyIGFyZ3VtZW50cyBhcwoJICAgICAgbm90IGdhcmJhZ2UgY29sbGVjdGFibGUuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGFwcGx5aW5nCgkgICAgICB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqQ09OU1VNRUQuICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uCgkgICAgICBTV0lHX0d1aWxlX01hcmtQb2ludGVyTm9uY29sbGVjdGFibGUuKQoJICAgICogVGhlIG1hY3JvIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQgZnJvbSBsaWJyYXJ5CgkgICAgICBwb2ludGVyLWluLW91dC5pIGNyZWF0ZXMgYWRkaXRpb25hbCB0eXBlbWFwcyAKCSAgICAgIFBUUlRZUEUgKklOUFVUX0NPTlNVTUVELCBQVFJUWVBFICpJTlBVVF9ERVNUUk9ZRUQuCgkgICAgICBUaGV5IG1hcmsgdGhlIHBhc3NlZCBwb2ludGVyIG9iamVjdCBsaWtld2lzZS4KCSAgICAgIFRoZSB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVCBjcmVhdGVzIGEgZ2FyYmFnZS1jb2xsZWN0YWJsZQoJICAgICAgcG9pbnRlciBvYmplY3QsIGxpa2UgJW5ld29iamVjdCBkb2VzIGZvciBhIHJldHVybmVkIAoJICAgICAgcG9pbnRlci4gIFVzZSB0aGUgbmV3IHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUX05PTkNPTExFQ1RBQkxFCgkgICAgICB0byBjcmVhdGUgYSBwb2ludGVyIG9iamVjdCB0aGF0IHdpbGwgbm90IGJlIGdhcmJhZ2UgY29sbGVjdGVkLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSGFuZGxlICRpbnB1dCBpbiAiZnJlZWFyZyIgdHlwZW1hcHMuCgkgICAgTmV2ZXIgcXVhbGlmeSBHT09QUyBzbG90IG5hbWVzIHdpdGggdGhlIGNsYXNzIG5hbWUuIAoJICAgIEhhbmRsZSBvcHRpb25hbCBhcmd1bWVudHMgcHJvcGVybHkgaW4gdGhlIEdPT1BTIG1ldGhvZHMuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIGluc3RhbGxhdGlvbiB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIEF1dG9tYWtlLTEuOC4KICAgICAgICAgICAgbWtpbnN0YWxsZGlycyB3YXMgYmVpbmcgdXNlZCBieSBhIG5vbi1BdXRvbWFrZSBtYWtlZmlsZS4gCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgaXMgYmVpbmcgcGhhc2VkIG91dCBhbmQgc28gd2FzIG5vdCBiZWluZwogICAgICAgICAgICBjcmVhdGVkIGJ5IEF1dG9tYWtlLiBpbnN0YWxsLXNoIHVzZWQgaW5zdGVhZC4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgaW1wcm92ZW1lbnRzLCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcyBzaW5jZSAKICAgICAgICAgICAgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiAlZmVhdHVyZSgic2hhZG93IikgaXMgdXNlZCB0byBhZGQgY29kZSB0byBzaGFkb3cKICAgICAgICAgICAgY2xhc3NlcywgdGhlIHNwZWNpYWwgdmFyaWFibGUgJGFjdGlvbiBleHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICB1bmRlcmx5aW5nIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkIG5vcm1hbGx5LgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuIGdlbmVyYXRpbmcgcHJveHkgY2xhc3MgY29kZSwgU1dJRyBlbWl0cyBhIGZldwogICAgICAgICAgICBkZWZhdWx0IG1ldGhvZHMgZm9yIF9fcmVwcl9fKCkgYW5kIG90aGVyIFB5dGhvbiBzcGVjaWFsCiAgICAgICAgICAgIG1ldGhvZHMuICBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgYWZ0ZXIgYWxsIG9mIHRoZQogICAgICAgICAgICBjb250ZW50cyBvZiBhIGNsYXNzLiBIb3dldmVyLCB0aGlzIG1ha2VzIGl0IGhhcmQgdG8gb3ZlcnJpZGUKICAgICAgICAgICAgdGhlIG1ldGhvZHMgdXNpbmcgJXB5dGhvbmNvZGUgYW5kIHNvbWUgb3RoZXIgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICAgIGFsbG93IGNvZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIGNsYXNzLiAgVGhlc2Ugc3BlY2lhbCBtZXRob2RzCiAgICAgICAgICAgIGFyZSBub3cgZW1pdHRlZCBpbnRvIHRoZSBjb2RlICpiZWZvcmUqIGFsbCBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEVyaWMgSm9uZXMuCiAKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBQcmVwcm9jZXNzb3IgZW5oYW5jZW1lbnQuICAgRm9yIGluY2x1ZGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAlaW5jbHVkZSAiZm9vL2Jhci5pIgoKICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSAiZm9vIiBpcyBub3cgYWRkZWQgdG8gdGhlIHNlYXJjaCBwYXRoIHdoaWxlIAogICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBiYXIuaS4gIFRodXMsIGlmIGJhci5pIGluY2x1ZGVzIG90aGVyCiAgICAgICAgICAgIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdGhleSB3aWxsIGJlIGZvdW5kLiBQcmV2aW91c2x5LAogICAgICAgICAgICB5b3Ugd291bGQgaGF2ZSB0byBhZGQgYWRkaXRpb25hbCBkaXJlY3RvcmllcyB1c2luZyAtSSB0byBtYWtlIHRoaXMKICAgICAgICAgICAgd29yayBjb3JyZWN0bHkuICBOb3RlOiB0aGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gYmVoYXZlIGluCiAgICAgICAgICAgIGFuIGlkZW50aWNhbCBtYW5uZXIgb24gbWFueSAobW9zdD8gYWxsPykgc3lzdGVtcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtlcmltIEJvcmNoYWV2LgoKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgb24gTWFjIE9TIFggMTAuMy54IChQYW50aGVyKS4KICAgICAgICAgICAgVGVzdGVkIHdpdGggUHl0aG9uLCBUY2wsIFBlcmwsIGFuZCBSdWJ5LS0tYWxsIG9mIHdoaWNoIHNlZW0gdG8gd29yay4KCjExLzA4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgdGhlIHR5cGVtYXBzIGluIHZhcmlvdXMuaSB3aGljaCB3ZXJlIG1vc3RseSBicm9rZW4uCiAgICAgICAgICAgIGNoYXIgKipTVFJJTkdfSU4gYW5kIGNoYXIgKipTVFJJTkdfUkVUIHR5cGVtYXBzIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIFNUUklOR19BUlJBWS4gZmxvYXQgKkZMT0FUX0FSUkFZX1JFVFVSTiB0eXBlbWFwIHJlbW92ZWQuCgoxMS8wOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIFRjbCBtb2R1bGUgbm93IGVtaXRzIGEgc2FmZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkKICAgICAgICAgICAgZGVmYXVsdC4gIEl0IGNhbiBiZSByZW1vdmVkIGJ5IHJ1bm5pbmcgJ3N3aWcgLW5vc2FmZScuCgoxMS8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBPbmx5IHVzZSB0aGUgU0NNXyBBUEkgd2hlbiB0aGUgZnVuY3Rpb24KCSAgICBgc2NtX3Nsb3RfZXhpc3RzX3AnIGV4aXN0cyAobmVlZGVkIGZvciBHT09QUyBzdXBwb3J0KS4gIAoJICAgIFRoaXMgZnVuY3Rpb24gd2FzIHJlbmFtZWQgZHVyaW5nIHRoZSBHdWlsZSAxLjUgc2VyaWVzCgkgICAgZnJvbSBgc2NtX3Nsb3RzX2V4aXN0c19wJy4KCSAgICBSZXBvcnQgdGhlIHJpZ2h0IHJ1bnRpbWUgbGlicmFyeSB3aGVuIGludm9rZWQgd2l0aAoJICAgIC1zY20gLWxkZmxhZ3MuCgoxMS8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEZpeCAjNzgyMDUyLiAgVGhlIC0td2l0aC1jaGlja2VuY2ZnIGNvbmZpZ3VyZQoJICAgIG9wdGlvbiAoYW5kIG90aGVycykgd2VyZSBub3QgYWNjZXB0ZWQuCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBNZXJnZSBuZXcgc2V0IG9mIEdPT1BTIGNoYW5nZXMgYnkgSm9obiBMZW56LgoJICAgIEdPT1BTIG9iamVjdHMgYXJlIG5vdyBtYW5pcHVsYXRlZCBkaXJlY3RseSBieSB0aGUgQyBjb2RlLgoJICAgIFNvbWUgZml4ZXMgdG8gdHlwZW1hcC1HT09QUyBpbnRlcmFjdGlvbi4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlbW92ZSB0aGUgZmlsZSBhcmd1bWVudCB0byAtc2Ntc3R1YiBhbmQgLWdvb3BzLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBhbHdheXMgY2FsbGVkIE1PRFVMRS5zY20gb3IKCSAgICBNT0RVTEUtcHJpbWl0aXZlLnNjbSwgd2hlcmUgTU9EVUxFIGlzIHRoZSBtb2R1bGUgbmFtZSBhbmQgCgkgICAgInByaW1pdGl2ZSIgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIC1wcmltc3VmZml4IG9wdGlvbi4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkKCSAgICB0aGUgLW91dGRpciBvcHRpb24sIG9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCSAgICAoUGF0Y2ggYnkgSm9obiBMZW56LCBzbGlnaHRseSBtb2RpZmllZC4pCgoJICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW0d1aWxlXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBVbmlmeSB0aGUgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLiAgVGhlIHN0YW5kYXJkCgkgICAgZnVuY3Rpb25zIGFyZToKCSAgICAgKiBTV0lHX05ld1BvaW50ZXJPYmogKFBPSU5URVIsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBDcmVhdGUgYW4gc2NyaXB0aW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0eXBlZAoJCSAgIHBvaW50ZXIuIEZMQUdTIGFyZSBsYW5ndWFnZSBzcGVjaWZpYy4KCSAgICAgKiBTV0lHX0NvbnZlcnRQdHIgKElOUFVULCBSRVNVTFQsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgc3RvcmUgaXQgaW4gdGhlIHBsYWNlIFJFU1VMVC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIAoJCSAgIG9jY3VycywgcmV0dXJuIG5vbnplcm8uCgkgICAgICogU1dJR19NdXN0R2V0UHRyIChJTlBVVCwgVFlQRSwgQVJHTlVNLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHJldHVybiBpdC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIG9jY3VycywgdGhyb3cgYW4KCQkgICBleGNlcHRpb24uICBJZiBBUkdOVU0gPiAwLCByZXBvcnQgaXQgYXMgdGhlIAoJCSAgIGFyZ3VtZW50IG51bWJlciB0aGF0IGhhcyB0aGUgdHlwZSBtaXNtYXRjaC4KICAgICAgICAgICAgW0d1aWxlXTogICAgTm8gY2hhbmdlcy4KCSAgICBbTXpTY2hlbWVdOiBObyBjaGFuZ2VzLgoJICAgIFtQZXJsXTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqLgoJCSAgICAgICAgVGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciBpcyBrZXB0LgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSBub3QKCQkJc3VwcG9ydGVkLgoJICAgIFtQeXRob25dOiAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtSdWJ5XTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtUY2xdOiAgICAgIFJlbW92ZSB0aGUgImludGVycCIgYXJndW1lbnQgb2YKCQkgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmosIFNXSUdfQ29udmVydFB0ciwKCQkgICAgICAgIFNXSUdfQ29udmVydFBhY2tlZCwgYW5kIFNXSUdfQ29udmVydFB0ckZyb21TdHJpbmcuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IAoJCQlub3Qgc3VwcG9ydGVkLgoJICAgIE5vIGNoYW5nZXMgdG8gUGlrZSBiZWNhdXNlIGl0cyBwb2ludGVyIGNvbnZlcnNpb24gY29kZSBkaWQKCSAgICBub3QgbG9vayBjb21wbGV0ZS4gIE5vIGNoYW5nZXMgdG8gUEhQNCwgYmVjYXVzZSBJIGRpZCBub3QKCSAgICB1bmRlcnN0YW5kIGl0cyBydW50aW1lIGNvZGUuICBObyBjaGFuZ2VzIHRvIENoaWNrZW4KCSAgICBiZWNhdXNlIG1ham9yIGNoYW5nZXMgYXJlIGV4cGVjdGVkIHNvb24gYW55d2F5LiAgTm8KCSAgICBjaGFuZ2VzIHRvIEphdmEsIE9DYW1sLCBDIyBiZWNhdXNlIHRoZXkgZG8gbm90IHNlZW0gdG8KCSAgICBoYXZlIGEgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLgoKICAgICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSBbVGNsXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbUGVybDUsIFBIUDQsIFBpa2UsIFB5dGhvbiwgUnVieSwgVGNsXTogVXNlIHRoZQoJICAgIHByZXByb2Nlc3NvciB0byByZW5hbWUgZXh0ZXJuYWwgZnVuY3Rpb25zIG9mIHRoZSBTV0lHCgkgICAgcnVudGltZSBBUEkgdG8gZm9sbG93IHRoZSBuYW1pbmcgY29udmVudGlvbgoJICAgIFNXSUdfPGxhbmd1YWdlPl88ZnVuY3Rpb24+LiAgVGhpcyBzaG91bGQgYWxsb3cgbGlua2luZwoJICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJwcmV0ZXIgaW50byBhIHByb2dyYW0uCgoxMC8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggc2luY2UgaW50cm9kdWNpbmcgdGhlIGV4Y2VwdGlvbiBhbmQgc3RkOjpzdHJpbmcgZGVsZWdhdGVzLgogICAgICAgICAgICBUaGUgZml4IG92ZXJjb21lcyBsaW5rZXIgZXJyb3JzIHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZSBTV0lHIG1vZHVsZS4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBBbmRyZWFzIFNjaPZyay4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyMzMwMiBdIEluY3IgVGNsIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEFsZXhleSBEeWFjaGVua28uCiAgICAgICAgICAgIE5vdGU6IG5lZWRzIGRvY3VtZW50YXRpb24uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMjUgXSBuZXcgUHl0aG9uIE1vZHVsZSBvcHRpb25zIGFuZCBmZWF0dXJlcy4KICAgICAgICAgICAgUm9iaW4gRHVubiB3cml0ZXM6CgogICAgICAgICAgICBUaGlzIHBhdGNoIG1ha2VzIGEgbnVtYmVyIG9mIGNoYW5nZXMgdG8gdGhlIFNXSUcgcHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAgIDEuIEFkZCAtYXBwbHkgb3B0aW9uLCBhbmQgY2hhbmdlIHRoZSBkZWZhdWx0IGNvZGUKICAgICAgICAgICAgb3V0cHV0IHRvIHVzZSB0aGUgZm9vKCphcmdzLCAqKmt3KSBjYWxsaW5nIHN5bnRheAogICAgICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwcGx5KCkuIElmIHRoZSAtYXBwbHkgb3B0aW9uIGlzCiAgICAgICAgICAgIGdpdmVuIHRoZW4gY29kZSBpcyBnZW5lcmF0ZWQgYXMgYmVmb3JlLiBUaGlzIGlzIHZlcnkKICAgICAgICAgICAgc2ltaWxhciB0byBQYXRjaCAjNzM3MjgxIGJ1dCB0aGUgbmV3IC1tb2Rlcm4gb3B0aW9uCiAgICAgICAgICAgIG1ha2VzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGF0IHBhdGNoIHVubmVjZXNzYXJ5IHNvIGl0CiAgICAgICAgICAgIGlzIG5vdCBpbmNsdWRlZCBoZXJlLgoJICAgIAogICAgICAgICAgICAyLiBBZGQgLW5ld19yZXByIG9wdGlvbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBteSBQYXRjaAogICAgICAgICAgICAjNzk3MDAyIHdoaWNoIEkgd2lsbCBtYXJrIGFzIGNsb3NlZCBzaW5jZSBpdCBpcyBubwogICAgICAgICAgICBsb25nZXIgbmVlZGVkLiBXaGVuIHRoaXMgbmV3IG9wdGlvbiBpcyB1c2VkIHRoZW4gdGhlCiAgICAgICAgICAgIF9fcmVwcl9fIG1ldGhvZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIHdpbGwgYmUgbW9yZSBpbmZvcm1hdGl2ZSBhbmQgZ2l2ZSBkZXRhaWxzIGFib3V0IHRoZQogICAgICAgICAgICBweXRob24gY2xhc3MgYW5kIHRoZSBDKysgY2xhc3MuCgkgICAgCiAgICAgICAgICAgIDMuIEFkZCAlZmVhdHVyZSgiYWRkdG9mdW5jIikuIEl0IGFsbG93cyB5b3UgdG8gaW5zZXJ0CiAgICAgICAgICAgIG9uZSBvciBtb3JlIGxpbmVzIG9mIGNvZGUgaW5zaWRlIHRoZSBzaGFkb3cgbWV0aG9kIG9yCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgaXMgYWxyZWFkeSBnZW5lcmF0ZWQsIGluc3RlYWQgb2YKICAgICAgICAgICAgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyBsaWtlICVmZWF0dXJlKCJzaGFkb3ciKSBkb2VzLgogICAgICAgICAgICBGb3IgX19pbml0X18gaXQgZ29lcyBhdCB0aGUgZW5kLCBmb3IgX19kZWxfXyBpdCBnb2VzCiAgICAgICAgICAgIGF0IHRoZSBiZWdpbmluZyBhbmQgZm9yIGFsbCBvdGhlcnMgdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICAgIGlzIGV4cGFuZGVkIG91dCB0byBiZSBsaWtlCgkgICAgCiAgICAgICAgICAgIGRlZiBCYXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgdmFsID0gX21vZHVsZS5Gb29fQmFyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgcmV0dXJuIHZhbAoJICAgIAogICAgICAgICAgICBhbmQgdGhlICJhZGR0b2Z1bmMiIGNvZGUgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgdGhlCiAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCB1c2VkIGZvciBhCiAgICAgICAgICAgIHBhcnRpY3VsYXIgbWV0aG9kIG9yIGZ1bmN0aW9uIHRoZW4gdGhlIHNob3J0ZXIgY29kZSBpcwogICAgICAgICAgICBnZW5lcmF0ZWQganVzdCBsaWtlIGJlZm9yZS4KCSAgICAKICAgICAgICAgICAgNC4gQSBsaXR0bGUgYml0IG9mIHJlZmFjdG9yaW5nIHRvIG1ha2UgaW1wbGVtZW50aW5nCiAgICAgICAgICAgIGFkZHRvZnVuYyBhIGxpdHRsZSBlYXNpZXIuCgkgICAgCiAgICAgICAgICAgIDUuIEFkZGVkIGEgLW1vZGVybiBjb21tYW5kLWxpbmUgZmxhZyB0aGF0IHdpbGwgY2F1c2UKICAgICAgICAgICAgU1dJRyB0byBvbWl0IHRoZSBjcnVmdCBpbiB0aGUgcHJveHkgbW9kdWxlcyB0aGF0IGFsbG93cwogICAgICAgICAgICBpdCB0byB3b3JrIHdpdGggdmVyc2lvbnMgb2YgUHl0aG9uIHByaW9yIHRvIDIuMi4gVGhlCiAgICAgICAgICAgIHJlc3VsdCBpcyBhIHNpbXBsZXIsIGNsZWFuZXIgYW5kIGZhc3RlciBweXRob24gcHJveHkKICAgICAgICAgICAgbW9kdWxlLCBidXQgb25lIHRoYXQgcmVxdWlyZXMgUHl0aG9uIDIuMiBvciBncmVhdGVyLiAKCjEwLzMxLzIwMDM6IGJlYXpsZXkgCiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTkgXSBYTUwgbW9kdWxlIHR3ZWFrcy4KICAgICAgICAgICAgVGhpcyBhZGRzIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLXhtbGxpdGUgdGhhdCAKICAgICAgICAgICAgZ3JlYXRseSByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZW1pdHRlZCBYTUwgY29kZSBieQogICAgICAgICAgICBlbGltaW5hdGluZyBzb21lIGZpZWxkcyBtb3N0bHkgdXNlZCBpbiBTV0lHJ3MKICAgICAgICAgICAgaW50ZXJuYWwgcHJvY2Vzc2luZy4gIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTcgXSBBZGRzIERvaFNwbGl0TGluZXMgZnVuY3Rpb24uCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI3OTA3IF0gYXJnb3V0IG9iamVjdHMgbm90IGJlaW5nIHdyYXBwZWQgcHJvcGVybHkgKFBBVEgpLgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCSAgICAgCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MjY5OTYgXSBwZXJsIHR5cGUgY2hlY2tpbmcgaWdub3JlcyBwZXJsIHN1YmNsYXNzZXMuCiAgICAgICAgICAgIFRoaXMgZW5oYW5jZW1lbnQgbWFrZXMgaXQgc28gd3JhcHBlZCBjbGFzc2VzIGFuZCBzdHJ1Y3RzIGNhbgogICAgICAgICAgICBiZSBzdWJjbGFzc2VkIGluIFBlcmwgYW5kIHVzZWQgbm9ybWFsbHkuIAogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCjEwLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEludFB0ciBtYXJzaGFsbGVkIHdpdGggYSB2b2lkKiBpbnN0ZWFkIG9mIGludCBpbiBDIGZ1bmN0aW9uIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMuIFRoZSBjYXN0cyB0aHVzIGxvb2sgbW9yZSBjb252ZW50aW9uYWwsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIC8vIG9sZAogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3goaW50IGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9ICooU2hhcGUgKiopJmphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIG5ldwogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3godm9pZCAqIGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9IChTaGFwZSAqKWphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgoxMC8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIHNtYXJ0IHBvaW50ZXJzLgogICAgICAgICAgICBJZiBhIGNsYXNzIGhhcyBvdmVybG9hZGVkIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQgeCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCB4LCBpbnQgeSk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFuZCB0aGUgY2xhc3MgaXMgdXNlZCBhcyBhIHNtYXJ0IHBvaW50ZXI6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vUHRyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIFNXSUcgd291bGQgdHJ5IHRvIGV4cG9zZSB0aGUgc3RhdGljIG1lbWJlciBGb286OmJhcgogICAgICAgICAgICB0aHJvdWdoIEZvb1B0ci0tLXJlc3VsdGluZyBib2d1cyB3cmFwcGVyIGNvZGUgYW5kIGEgY29tcGlsZXIKICAgICAgICAgICAgZXJyb3IuCgogICAgICAgICAgICBEdWUgdG8gdGhlIHdheSBpbiB3aGljaCBvdmVybG9hZGluZyBpcyBoYW5kbGVkLCBpdCBpcwogICAgICAgICAgICBleHRyZW1lbHkgZGlmZmljdWx0IHRvIGVsaW1pbmF0ZSB0aGUgc3RhdGljIG1ldGhvZCBpbgogICAgICAgICAgICB0aGlzIGNhc2UuICBUaGVyZWZvcmUsIGl0IGlzIHN0aWxsIGV4cG9zZWQuICBIb3dldmVyLAogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgbm93IGNvbXBpbGVzIGFuZCB3b3Jrcy4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGUsIE16U2NoZW1lLCBDaGlja2VuXTogUmVtb3ZlIHN5bWJvbCBjbGFzaGVzIGJldHdlZW4KCSAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYnkgcmVuYW1pbmcgYWxsIGV4dGVybiBjb21tb24uc3dnCgkgICAgZnVuY3Rpb25zIHdpdGggdGhlIHByZXByb2Nlc3Nvci4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIGJhc2ljIEdPT1BTIHN1cHBvcnQsIGNvbnRyaWJ1dGVkIGJ5IEpvaG4gTGVuei4KCSAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCgkgICAgCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE5ldyBvcHRpb24sIC1vbmx5LXNldHRlcnMsIHdoaWNoIGRpc2FibGVzCgkgICAgdHJhZGl0aW9uYWwgZ2V0dGVyIGFuZCBzZXR0ZXIgcHJvY2VkdXJlcyBmb3Igc3RydWN0dXJlIHNsb3RzLgoKMTAvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgcnVuIHRlc3QgZm9yIHJlZmVyZW5jZV9nbG9iYWxfdmFycyBieSBKb2huIExlbnouCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFBhcnRpYWwgc29sdXRpb24gdG8gWyA3OTIxODAgXSBDKysgc21hcnQtcG9pbnRlci9uYW1lc3BhY2UgbWl4dXAgcmV2aXNpdGVkLgogICAgICAgICAgICBUaGUgcHJvYmxlbSBpcyBub3QgZWFzeSB0byBmaXggKGF0IGxlYXN0IGl0IGRvZXNuJ3Qgc2VlbSBzbyksIGJ1dCBpcwogICAgICAgICAgICByZWxhdGVkIHRvIHRoZSBpbnN0YW50aWF0aW9uIG9mIHF1YWxpZmllZCB0ZW1wbGF0ZXMgaW5zaWRlIG9mIG90aGVyCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICAgU1dJRyBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlIHJhdGhlcgogICAgICAgICAgICB0aGFuIGdlbmVyYXRpbmcgYnJva2VuIHdyYXBwZXJzLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgwMDAxMiBdIEVOVEVSIG1hY3JvIGZyb20gQ09SRS9zY29wZS5oIGNsYXNoZXMgd2l0aCBsaWJjIHNlYXJjaC5oLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTE1MTggXSBDYXN0aW5nIGludHMgdG8gZG91YmxlcyAody8gc29sdXRpb24/KQogICAgICAgICAgICBBZGRyZXNzZXMgYSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRpbmcgaW4gdGhlIFBlcmwgbW9kdWxlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgRGFsbGV5LgoKMDkvMjgvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZSB3aXRoIC1zY20gb3B0aW9uXSBGaXggdHlwbyBpbiBnZW5lcmF0ZWQgY29kZSBmb3IKCSAgICBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycy4gIFJlcG9ydGVkIGJ5IEpvaG4gTGVuei4KCjA5LzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTI1MjggXSBleHRlcm5zIG5vdCBjb3JyZWN0IHdoZW4gdGhyb3cgaXMgaW4gc2lnbmF0dXJlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KICAgICAgICAgICAgCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTV0lHIHdhcyBnZW5lcmF0aW5nIGEgbnVtYmVyIG9mIHN5bWJvbHMgdGhhdCBkaWRuJ3QgY29tcGx5IHdpdGggCiAgICAgICAgICAgIHRoZSBJU08gQy9DKysgc3RhbmRhcmQsIGluIHBhcnRpY3VsYXIgSVNPL0lFQyAxNDg4MjoxOTk4KEUpIDE3LjQuMy4xLjIKICAgICAgICAgICAgd2hlcmUgZG91YmxlIHVuZGVyc2NvcmVzIGFyZSBmb3JiaWRkZW4gYXMgd2VsbCBhcyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGgKICAgICAgICAgICAgYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhbiB1cHBlciBjYXNlIGxldHRlci4gTW9zdCBvZiB0aGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcm9vdGVkIG91dC4gU2VlIG5ldyBzZWN0aW9uIGFkZGVkIHRvIGludGVybmFscy5odG1sIGRldmVsb3BtZW50CiAgICAgICAgICAgIG1hbnVhbCAnU3ltYm9sIE5hbWluZyBHdWlkZWxpbmVzIGZvciBHZW5lcmF0ZWQgQy9DKysgQ29kZScuCgowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGlyZWN0b3IgdHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGludiAgICAgPT4gZGlyZWN0b3JpbgogICAgICAgICAgICBvdXR2ICAgID0+IGRpcmVjdG9yb3V0CiAgICAgICAgICAgIGFyZ291dHYgPT4gZGlyZWN0b3JhcmdvdXQKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMTkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgY29uc3RydWN0b3JzIG5vdyBkZWZhdWx0IHRvIF9fZGlzb3duID0gMCwgCgkgICAgd2hpY2ggaXMgdGhlIGludGVuZGVkIGJlaGF2aW9yIGFuZCBmaXhlcyB0aGUgZGlyZWN0b3JfZmluYWxpemVyIAoJICAgIHRlc3QgY2FzZSB1bmRlciBweXRob24uCgowOS8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSAtIFR5cGVtYXBzIGFkZGVkIGZvciBzdGQ6OnN0cmluZyBhbmQgY29uc3Qgc3RkOjpzdHJpbmcgJi4KICAgICAgICAgICAgICAgICAtIE5ldyBkZWxlZ2F0ZSBmb3IgY3JlYXRpbmcgYSBDIyBzdHJpbmcgZ2l2ZW4gYSBjaGFyICouIEl0CiAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBieSBjYWxsaW5nIFNXSUdfY3NoYXJwX3N0cmluZ19jYWxsYmFjayBhcyBzaG93bgogICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0ZDo6c3RyaW5nICdvdXQnIHR5cGVtYXAuIFVzZWZ1bCBpZiB0aGUgcmV0dXJuIHR5cGUgaXMKICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhIEMjIHN0cmluZyBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgCiAgICAgICAgICAgICAgICAgICBmb3IgY2xlYW5pbmcgdXAgbWVtb3J5IGFzIHRoZSBDIyBnYXJiYWdlIGNvbGxlY3RvciBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSBtZW1vcnkgY3JlYXRlZCBpbiBDL0MrKyBhbmQgdGhlbiByZXR1cm5lZCBhcyBhIEMjIHN0cmluZy4KICAgICAgICAgICAgICAgICAtIFRoZSBleGNlcHRpb24gZGVsZWdhdGVzIGhhdmUgbW92ZWQgaW50byBhbiBpbm5lciBjbGFzcyBpbiB0aGUKICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBjbGFzcywgdGhlcmVieSBmcmVlaW5nIHVwIHRoZSBzdGF0aWMgY29uc3RydWN0b3IuCgowOS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIChJbnRlcm5hbHMpCiAgICAgICAgICAgIE1ham9yIHJlZmFjdG9yaW5nIG9mIGl0ZXJhdGlvbiBvdmVyIGxpc3RzIGFuZCBoYXNoZXMuICBUaGUKICAgICAgICAgICAgRE9IIGxpYnJhcnkgbm93IHVzZXMgaXRlcmF0b3JzLiAgVGhleSB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBMaXN0ICpsID0gKHNvbWUgbGlzdCk7CgogICAgICAgICAgICAgICAgSXRlcmF0b3IgaTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGNvbnRhaW5zIHRoZSBhY3R1YWwgbGlzdCBpdGVtLgogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBpcyBOVUxMIGF0IGVuZCBvZiBsaXN0CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSGFzaCAqaCA9IChzb21lIGhhc2gpOwogICAgICAgICAgICAgICAgSXRlcmF0b3IgajsKICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGgpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gai5pdGVtIGNvbnRhaW5zIGhhc2ggdGFibGUgaXRlbQogICAgICAgICAgICAgICAgICAgIC8vIGoua2V5ICBjb250YWlucyBoYXNoIHRhYmxlIGtleQogICAgICAgICAgICAgICAgICAgIC8vIEJvdGggai5pdGVtIGFuZCBqLmtleSBhcmUgTlVMTCBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBUaGUgb2xkIGl0ZXJhdGlvbiBmdW5jdGlvbnMgRmlyc3RpdGVtKCksIE5leHRpdGVtKCksIEZpcnN0a2V5KCksCiAgICAgICAgICAgIGFuZCBOZXh0a2V5KCkgYXJlIGdvbmUuICAKCiAgICAgICAgICAgIFRoZSBuZXcgaXRlcmF0b3JzIGFyZSBzaW1wbGVyLCByZXN1bHQgaW4gYmV0dGVyIG1lbW9yeSB1c2UsCiAgICAgICAgICAgIGFuZCBtYXkgYmUgZmFzdGVyLiAgQWxzbywgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgcHJvYmxlbXMKICAgICAgICAgICAgaXRlcmF0aW5nIG92ZXIgdGhlIHNhbWUgbGlzdC9oYXNoIGluIG11bHRpcGxlIHBsYWNlcyBhdAogICAgICAgICAgICB0aGUgc2FtZSB0aW1lLiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgZmluZToKCiAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSxqOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QobCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoVGhpcyBuZXZlciB3b3JrZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMpLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgCiAgICAgICAgICAgIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgdG8gU1dJRyAob3IgZ2l2ZSB0aGVtIGZ1cnRoZXIgZW5jb3VyYWdlbWVudAogICAgICAgICAgICB0byBqb2luIHRoZSBTV0lHIENWUy10cmVlIDotKS4KCjA5LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBtZW1vcnkgbGVha3MgaW4gdGhlICJsaXN0LXZlY3Rvci5pIiB0eXBlbWFwcy4KCjA5LzA5LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gVXNlIENfbWtfYm9vbCByYXRoZXIgdGhhbiBDX21rYm9vbC4gIFRoaXMgZml4ZXMKCSAgICB0aGUgd3JhcHBpbmcgb2YgYm9vbGVhbiB2YWx1ZXMgZm9yIENoaWNrZW4gMS4xMCBhbmQgbmV3ZXIuCgkgICAgUmVwb3J0ZWQgYnkgRGF2ZSA8aHVuZG9AeWFob28uY29tPiAvIEZlbGl4IFdpbmtlbG1hbm4KCSAgICA8ZmVsaXhAcHJveGltYS1tdC5kZT4uCgowOS8wNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9ycyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gSW4gc3VtbWFyeSB0aGlzIGlzIGEgYmlnIG5ldyBmZWF0dXJlIAogICAgICAgICAgICB3aGljaCBzdXBwb3J0cyB1cGNhbGxzIGZyb20gQysrIHRvIEphdmEuIENvZGUgaXMgZ2VuZXJhdGVkIHRvIHN1cHBvcnQgQysrIAogICAgICAgICAgICBjYWxsYmFja3MgdG8gY2FsbCBpbnRvIEphdmEgYW5kIHRydWUgcG9seW1vcnBoaWMgYmVoYXZpb3VyIGZvciBKYXZhIGNsYXNzZXMgCiAgICAgICAgICAgIGRlcml2ZWQgZnJvbSBDKysgY2xhc3Nlcy4gU2VlIGphdmEuaHRtbCBmb3IgZGV0YWlscy4gQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KCjA5LzA1LzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIENyZWF0ZWQgY29udHJhY3QgZXhhbXBsZSBkaXJlY3RvcnkgYXQgL1NXSUcvRXhhbXBsZXMvY29udHJhY3QKICAgICAgICAgICAgQWRkZWQgc2ltcGxlIGNvbnRyYWN0IGV4YW1wbGVzIChzaW1wbGVfYyAmIHNpbXBsZV9jeHgpCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IG1vZHVsZSdzIG91dHB1dCBmb3JtYXQKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUZXN0LXN1aXRlIGJ1aWxkIGltcHJvdmVtZW50czoKICAgICAgICAgICAgLSBNdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyB3b3JraW5nIGZvciB0aGUgdGVzdCBzdWl0ZSwgc28gaXQgaXMgbm93CiAgICAgICAgICAgICAgcG9zc2libGUgdG8gcnVuIGNvbmZpZ3VyZSBpbiBtdWx0aXBsZSBzdWJkaXJlY3RvcmllcyBhbmQgcnVuIHRoZSB0ZXN0CiAgICAgICAgICAgICAgc3VpdGUgaW4gZWFjaCBvZiB0aGVzZSBzdWIgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gJ21ha2UgZGlzdGNsZWFuJyBmaXhlZCBzbyBpdCBkb2Vzbid0IGJvbWIgb3V0IG9uIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkKICAgICAgICAgICAgICB3aGVuIHVzaW5nIG11bHRpcGxlIHN1YmRpcmV0b3J5IGJ1aWxkcy4gUmVxdWlyZWQgdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcwogICAgICAgICAgICAgIHRvIGJlIG1vdmVkOgogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QZXJsIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGVybDUKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGhwICAtPiBFeGFtcGxlcy9HSUZQbG90L1BocDQKICAgICAgICAgICAgICBUaGVzZSBuZXcgZGlyZWN0b3JpZXMgdXNlZCB0byBiZSBzeW1ib2xpYyBsaW5rcyB0byB0aGUgb2xkIGRpcmVjdG9yeS4KICAgICAgICAgICAgICBBbHNvIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL1Blcmwgc3ltYm9saWMgbGluayBoYXMgYmVlbiByZW1vdmVkLgogICAgICAgICAgICAtIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIG90aGVyIHRoYW4gZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnksIHNheQogICAgICAgICAgICAgIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvcHl0aG9uIHdpbGwgbm93IGRpc3BsYXkgYWxsIHRoZSBjb2RlIGJlaW5nCiAgICAgICAgICAgICAgZXhlY3V0ZWQuCiAgICAgICAgICAgIC0gVGhlIGZvbGxvd2luZyAzIEMjIGNvbXBpbGVycyBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSBhbmQgd29yayB3aXRoIAogICAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlOiBNb25vLCBQb3J0YWJsZS5ORVQgYW5kIE1pY3Jvc29mdC4KCjA5LzAxLzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIEFkZGVkIGluaGVyaXRhbmNlIHN1cHBvcnQgZm9yIGRlc2lnbiBieSBjb250cmFjdCBmZWF0dXJlLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NDkxNCBdIFdyb25nIHR5cGVzIGluIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBTV0lHIHdhcyBub3QgaGFuZGxpbmcgYXJndW1lbnRzIGNvcnJlY3RseSBpbiB0ZW1wbGF0ZSAKICAgICAgICAgICAgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbzxUICo+IHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBUICpibGFoKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29JbnQpIEZvbzxpbnQgKj47CgogICAgICAgICAgICBpbiB0aGlzIGNsYXNzLCB0aGUgcmV0dXJuIHR5cGUgb2YgYmxhaCB3YXMgc2V0IHRvCiAgICAgICAgICAgICdpbnQgKionLCBidXQgaXQgc2hvdWxkIHJlYWxseSBiZSAnaW50IConLiAgVGhpcyBoYXMgYmVlbgogICAgICAgICAgICBmaXhlZCwgYnV0IGl0IHdpbGwgYWZmZWN0IGFsbCBwcmlvciB1c2VzIG9mIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24uCiAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NjM5NCBdIFBhdGNoIGZvciBnZW5lcmF0ZWQgcGVybCBjb2RlIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgUmVkSGF0OS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2NvdHQgRmlubmVyYW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxNTc5IF0gKHVuc2lnbmVkKSBsb25nIGxvbmcgaGFuZGxlZCBpbmNvcnJlY3RseSAoVGNsKS4KICAgICAgICAgICAgVGhpcyB3YXMgYW4gZXJyb3IgaW4gdGhlIFRjbCB0eXBlbWFwcy5pIGZpbGUuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBLamVsbCBXb29kaW5nLgogICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTczIF0gbm8gd2F5IHRvIHJlbmFtZSBjbGFzc2VzIGNvbWluZyBmcm9tIEMgc3RydWN0dXJlcy4KICAgICAgICAgICAgVGhpcyBwcm9ibGVtIHJlbGF0ZXMgdG8gcmVuYW1pbmcgb2YgYW5vbnltb3VzIHN0cnVjdHVyZXMgd2l0aCBhCiAgICAgICAgICAgIHR5cGVkZWYuICBGb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgogICAgICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3NiBdIC1oZWxwIHNlZW1zIHRvIGltcGx5IHRoYXQgb25seSB0Y2wtc3BlY2lmaWMgb3B0aW9ucyBleGlzdC4KICAgICAgICAgICAgQWRkZWQgYSBjb21tZW50IHRvIGFsZXJ0IHVzZXIgdG8gb3RoZXIgb3B0aW9ucy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk4MjA1IF0gU2VnZmF1bHQgaW4gU1dJR19Db252ZXJ0UHRyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBQcmFiaHUgUmFtYWNoYW5kcmFuLgoKMDgvMzAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTW9kaWZpZWQgdGhlIGRpcmVjdG9yIHR5cGVtYXBzIGluIHB5dGhvbi9zdGRfY29tcGxleC5pIHRvIHVzZSB0aGUgCgkgICAgbmV3LXN0eWxlIG1hY3JvIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucywgd2hpY2ggZWxpbWluYXRlZCBzb21lCgkgICAgcmVkdW5kYW50IGNvZGUuICBGaXhlZCBhIGZldyBidWdzIGluIHRoZXNlIHR5cGVtYXBzIGFzIHdlbGwsIGFsdGhvdWdoCgkgICAgbW9yZSB0ZXN0aW5nIGlzIG5lZWRlZC4KCjA4LzI5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENvbXBsZXRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIGFic3RyYWN0IGNsYXNzZXMgd2l0aCBkaXJlY3RvcnMuCgkgICAgQ29uc3RydWN0b3Igd3JhcHBlcnMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGFic3RyYWN0IGNsYXNzZXMgdGhhdCBoYXZlCgkgICAgZGlyZWN0b3JzLCBhbmQgaW5zdGFuY2VzIG9mIHRoZSBkaXJlY3RvciBjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCByZWdhcmRsZXNzCgkgICAgb2Ygd2hldGhlciB0aGUgcHJveHkgY2xhc3MgaGFzIGJlZW4gc3ViY2xhc3NlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoJICAgIE5vIGNoZWNrcyBhcmUgbWFkZSBkdXJpbmcgY29uc3RydWN0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBwdXJlIHZpcnR1YWwKCSAgICBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSW5zdGVhZCwgY2FsbHMgdG8KCSAgICB1bmltcGxlbWVudGVkIG1ldGhvZHMgd2lsbCB0aHJvdyBTV0lHX0RJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04KCSAgICBleGNlcHRpb25zIGluIEMrKy4KCgkgICAgSW50ZWdyYXRlZCBQcmFiaHUgUmFtYWNoYW5kcmFuJ3MgdHlwZW1hcCBwYXRjaGVzLCB3aGljaCBwcm92aWRlIGRpcmVjdG9yCgkgICAgdHlwZW1hcCBzdXBwb3J0IGZvciBlbnVtcyBhbmQgc3RkOjpzaXplX3QsIGFuZCBmaXggYSBjb3VwbGUgYnVncyBpbiB0aGUgCgkgICAgZGlyZWN0b3Igc3RkOjp2ZWN0b3I8PiB0eXBlbWFwcy4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcGxlbWVudGVkIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgdGhyb3dpbmcgQyMgZXhjZXB0aW9ucyBmcm9tIEMvQysrIGNvZGUuCiAgICAgICAgICAgIEEgZmV3IGRlbGVnYXRlIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBjYWxsaW5nIHdoaWNoIHRoZW4gdGhyb3cgdGhlIEMjCiAgICAgICAgICAgIGV4Y2VwdGlvbi4gVXNlIHRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uIGZ1bmN0aW9uIGZyb20gQy9DKysgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBvciBjc2hhcnBoZWFkLnN3ZyBmb3IgYWxsIGF2YWlsYWJsZSBleGNlcHRpb25zLgogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKFNXSUdfQ1NoYXJwRXhjZXB0aW9uLCAiZXhjZXB0aW9uIGRlc2NyaXB0aW9uIik7CgogICAgICAgICAgICBUaGUgJ3Rocm93cycgdHlwZW1hcHMgYXJlIGFsc28gbm93IGltcGxlbWVudGVkLCBzbyBjb2RlIGlzIGF1dG9tYXRpY2FsbHkgCiAgICAgICAgICAgIGdlbmVyYXRlZCB0byBjb252ZXJ0IGFueSBDKysgZXhjZXB0aW9uIGludG8gYSBDIyBTeXN0ZW0uRXhjZXB0aW9uIHdoZW4gdGhlIEMrKyAKICAgICAgICAgICAgbWV0aG9kIGRlY2xhcmVzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHN1Y2ggYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coQmFyKTsKCiAgICAgICAgICAgIEFsc28gYW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBhIEMrKyBjbGFzcyBvciBhIGNsYXNzIHBhc3NlZCBieSB2YWx1ZQogICAgICAgICAgICBhbmQgYXJlIHBhc3NlZCBhcyBhIEMjIG51bGwgd2lsbCBub3cgdGhyb3cgYSBDIyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHRvIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgYWxsIHBpbnZva2UgbWV0aG9kcyBzbyB0aGF0IHRoZXkKICAgICAgICAgICAgbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IGRlZmF1bHQgaW4gdGhlIEMjICdzdGF0aWMgZXh0ZXJuJyBkZWNsYXJhdGlvbnMgCiAgICAgICAgICAgIChfX3N0ZGNhbGwgaXMgdXNlZCBvbiBXaW5kb3dzKS4KCjA4LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmV3b3JrZWQgc3RkOjpzdHJpbmcgdHlwZW1hcHMuIEZpeGVzIGEgbnVtYmVyIG9mIHN0cmluZyBpbiBzdGQgbmFtZXNwYWNlIAogICAgICAgICAgICBwcm9ibGVtcy4gRm9yIGV4YW1wbGUgJXRlbXBsYXRlIHZlY3RvcjxzdHJpbmc+LiBUaGUgdGVtcGxhdGVkIGNsYXNzJyBnZXQgbWV0aG9kIAogICAgICAgICAgICB3YXNuJ3QgcmV0dXJuaW5nIGEgSmF2YSBTdHJpbmcsIGJ1dCBhIFNXSUdUWVBFX3Bfc3RyaW5nLiBSZXBvcnRlZAogICAgICAgICAgICBieSBaYWNoIEJhdW0uCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTIyIF0gMS4zLjE5IHNlZ2ZhdWx0IGluIFN3aWdUeXBlX2FkZF9wb2ludGVyL0RvaEluc2VydGl0ZW0uCiAgICAgICAgICAgIFJlbGF0ZWQgdG8gcHJvYmxlbSB3aXRoIHVubmFtZWQgY2xhc3MgaGFuZGxpbmcgaW4gUGVybCBtb2R1bGUuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTYzIF0gTWlzc2luZyBpbmRpY2F0aW9uIG9mIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgICAgICAgVGNsIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg3NDMyIF0gbG9uZyBwYXJhbSBoYW5kbGVkIGFzIGludC4gIFRjbCBtb2R1bGUKICAgICAgICAgICAgbm93IHVzZXMgVGNsX0dldExvbmdGcm9tT2JqIHRvIGNvbnZlcnQgaW50ZWdlciB2YWx1ZXMuCgowOC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1OTg5IF0gbnVtZXJpYyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgIFRoZXJlIHdlcmUKICAgICAgICAgICAgc29tZSBlcnJvcnMgaW4gdGVtcGxhdGUgZXhwYW5zaW9uIHJlbGF0ZWQgdG8gdGhlIHVzZSBvZgogICAgICAgICAgICBhcnJheXMgd2hlcmUgdGhlIGFycmF5IGRpbWVuc2lvbiB3YXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFJlcG9ydGVkIGJ5IEJyeWFuIEdyZWVuLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBkaXJlY3RvciB0eXBlbWFwIChvdXR2KSBmb3IgcmV0dXJuIGJ5IHZhbHVlIGFuZCBjbGVhbmVkIHVwIHVwIGEgZmV3IAoJICAgIG9mIHRoZSBjb21tZW50ZWQgZGlyZWN0b3IgdHlwZW1hcHMuCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uIGZvciBkaXJlY3RvciBjbGFzc2VzIHRvIGlnbm9yZSBwcml2YXRlCgkgICAgY29uc3RydWN0b3JzLiAgUHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhcmUgYWxzbyBpZ25vcmVkIGZvciBub3csIHBlbmRpbmcKCSAgICBhIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIG9mIHdyYXBwaW5nIGNsYXNzZXMgdGhhdCBvbmx5IGRlZmluZSBwcm90ZWN0ZWQKCSAgICBjb25zdHJ1Y3RvcnMuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtb3V0ZGlyIDxkaXI+IHRvIHNwZWNpZnkgd2hlcmUgdGhlIGxhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGZpbGVzIGFyZSB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0YXJnZXQgbGFuZ3VhZ2VzIGxpa2UgUHl0aG9uLAogICAgICAgICAgICBKYXZhIGV0YyB3aGljaCBnZW5lcmF0ZSBwcm94eSBmaWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UuCiAgICAgICAgICAgIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgT24gV2luZG93cyB0aGUgZ2VuZXJhdGVkIGZpbGVzIChvdGhlciB0aGFuIHRoZSBfd3JhcC5jIG9yIF93cmFwLmN4eCBmaWxlcykKICAgICAgICAgICAgd2VyZSBzb21ldGltZXMgaW5jb3JyZWN0bHkgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVubGVzcwogICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSB1c2VkIHRoZSBVbml4IHBhdGggc2VwYXJhdG9yLiBUaGUgV2luZG93cyBwYXRoIHNlcGFyYXRvciAKICAgICAgICAgICAgc2hvdWxkIG5vdyBiZSB1c2VkLiBCdWcgcmVwb3J0ZWQgYnkgUm9iZXJ0IERhdmllcy4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYXJyYXkgdmFyaWFibGUgc2V0IHR5cGVtYXAgdG8gUGVybCBtb2R1bGUuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1Njc3IF0gQXJyYXkgaW5pdCBjYXVzZXMgY29kZWdlbiBidWcuLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3OTA2MiBdIENsYXNzIlxuIjo6Zm9vIG5vdCBzdXBwb3J0ZWQuICBTV0lHCiAgICAgICAgICAgIHNob3VsZCBub3cgY29ycmVjdGx5IGhhbmRsZSB3aGl0ZXNwYWNlIGluIGJldHdlZW4gCiAgICAgICAgICAgIG5hbWVzcGFjZSBxdWFsaWZpZXJzLiAgRm9yIGV4YW1wbGUgIkEgOjogRm9vIDo6IEJhciIuCiAgICAgICAgICAgIAowNy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIHBhcmFtZXRlcnMgd2hpY2ggYXJlIGNsYXNzZXMgdGhhdCBhcmUgcGFzc2VkIGJ5IHZhbHVlIGFuZCBoYXZlIAogICAgICAgICAgICBhIGRlZmF1bHQgdmFsdWUuIEEgY29weSBjb25zdHJ1Y3RvciBmb3IgU3dpZ1ZhbHVlV3JhcHBlciBpcyByZXF1aXJlZCAKICAgICAgICAgICAgKFNGICM3ODAwNTYpLiBBbHNvIGZpeGVkIG1lbW9yeSBsZWFrIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMuIFRoZXNlIG1vZHMKICAgICAgICAgICAgYWxzbyBmaXggU0YgIzc4MDA1NC4KCjA3LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgcnVuLXRpbWUgZXJyb3IgbWVzc2FnZSBmb3IgcG9pbnRlcnMgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgWm9va28uCgowNy8xMC8yMDAzOiBiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIFtBbG1vc3QgYWxsIGxhbmd1YWdlc10gV3JhcHBlcnMgZm9yIHN0ZDo6cGFpciBhZGRlZC4KCSAgICBUeXBlbWFwcyBmb3IgUHl0aG9uLCBSdWJ5LCBHdWlsZSBhbmQgTXpTY2hlbWUuCgowNy8wMS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEhhbmRsZSB0aGUgY2FzZSBvZiBtb3JlIHRoYW4gb25lIGFyZ291dCB0eXBlbWFwCgkgICAgcGVyIGZ1bmN0aW9uLgoKMDYvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gU0YgIzY3MDk0OSByZXF1ZXN0LiBUaGUgZGVzdHJ1Y3RvciB3cmFwcGVyIGZ1bmN0aW9uIG5hbWUgaXMgbm93IAogICAgICAgICAgICBjb25maWd1cmFibGUuICBBIG5ldyBhdHRyaWJ1dGUgY2FsbGVkIG1ldGhvZG5hbWUgaW4gdGhlIAogICAgICAgICAgICBqYXZhZGVzdHJ1Y3QvamF2YWRlc3RydWN0X2Rlcml2ZWQgKEphdmEpIG9yIGNzZGVzdHJ1Y3QvY3NkZXN0cnVjdF9kZXJpdmVkIChDIykKICAgICAgICAgICAgdHlwZW1hcHMgc3BlY2lmaWVzIHRoZSBtZXRob2QgbmFtZS4gRm9yIGV4YW1wbGUgaW4gSmF2YSB0aGUgZGVzdHJ1Y3RvciBpcyAKICAgICAgICAgICAgd3JhcHBlZCBieSBkZWZhdWx0IHdpdGggdGhlIGRlbGV0ZSBtZXRob2Q6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWRlc3RydWN0LCBtZXRob2RuYW1lPSJkZWxldGUiKSBTV0lHVFlQRSB7Li4ufQoKMDYvMjcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHRocm93cyBhdHRyaWJ1dGUgZm9yIGFkZGluZyBleGNlcHRpb24gY2xhc3NlcyB0byB0aGUgdGhyb3dzCiAgICAgICAgICAgIGNsYXVzZSBhbHNvIG5vdyB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IAogICAgICAgICAgICBuZXdmcmVlCiAgICAgICAgICAgIGphdmFpbiwgamF2YW91dCAoSmF2YSkKICAgICAgICAgICAgY3NpbiwgY3NvdXQgKEMjKQoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSAnQW5FeGNlcHRpb24nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRocm93cyBjbGF1c2UgaW4gdGhlCiAgICAgICAgICAgIHByb3h5IGZ1bmN0aW9uOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCwgdGhyb3dzPSJBbkV4Y2VwdGlvbiIpIGludCB7CiAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsdWU9JGpuaWNhbGw7CiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWU9PTApIHRocm93IG5ldyBBbkV4Y2VwdGlvbigiVmFsdWUgbXVzdCBub3QgYmUgemVybyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICB9CgowNi8yNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciB0eXBlbWFwIG1hcnNoYWxsaW5nIGNoZWNrcyBmb3IgbnVsbCBwb2ludGVycyB3aGVuCgkgICAgd2Fsa2luZyB0aGUgcGFyYW1ldGVyIGxpc3QgaW5zdGVhZCBvZiByZWx5aW5nIHNvbGV5IG9uIHRoZSBwYXJhbWV0ZXIKCSAgICBjb3VudC4gIEN1cmVzIGEgc2VnZmF1bHQgdGhhdCBvY2N1cnJlZCBmb3IgbXVsdGlwbGUgYXJndW1lbnQgaW52IHR5cGVtYXBzLgoJICAgIFNvbWVvbmUgd2l0aCBtb3JlIFN3aWcgZXhwZXJpZW5jZSBzaG91bGQgcHJvYmFibHkgcmV2aWV3IHRoaXMgY29kZS4KCjA2LzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRG9uJ3QgZW1pdCBjYWxscyB0byAiQ19jaGVja19mb3JfaW50ZXJydXB0IiwKCSAgICB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGVuZGxlc3MgbG9vcC4gIFBhdGNoIGJ5IGZlbGl4QHByb3hpbWEtbXQuZGUuCgowNi8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaW5hbGl6ZXJzIG5vdyB1c2UgZGVzdHJ1Y3RvciBzeW50YXggYXMgdGhlIG92ZXJyaWRlIHdoaWNoIHdhcyB1c2VkIGluIAogICAgICAgICAgICB0aGUgRmluYWxpemUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgRUNNQSBzdGFuZGFyZHMsIHNwb3R0ZWQgYnkgdGhlIE1TIGNvbXBpbGVyLgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQSBudW1iZXIgb2YgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byByZW1vdmUgdGhlIEphdmEgbmFtaW5nIAogICAgICAgICAgICB0aGF0IHdhcyB1c2VkIGluIHRoZSBDIyBtb2R1bGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUeXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgam5pICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGN0eXBlCiAgICAgICAgICAgIGp0eXBlICAgICAgICAgICAgICAgICAgICAgICAtPiBpbXR5cGUKICAgICAgICAgICAganN0eXBlICAgICAgICAgICAgICAgICAgICAgIC0+IGNzdHlwZQogICAgICAgICAgICBqYXZhaW4gICAgICAgICAgICAgICAgICAgICAgLT4gY3NpbgogICAgICAgICAgICBqYXZhb3V0ICAgICAgICAgICAgICAgICAgICAgLT4gY3NvdXQKICAgICAgICAgICAgamF2YWludGVyZmFjZXMgICAgICAgICAgICAgIC0+IGNzaW50ZXJmYWNlcwogICAgICAgICAgICBqYXZhYmFzZSAgICAgICAgICAgICAgICAgICAgLT4gY3NiYXNlCiAgICAgICAgICAgIGphdmFjbGFzc21vZGlmaWVycyAgICAgICAgICAtPiBjc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFjb2RlICAgICAgICAgICAgICAgICAgICAtPiBjc2NvZGUKICAgICAgICAgICAgamF2YWltcG9ydHMgICAgICAgICAgICAgICAgIC0+IGNzaW1wb3J0cwogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgLT4gY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycwogICAgICAgICAgICBqYXZhZ2V0Y3B0ciAgICAgICAgICAgICAgICAgLT4gY3NnZXRjcHRyCiAgICAgICAgICAgIGphdmFmaW5hbGl6ZSAgICAgICAgICAgICAgICAtPiBjc2ZpbmFsaXplCgogICAgICAgICAgICBGZWF0dXJlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgamF2YWNvbnN0ICAgICAgICAgICAgICAgICAgIC0+IGNzY29uc3QKICAgICAgICAgICAgamF2YW1ldGhvZG1vZGlmaWVycyAgICAgICAgIC0+IGNzbWV0aG9kbW9kaWZpZXJzCgogICAgICAgICAgICBQcmFnbWEgY2hhbmdlczoKICAgICAgICAgICAgcHJhZ21hKGphdmEpICAgICAgICAgICAgICAgIC0+IHByYWdtYShjc2hhcnApCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzICAgICAgLT4gaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzY29kZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2ltcG9ydHMgICAgICAgICAgICAgLT4gaW1jbGFzc2ltcG9ydHMKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2VzICAgICAgICAgIC0+IGltY2xhc3NpbnRlcmZhY2VzCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgICAgICAgICAgICAgIC0+ICRjc2NsYXNzbmFtZQogICAgICAgICAgICAkamF2YWlucHV0ICAgICAgICAgICAgICAgICAgLT4gJGNzaW5wdXQKICAgICAgICAgICAgJGpuaWNhbGwgICAgICAgICAgICAgICAgICAgIC0+ICRpbWNhbGwKCiAgICAgICAgICAgIFRoaXMgd2lsbCBicmVhayBTV0lHIGludGVyZmFjZSBmaWxlcyB0aGF0IHVzZSB0aGVzZSB0eXBlbWFwcywgZmVhdHVyZXMKICAgICAgICAgICAgYW5kIHByYWdtYXMuIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIG9yIHVzZSBtYWNyb3MgZm9yIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIEFwcGxpZWQgTXpTY2hlbWUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uCgogICAgICAgICAgICAtIFVwZGF0ZWQgbXpzY2hlbWUgdG8gdXNlIFNXSUcncyBjb21tb24gcnVudGltZSB0eXBlCiAgICAgICAgICAgICAgc3lzdGVtIGZyb20gY29tbW9uLnN3Zy4gCgoJICAgIC0gVGhlIExpYi9tenNjaGVtZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgdGhlIGxhbmd1YWdlIG1vZHVsZXM6CiAgICAgICAgICAgICAgbXpzY2hlbWUuaSB3YXMgbW92ZWQgdG8gbXpzY2hlbWUuc3dnLCBtenNjaGVtZS5zd2cgYW5kCiAgICAgICAgICAgICAgbXpzY2hlbWVkZWMuc3dnIGhhdmUgYmVlbiByZW1vdmVkLCBtenJ1bi5zd2cgKHdoaWNoCiAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJ1bnRpbWUgY29kZSkgaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAtIFRoZSBzd2lnX3Byb3h5IHN0cnVjdHVyZSB3YXMgcmVuYW1lZCB0byBzd2lnX216X3Byb3h5LgogICAgICAgICAgICAgIHN3aWdfbXpfcHJveHkgbm93IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvCiAgICAgICAgICAgICAgc3RydWN0dXJlLiAgCgoJICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kCiAgICAgICAgICAgICAgU1dJR1RZUEUgJi4KCgkgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gYnkgY2FsbGluZyBzY2hlbWVfYWRkX2ZpbmFsaXplcigpIGhhcwogICAgICAgICAgICAgIGJlZW4gYWRkZWQuCgoJICAgICoqKiBORVcgRkVBVFVSRSBbTXpTY2hlbWVdICoqKgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcHM6IGphdmFkZXN0cnVjdCBhbmQgamF2YWRlc3RydWN0X2Rlcml2ZWQKICAgICAgICAgICAgZm9yIHRoZSBDKysgZGVzdHJ1Y3RvciB3cmFwcGVyLiBUaGUgamF2YWRlc3RydWN0IHZlcnNpb24gZ2V0cyB1c2VkIGJ5CiAgICAgICAgICAgIGNsYXNzZXMgYXQgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBjaGFpbiBhbmQgdGhlIGphdmFkZXN0cnVjdF9kZXJpdmVkIAogICAgICAgICAgICB2ZXJzaW9uIGdldHMgdXNlZCBieSBvdGhlciBjbGFzc2VzLgoKICAgICAgICAgICAgW0MjXSBjaWxkaXNwb3NlIGFuZCBjaWxkaXNwb3Nlb3ZlcnJpZGUgdHlwZW1hcHMgcmVwbGFjZWQgYnkKICAgICAgICAgICAgY3NkZXN0cnVjdCBhbmQgY3NkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXBzLiBUaGUgZGVsZXRlKCkKICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0cyBmdW5jdGlvbmFsaXR5IHB1dCBpbnRvIHRoZXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGRlc2lnbmVkIGZvciB0aGUgRGlzcG9zZSgpIG1ldGhvZC4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXBzIGNzaW50ZXJmYWNlcyBhbmQgY3NpbnRlcmZhY2VzX2Rlcml2ZWQgcmVwbGFjZQogICAgICAgICAgICB0aGUgamF2YWludGVyZmFjZXMgdHlwZW1hcC4gQWxzbyBmaXhlcyB0aGUgcGVjdWxpYXJpdHkgb2YgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4gaW5kaXZpZHVhbGx5IGRlcml2aW5nIGZyb20gdGhlIElEaXNwb3NhYmxlIAogICAgICAgICAgICBpbnRlcmZhY2UuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwIGNzZmluYWxpemUgZm9yIGZpbmFsaXplcnMuIEMrKyBkZXN0cnVjdG9ycyBhcmUgbm93IGNhbGxlZAogICAgICAgICAgICBieSBnYXJiYWdlIGNvbGxlY3RvciBkdXJpbmcgZmluYWxpemF0aW9uLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBBbmRyZWFzIFNjaPZyay4KCjA2LzEwLzIwMDM6IFRpZ2VyCgkgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSBmb3IgZXJyb3IgbWVzc2FnZSBvdXRwdXQuCiAgICAgICAgICAgIENvbnRyYWN0IGNvZGUgY2FuIG5vdyBwcmludCBvdXQgc2ltcGxlIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgdG8gcHJlcGFyZSBmb3IgaW5oZXJpdGFuY2UKICAgICAgICAgICAgCjA2LzAzLzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFwcGxpZWQgR3VpbGUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkgCgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LiAKCgkgICAgLSBTV0lHIGN1cnJlbnRseSB1c2VzIEd1aWxlJ3MgZ2hfIEFQSSwgd2hpY2ggaXMgbWFya2VkIGFzCgkgICAgICBkZXByZWNhdGVkIGluIEd1aWxlIDEuNiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEd1aWxlCgkgICAgICAxLjkuICBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgY29tbWFuZC1saW5lIGZsYWcgIi1zY20iCgkgICAgICB3aGljaCBjYXVzZXMgU1dJRyB0byBnZW5lcmF0ZSB3cmFwcGVycyB0aGF0IHVzZSBHdWlsZSdzCgkgICAgICBTQ00gQVBJIGluc3RlYWQ7IHRoaXMgcmVxdWlyZXMgR3VpbGUgPj0gMS42LgoJICAgIAoJICAgIC0gVGhlIExpYi9ndWlsZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgbGFuZ3VhZ2UgbW9kdWxlczogZ3VpbGVkZWMuc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlLnN3ZyBoYXZlIGJlZW4gbW92ZWQgaW50byBndWlsZV9naF9ydW4uc3dnLAogICAgICAgICAgICAgIGd1aWxlLmkgaGFzIGJlZW4gbW92ZWQgdG8gZ3VpbGVfZ2guc3dnLCBndWlsZV9zY20uc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlX3NjbV9ydW4uc3dnIHdoaWNoIGNvbnRhaW4gdGhlIFNDTSBBUEkgc3R1ZmYKICAgICAgICAgICAgICBoYXZlIGJlZW4gYWRkZWQKCgkgICAgLSBnaGludGVyZmFjZS5pLCB3aGljaCBjb250YWlucyB0aGUgZGVmaW5lcyBmcm9tIHRoZSBnaF8KICAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gdGhlIHNjbV9mdW5jdGlvbnMgaGFzIGJlZW4gYWRkZWQKCgkgICAgLSBUaGUgQVBJIGZvciBkZWFsaW5nIHdpdGggcG9pbnRlciBvYmplY3RzIGlzIG5vdwoJICAgICAgU1dJR19Db252ZXJ0UHRyLCBTV0lHX011c3RHZXRQdHIsIFNXSUdfTmV3UG9pbnRlck9iai4KCiAgICAgICAgICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kIFNXSUdUWVBFICYKCiAgICAgICAgICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFIFtHdWlsZV0gKioqCgkgICAgCQowNi8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGltZW5zaW9ubGVzcyBhcnJheXMgc3VjaCBhcyAKCiAgICAgICAgICAgICAgICBpbnQgZm9vW10gPSB7MSwgMn07CiAgICAgICAgICAgICAgICBleHRlcm4gaW50IGJhcltdOwoKICAgICAgICAgICAgcHJvZHVjZSBhIHdhcm5pbmcgdGhhdCB0aGUgdmFyaWFibGUgaXMgcmVhZC1vbmx5LiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSwgdGhpcyB1c2VkIHRvIGNhdXNlIGNvbXBpbGUgZXJyb3JzIG9yIGdlbmVyYXRlIGEgc2V0dGVyIHRoYXQKICAgICAgICAgICAgZ2VuZXJhdGVkIGEgcnVudGltZSBlcnJvci4gQSBzZXR0ZXIgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlIGFycmF5IHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgU1dJRy4gQSB2YXJpbiwgZ2xvYmFsaW4gCiAgICAgICAgICAgIG9yIG1lbWJlcmluIHR5cGVtYXAgKGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKSBtdXN0IGJlIHdyaXR0ZW4gCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyLgoKMDUvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWZpbmVtZW50IHRvIGRlZmF1bHQgdHlwZW1hcCBtYXRjaGluZyBhbmQgYXJyYXlzLiAgV2hlbiBhbgogICAgICAgICAgICBhcnJheSBpcyBkZWNsYXJlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgIGludCBmb29bNF07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwIG5vdyByZXNvbHZlcyB0byAKCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW0FOWV0KCiAgICAgICAgICAgIElmIG5vIG1hdGNoIGlzIGZvdW5kIGZvciB0aGF0LCBpdCB0aGVuIHJlc29sdmVzIHRvCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCgogICAgICAgICAgICBJZiBubyBhcnJheSBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgdGhlIFNXSUdUWVBFIFtdIGlzIHVzZWQgcmlnaHQgYXdheS4gCgogICAgICAgICAgICBOb3RlOiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBtYWRlIHRvIHJlc29sdmUgcHJvYmxlbXMgcmVsYXRlZCB0bwogICAgICAgICAgICBhcnJheXMgd2l0aCBhbmQgd2l0aG91dCBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIHNvbWV0aW1lcyBTV0lHCiAgICAgICAgICAgIHdhcyBnZW5lcmF0aW5nIHNldHRlciBmdW5jdGlvbnMgZm9yIGFycmF5IHZhcmlhYmxlcyB3aXRoIG5vIGRpbWVuc2lvbnMKICAgICAgICAgICAgKGFuIGVycm9yKS4gTGlrZXdpc2UsIFNXSUcgc29tZXRpbWVzIG1hZGUgYXJyYXlzIHdpdGggZGltZW5zaW9ucwogICAgICAgICAgICByZWFkLW9ubHkgKGFsc28gYW4gZXJyb3IpLiAgVGhpcyBmaXhlcyB0aGUgYXJyYXlzX2dsb2JhbCB0ZXN0CiAgICAgICAgICAgIHByb2JsZW0uCiAgICAgICAgICAgICAgICAgICAgICAgIAowNS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0eXBlIGhhbmRsaW5nIGJ1ZyB3aXRoIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzLgogICAgICAgICAgICBJZiB5b3UgaGFkIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICAgICAgICBGb28gKmZ1bmMxKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgZnVuYzIoQmFyICZ4KTsKCiAgICAgICAgICAgIFRoZW4gZnVuYzIoKSB3b3VsZG4ndCBhY2NlcHQgb2JqZWN0cyByZXR1cm5lZCBieSBmdW5jMSgpCiAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB0eXBlIGVycm9yLiAgIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpYW4gWWFuZy4KCjA1LzIxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyB0byBzb21lIG9mIHRoZSBWaXN1YWwgQysrIGV4YW1wbGUgcHJvamVjdCBmaWxlcyB3aGljaCB3b3VsZCBub3QgCiAgICAgICAgICAgIHdvcmsgd2l0aCBzcGFjZXMgaW4gdGhlIHBhdGhzIGhlbGQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIHRvIAogICAgICAgICAgICBwb2ludCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlJ3MgbGlicmFyeSAvIGluY2x1ZGUgZGlyZWN0b3J5LgogICAgICAgICAgICBTRiBidWcgIzc0MDc2OQoKMDUvMjEvMjAwMzogIHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWNvbnRyYWN0cyBvcHRpb24uCiAgICAgICAgICAgIEZpcnN0IHRyeSBvZiB0aGUgaWRlYSBvZiAiV3JhcCBieSBDb250cmFjdCI6IAogICAgICAgICAgICBidWlsZCB1cCByZWFsaWFibGUgY3Jvc3MtbGFuZ3VhZ2UgbW9kdWxlIGJ5IHdyYXBwaW5nIHdpdGggU1dJRy4KICAgICAgICAgICAgSW1wbGVtZW50ZWQgYmFzaWMgYXNzZXJ0aW9uCiAgICAgICAgICAgIChwcmVhc3NlcnRpb24gJiBwb3N0YXNzZXJ0aW9uICYgaW52YXJpYW50KQogICAgICAgICAgICBmb3Igc2ltcGxlIEMvQysrIGZ1bmN0aW9ucy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEN1cnJlbnQgZm9ybWF0IG9mIGNvbnRyYWN0cyBhcmU6CiAgICAgICAgICAgICVjb250cmFjdCBjbGFzc19uYW1lIDo6IGZ1bmNfbmFtZSAocGFyYXMuLi4pIHsKICAgICAgICAgICAgcmVxdWlyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcnM7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgZW5zdXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGludmFyaWFudDoKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgkgICAgCQowNS8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgdHdlYWtzLiBUaGVyZSB3ZXJlIGEgZmV3IHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgTWFrZWZpbGUgZm9yIHBhc3Npbmcgb24gdGhlIGNvbW1hbmRsaW5lIHdoZW4gY29tcGlsaW5nLgogICAgICAgICAgICBUaGVzZSBhcmUgbm93IGFsbCBkZWZpbmVkIGluIHN3aWdjb25maWcuaC4gQXV0b2NvbmYgZG9lc24ndCBub3JtYWxseSAKICAgICAgICAgICAgYWxsb3cgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHRvIGJlIGRlZmluZWQgaW4gdGhpcyBjb25maWcgaGVhZGVyIGZpbGUsIAogICAgICAgICAgICBidXQgYW4gYXV0b2NvbmYgYXJjaGl2ZSBtYWNybyBlbmFibGVzIHRoaXMuIFRoaXMgbWFjcm8gYWxvbmcgd2l0aCBmdXR1cmUgCiAgICAgICAgICAgIGF1dG9jb25mIG1hY3JvcyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSBUb29scy9jb25maWcgZGlyZWN0b3J5LgoKICAgICAgICAgICAgJ3N3aWcgLXZlcnNpb24nIG5vdyByZXBvcnRzIHRoZSB0YXJnZXQgYnVpbGQgcGxhdGZvcm0uCgowNS8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBGaXggdG8gdGhlIGZvbGxvd2luZyB0eXBlbWFwczoKCiAgICAgICAgICAgIGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCgogICAgICAgICAgICBUaGVzZSBhcmUgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcvZ2VuZXJhdGluZyBwcm94eSBjbGFzc2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyB3b3VsZCB1c2UgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIG5vdCB0aGUgCiAgICAgICAgICAgIEMrKyB0eXBlLCB3aGljaCB3YXMgaW5jb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHR5cGVtYXBzLiAKCiAgICAgICAgICAgIEluIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgdGhlIEMrKyBjbGFzcyBuYW1lL3R5cGUgCiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgY2xhc3NlcyBpbiBuYW1lc3BhY2UsIHRlbXBsYXRlZCBjbGFzc2VzIGV0Yy4gc28KICAgICAgICAgICAgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IG1vc3QgY2FzZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBhbmQgQyMgTU9EVUxFUyAqKioKCjA1LzA5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWaXN1YWwgQysrIFByb2plY3QgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICAgIGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIChmb3IgVGNsLCBQZXJsLCBQeXRob24gYW5kIFJ1YnkpLgoKMDUvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmV0dXJuIGJ5IHZhbHVlLCBjb25zdCwgYW5kIHByaXZhdGUgY29uc3RydWN0b3JzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICBCKCk7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBCKGNvbnN0IEImKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEIgcmV0dXJuQigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJvYmxlbSBhbmQgcGF0Y2ggc3VnZ2VzdGlvbiByZXBvcnRlZCBieSBCaWxsIEhvZmZtYW4uCgowNC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBTaW5nbGUgYXV0b2NvbmYgaW52b2NhdGlvbiAtIGF1dG9jb25mIGluIHRoZSBUb29scyBkaXJlY3RvcnkgaGFzIGdvbmUuCgogICAgICAgICAgICAtIExpYnRvb2wgYm9vdHN0cmFwcGVkIHdoZW4gcnVubmluZyBhdXRvZ2VuLnNoLiBUaGlzIHJlcXVpcmVzIGFueW9uZQogICAgICAgICAgICAgIHVzaW5nIHRoZSBjdnMgdmVyc2lvbiBvZiBTV0lHIHRvIGhhdmUgbGlidG9vbCBpbnN0YWxsZWQgb24gdGhlaXIKICAgICAgICAgICAgICBtYWNoaW5lLiBTdWdnZXN0IHZlcnNpb24gMS40LjIgb3IgaGlnaGVyLCBwcmVmZXJhYmx5IHRoZSBsYXRlc3QgLSAxLjUuCgogICAgICAgICAgICAtIEF1dG9tYWtlIGlzIG5vdyB1c2VkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcmllcyBpbiBjb25qdW5jdGlvbiAKICAgICAgICAgICAgICB3aXRoIGxpYnRvb2wuCgogICAgICAgICAgICAtIFJ1bnRpbWUgbGlicmFyaWVzIGFyZSBub3cgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGFzIERMTHMgb24gQ3lnd2luLgoKICAgICAgICAgICAgLSBTa2lwcGluZyBsYW5ndWFnZXMgaXMgbm8gbG9uZ2VyIGp1c3QgZGV0ZXJtaW5lZCBpbiB0aGUgdG9wIGxldmVsIAogICAgICAgICAgICAgIG1ha2VmaWxlIGJ1dCBpbiBjb25maWd1cmUuaW4uIFRoaXMgaW5mbyBpcyB1c2VkIGZvciBidWlsZGluZwogICAgICAgICAgICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBhbmQgZm9yIHJ1bm5pbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgLSBUaGVzZSBjaGFuZ2VzIGhhdmUgZml4ZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3J5IGJ1aWxkcywgdGhhdCBpcwogICAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gCiAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZyb20gbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgYWxzbyB3b3JraW5nLiBBbiBpbml0aWFsCiAgICAgICAgICAgICAgY29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBuZWVkZWQgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgICAgaW4gMDQvMDIvMjAwMyBlbnRyeS4gQSAnbWFrZSBkaXN0Y2xlYW4nIHdpbGwgYmUgbmVlZGVkIGJlZm9yZSBidWlsZGluZwogICAgICAgICAgICAgIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaWYgdGhlIGF1dG90b29scyAKICAgICAgICAgICAgICBoYXZlIGJlZW4gcnVuIGZyb20gdGhpcyB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHNvbWUgcG9pbnQsIGJ1dCAKICAgICAgICAgICAgICBhdXRvY29uZiB3aWxsIHRlbGwgeW91IHRoaXMuIE5vdGUgdGhhdCAnbWFrZSBjaGVjaycgb25seSB3b3JrcyBmcm9tIAogICAgICAgICAgICAgIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHRoZSBtb21lbnQuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzIzNDcxIF0gV3JhcHBlcl9wcmludCgpIGZhaWxzIHdpdGggcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgY29uc3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBoYW5kbGluZyAKICAgICAgICAgICAgZGVzY3JpYmVkIGluIENIQU5HRVMgMDgvMTEvMjAwMi4gICBQcmV2aW91c2x5LCBTV0lHIG1lcmVseQogICAgICAgICAgICBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW4gaW5pdGlhbGl6ZXIgaW4gdGhlIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBOb3csIFNXSUcgYWRkaXRpb25hbGx5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBtZW1iZXIKICAgICAgICAgICAgaXMgY29uc3QuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSBraW5kIG9mIGxpbWl0ZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UsCiAgICAgICAgICAgIGFjdGl2YXRlZCB1c2luZyB0aGUgLW1pbmhlcml0IGNvbW1hbmQtbGluZSBvcHRpb24uIEkndmUgYWxzbyB1cGRhdGVkCiAgICAgICAgICAgIHRoZSAiQysrIEluaGVyaXRhbmNlIiBzZWN0aW9uIG9mIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24gdG8gZGlzY3VzcwogICAgICAgICAgICBob3cgdGhpcyB3b3JrcywgYW5kIGl0cyBsaW1pdGF0aW9ucy4gQWxzbyBhbHNvIG1vZGlmaWVkIHRoZSBtaW5oZXJpdC5pCiAgICAgICAgICAgIHRlc3QgY2FzZSB0byBydW4gYWdhaW5zdCB0aGlzLgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAtZ2xvYmFsbW9kdWxlIGNvbW1hbmQtbGluZSBvcHRpb24gZm9yIHRoZSBSdWJ5CiAgICAgICAgICAgIG1vZHVsZSwgZm9yIHdyYXBwaW5nIHN0dWZmIGludG8gdGhlIGdsb2JhbCBtb2R1bGUgKEtlcm5lbCkgaW5zdGVhZAogICAgICAgICAgICBvZiBhIG5lc3RlZCBtb2R1bGUuIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KCjA0LzIzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHN5bW5hbWUgZXJyb3IgaW4gZGlyZWN0b3IgY2FsbHMgdG8gUHl0aG9uIG1ldGhvZHMKCSAgICB0aGF0IGV4dGVuZCBDKysgb3BlcmF0b3JzLgoKCSAgICBTdG9wcGVkIGRpcmVjdG9yIGRlc3RydWN0b3Igd3JhcHBlcnMgZnJvbSBjYWxsaW5nIF9fc2V0X3VwLAoJICAgIHdoaWNoIHdhcyBsZWF2aW5nIHRoZSBkaXJlY3RvciBmbGFnIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KCjA0LzIzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSByZXNvbHV0aW9uIGFuZCBuZXN0ZWQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWxmcmVkIExvcmJlciAoYW5kIE1hcmNlbG8gTWF0dXMpLgoKMDQvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFBhdGNoIGZvciBKYXZhIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRvIHJ1biBvbiBNYWMgT1MgWC4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBJbmNvcnBvcmF0ZWQgTm9idSBOYWthZGEncyBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIHRoZSBSdWJ5CiAgICAgICAgICAgIDEuOCBhbGxvY2F0aW9uIGZyYW1ld29yay4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZXBsYWNlZCBhbGwgdXNlcyBvZiB0aGUgZGVwcmVjYXRlZCBTVFIyQ1NUUigpIG1hY3JvIHdpdGggdGhlCiAgICAgICAgICAgIHNhZmVyIFN0cmluZ1ZhbHVlUHRyKCkgbWFjcm8uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgcnVieS10YWxrOjY3MDU5CiAgICAgICAgICAgIGFuZCBmb2xsb3ctdXBzIHRvIHRoYXQgcG9zdC4KCjA0LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHByZXByb2Nlc3NvciBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSAKICAgICAgICAgICAgICAgIGludCBmKGludCBtaW4pOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2ViYXN0aWVuIFJlY2lvLgoKMDQvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBhIHJ1bnRpbWUgY2hlY2sgdG8gdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSBsaWJyYXJ5IHRvIGNoZWNrIAogICAgICAgICAgICB0aGF0IHRoZSBKYXZhIGFycmF5IHBhc3NlZCBpbiBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBDIGFycmF5IGFuZCB0aHJvdyBhbiAKICAgICAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KCiAgICAgICAgICAgIEFsc28gZml4IHRvIHVzZSBkZWxldGUgaW5zdGVhZCBvZiBmcmVlIGZvciBhcnJheXMgY3JlYXRlZCB1c2luZyBuZXcuCgowNC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmVtb3ZlIEdDQzMgd2FybmluZyB3aGVuIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGU6CgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGNoYW5naW5nIHNlYXJjaCBvcmRlciBmb3Igc3lzdGVtIGRpcmVjdG9yeSAiL3Vzci9pbmNsdWRlIgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIGEgbm9uLXN5c3RlbSBkaXJlY3RvcnkgCgogICAgICAgICAgICBTZWUgU0YgcGF0Y2ggIzcxNTUzMSBzdWJtaXR0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zCgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXByb3ZlZCB3cmFwcGluZyBvZiBlbnVtcyBhbmQgY29uc3RhbnRzLiBUaGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgd3JhcHBlZCBhcyBDIyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29uc3RhbnRzLiBFaXRoZXIgdGhlc2UgYXJlIHdyYXBwZWQKICAgICAgICAgICAgYXMgcmVhZG9ubHkgKHJ1bnRpbWUpIGNvbnN0YW50cyBvciBjb21waWxlIHRpbWUgY29uc3RhbnRzLCBkZXBlbmRpbmcgb24KICAgICAgICAgICAgdGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIChUaGUgZGlyZWN0aXZlIGlzIGxpa2VseSB0byBjaGFuZ2UgbmFtZSBzb29uKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgd3JhcHBpbmc6CiAgICAgICAgICAgICAgJWphdmFjb25zdCgwKTsKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAyMgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgWFlaOwogICAgICAgICAgICAgICNkZWZpbmUgWFlaIDMzCiAgICAgICAgICAgIGlzIG5vdzoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGludCBBQkMgPSBleGFtcGxlUElOVk9LRS5nZXRfQUJDKCk7CiAgICAgICAgICAgICAgcHVibGljIGNvbnN0IGludCBYWVogPSAzMzsKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGNvbnN0YW50cyBhbmQgZW51bXMgYXJlIHB1dCBpbiB0aGVpciBvd24gaW50ZXJmYWNlIGNhbGxlZAogICAgICAgICAgICB4eHhDb25zdGFudHMsIHdoZXJlIHh4eCBpcyB0aGUgbW9kdWxlIG5hbWUuIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgYXMgCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIGRlcml2ZSAoaW1wbGVtZW50KSBhIEphdmEgY2xhc3MgZnJvbSB0aGUgeHh4Q29uc3RhbnRzCiAgICAgICAgICAgIGludGVyZmFjZSB0byBpbXByb3ZlIHRoZSBzeW50YXg7IG5hbWVseSB3aGVuIHdyYXBwaW5nOgogICAgICAgICAgICAgIGVudW0ge09ORT0xLCBUV08sIFRIUkVFfTsKICAgICAgICAgICAgYWNjZXNzaW5nIHRoZXNlIGZyb20gYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyB4eHhDb25zdGFudHMgaXMgbmVhdGVyOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSBPTkU7CiAgICAgICAgICAgIHRoYW4gdGhlIHByZXZpb3VzOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSB4eHguT05FOwoKICAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IERhdmUgRHJpYmluLgoKMDQvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGltcHJvdmVtZW50cyBmb3IgbXVsdGlwbGUgYnVpbGRzLiBUaGlzIGFsbG93cyBvbmUgdG8gYnVpbGQKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZSBhbmQgcnVudGltZSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMvY29tcGlsZXJzIAogICAgICAgICAgICBldGMgYnkgcnVubmluZyBjb25maWd1cmUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBUaGlzIGlzbid0IDEwMCUganVzdCAKICAgICAgICAgICAgeWV0IGFuZCB3b24ndCBiZSB1bnRpbCBsaWJ0b29sIGlzIGJldHRlciBjb25maWd1cmVkLi4uIGEgJ2NvbmZpZ3VyZScgYW5kIAogICAgICAgICAgICAnbWFrZSBkaXN0Y2xlYW4nIG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVmb3JlIGl0IGFsbCB3b3Jrcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJCAuL2NvbmZpZ3VyZQogICAgICAgICAgICAgICQgbWFrZSBkaXN0Y2xlYW4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzE7IGNkIGNvbmZpZzE7IC4uL2NvbmZpZ3VyZSBDQz1nY2MgQ1hYPWcrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzI7IGNkIGNvbmZpZzI7IC4uL2NvbmZpZ3VyZSBDQz1jYyBDWFg9YysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAKICAgICAgICAgICAgVG8gYmUgaW1wcm92ZWQuIEEgJ21ha2UgY2hlY2snIGRvZXMgbm90IHdvcmsgeWV0IGVpdGhlci4gCgowNC8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4KICAgICAgICAgICAgVGhpcyBzaG93ZWQgdXAgd2hlbiB0cnlpbmcgdG8gdXNlIHN0ZF92ZWN0b3IuaSB3aXRoIHZlY3RvcnMKICAgICAgICAgICAgb2YgcG9pbnRlcnMuCgowMy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciBwYXJhbGxlbCBtYWtlIGJ1aWxkcyBvZiBTV0lHLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIG1ha2UgLWogNAogICAgICAgICAgICBCdWlsZCBmYWlsdXJlIHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlLgoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWxlYXNlZCAxLjMuMTkuCgoKClZlcnNpb24gMS4zLjE5IChNYXJjaCAyOCwgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBWYXJpZXR5IG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgMS4zLjE4IHJlbGVhc2UgaW5jbHVkaW5nOgoKICAgICAgICAgICAgICAgIC0gU2VnbWVudGF0aW9uIGZhdWx0IHdpdGggJWV4dGVuZCBkaXJlY3RpdmUuCiAgICAgICAgICAgICAgICAtIFR5cGVtYXAgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gRXhwcmVzc2lvbiBldmFsdWF0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gTGFyZ2UgbWVtb3J5IGxlYWsgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uCgpWZXJzaW9uIDEuMy4xOCAoTWFyY2ggMjMsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzIxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdHdvIHByb2JsZW1zIHdpdGggdGhlICVleHRlbmQgZGlyZWN0aXZlLCBvdmVybG9hZGluZywgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlIGV4cGFuc2lvbi4gIFNlZSB0aGUgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZCcgYW5kCiAgICAgICAgICAgICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWRfMicgdGVzdHMgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZSBmb3IKICAgICAgICAgICAgZGV0YWlscy4KCjAzLzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEFkZGVkIHNvbWUgdHlwZW1hcHMgYXMgc3VnZ2VzdGVkIGJ5IEFuZHJlYXMgU2Nob2VyayBmb3IgaGFuZGxpbmcKICAgICAgICAgICAgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgb3IgYnkgcmVmZXJlbmNlLiBUaGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcHV0IGluIHR5cGVtYXBzLmkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgQysrIHNjb3BpbmcgYnVnIHJlbGF0ZWQgdG8gY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IEZvbzo6YmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSwgU1dJRyBqdXN0IHRvc3NlZCBvdXQgdGhlIEZvbzo6YmFyKCkgZGVjbGFyYXRpb24uIE5vdywKICAgICAgICAgICAgdGhlIGRlY2xhcmF0aW9uIGlzIHdyYXBwZWQgcHJvdmlkZWQgdGhhdCB0aGUgcHJlZml4IGlzIGV4YWN0bHkgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgdGhlIGN1cnJlbnQgc2NvcGUgKGluY2x1ZGluZyBhbnkgZW5jbG9zaW5nIG5hbWVzcGFjZXMpLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcnVjZSBMb3dlcnkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDY5NjUxNiBdIEVuYWJsaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nIGZvciBkYXRhIG1lbWJlciBhY2Nlc3MuCiAgICAgICAgICAgIEluIHNvbWUgY29tcGlsZXJzLCBhdHRyaWJ1dGUgYWNjZXNzIGNhbiBnZW5lcmF0ZSBleGNlcHRpb25zLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBvcmRpbmFyaWx5IGFzc3VtZXMgdGhhdCBubyBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLiAgVG8gZGlzYWJsZSB0aGlzLAogICAgICAgICAgICB1c2UgdGhlICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKSBGb286Ong7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeDsgICAgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFlha292IE1hcmtvdml0Y2guIAogCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFBhdGNoLiBbIDcwMTg2MCBdIEltcHJvdmUgUGVyZm9ybWFuY2UgKHB5dGhvbiBwcm94aWVzKS4KICAgICAgICAgICAgR2l2ZXMgYSBwZXJmb3JtYW5jZSBib29zdCB0byBwcm94eSBjbGFzcyBjb2RlIGFuZCB0aGUgbWFuYWdlbWVudCBvZiB0aGUKICAgICAgICAgICAgLnRoaXMgYW5kIC50aGlzb3duIGF0dHJpYnV0ZXMuICBDb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgowMy8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBBZGRlZCBtaXNzaW5nIHZhcmFyZyBzdXBwb3J0LgoKMDMvMTgvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgUmVtb3ZlZCBjb2RlIHJlbGF0ZWQgdG8gdGFnZ2luZyBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIGRpcmVjdG9ycy4KCSAgICBUaGUgY29uY2VwdCBvZiBoYXZpbmcgZGlyZWN0b3JzIGZvciBzb21lIGJ1dCBub3QgYWxsIHZpcnR1YWwgbWV0aG9kcwoJICAgIG9mIGEgY2xhc3MgaXMgZGVlcGx5IGZsYXdlZC4gIFRoZSAlZmVhdHVyZSgibm9kaXJlY3RvciIpIHRhZyBpcyBhbHNvCgkgICAgZ29uZS4gIAoJICAgIAoJICAgIERpcmVjdG9ycyBhcmUgb2ZmIGJ5IGRlZmF1bHQuICBUbyBlbmFibGUgdGhlbSBmb3IgYSBjbGFzcywgaXNzdWUKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBjbGFzc25hbWU7IHdoaWNoIHdpbGwgY3JlYXRlIGRpcmVjdG9yIG1ldGhvZHMKCSAgICBmb3IgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MuCgowMy8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBwYXNzaW5nIGFyZ3VtZW50cyBvZiB0eXBlIGZ1bmN0aW9uLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCB4KGludCwgaW50KSk7CgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCB4KTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucywgdGhpcyB3b3VsZCBwcm9kdWNlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLiAgTm93LAogICAgICAgICAgICBTV0lHIG1lcmVseSBhZGRzIGFuIGV4dHJhIHBvaW50ZXIsIG1ha2luZyB0aGVzZSBkZWNsYXJhdGlvbnMgdGhlIHNhbWUKICAgICAgICAgICAgYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCAoKngpKGludCwgaW50KSk7CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90ICp4KTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdhcnRoIEJ1c2hlbGwuCgowMy8xNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCB0aGUgcmV0dXJuIHN0YXRlbWVudCBmb3IgZGlyZWN0b3IgYmFzZSBjbGFzcyBjYWxscyB0aGF0IGhhdmUgbm8KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLgoKMDMvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb25zdCBzbWFydC1wb2ludGVyIHdyYXBwaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgb25seSAieCIgYW5kICJiYXIiIGFyZSB2aXNpYmxlIGZyb20gQmxhaCAoc2luY2UgYXBwbGljYXRpb24KICAgICAgICAgICAgb2Ygc3BhbSB2aW9sYXRlcyBjb25zdG5lc3MpLiAgTW9yZW92ZXIsIGFjY2VzcyB0byAieCIgaXMgcmVhZC1vbmx5LgogICAgICAgICAgIAowMy8xNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDbGVhbmVkIHVwIHR3byBzaWduZWQgdmVyc3VzIHVuc2lnbmVkIGNvbXBhcmlzb25zIGluIHB5dGhvbi9zdGRfdmVjdG9yLmkuCgkgICAgCjAzLzE1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEdsb2JhbCB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGdldCBhbmQgc2V0IG1ldGhvZHMuCiAgICAgICAgICAgIE1lbWJlciB2YXJpYWJsZSB3cmFwcGluZyBidWcgZml4ZXMsIGZvciBleGFtcGxlIHdyYXBwaW5nIHBvaW50ZXJzIHdvcmsgbm93LgogICAgICAgICAgICBUeXBlbWFwcyBhcmUgdXNlZCBmb3IgYWxsIHZhcmlhYmxlIHdyYXBwaW5nIHRvIGdlbmVyYXRlIHRoZSBwcm9wZXJ0eSBjb2RlLgoKMDMvMTMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIHZpcnR1YWwgbWV0aG9kIHVucm9sbGluZyBmb3IgZGlyZWN0b3JzLiAKCSAgICBUaGUgb3JkZXIgb2YgdW5yb2xsaW5nIGlzIG5vdyBmcm9tIGJhc2UgdG8gZGVyaXZlZCwgdG8gZW5zdXJlCgkgICAgdGhhdCB0aGUgbW9zdCBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGlyZWN0b3IgbWV0aG9kIGlzCgkgICAgZm91bmQuCgoJICAgIERpcmVjdG9yIG1ldGhvZHMgZm9yIHB1cmUgdmlydHVhbCBtZXRob2RzIG5vdyB0aHJvdwoJICAgIERJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04gaWYgX3VwIGlzIHNldC4KCjAzLzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIFBvbHltb3JwaGlzbSBmaXg6IHZpcnR1YWwgZnVuY3Rpb25zIG5vdyB1c2UgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIEMjIHByb3h5IGNsYXNzLCB2aXJ0dWFsIG9yIG92ZXJyaWRlLgogICAgICAgICAgICBTb21lICd1c2luZyBTeXN0ZW07JyBzdGF0ZW1lbnQgZml4ZXMgbmVlZGVkIGJ5IHRoZSBNb25vIGNvbXBpbGVyLgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBvZiBTd2lnVmFsdWVXcmFwcGVyPD4gdG8KICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3NlcyB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJ1Y2UgTG93ZXJ5LgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBUaGUgJGRlc2NyaXB0b3IodHlwZSkgdmFyaWFibGUgaXMgbm93IGV4cGFuZGVkIGluIGNvZGUgc3VwcGxpZWQgdG8KICAgICAgICAgICAgJWV4dGVuZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluIGtpbmRzIG9mIGFkdmFuY2VkIHdyYXBwaW5nIAogICAgICAgICAgICAoZXNwZWNpYWxseSBjb250YWluZXIgY2xhc3NlcykuCgowMy8xMS8yMDAzOiBsdWlnaQogICAgICAgICAgICBTdXBwb3J0IGZvciBzdGQ6Om1hcC4KICAgICAgICAgICAgKGEpIEludGVncmF0aW9uIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlIChhIGxhIHN0ZDo6dmVjdG9yKSBmb3IKICAgICAgICAgICAgICAgIFB5dGhvbiwgUnVieSwgTXpTY2hlbWUsIGFuZCBHdWlsZTsKICAgICAgICAgICAgKGIpIFNpbXBsZSB3cmFwcGVyIGZvciBvdGhlciBsYW5ndWFnZXMKCjAzLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgU1dJRwogICAgICAgICAgICB3YXNuJ3QgcGFyc2luZyBjZXJ0YWluIG9jdGFsIGNvZGVzIGNvcnJlY3RseS4KCjAzLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHN1YnRsZSBwcmVwcm9jZXNzb3IgcHJvYmxlbXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2ViYXN0aWVuIFJlY2lvLgoKICAgICAgICAgICAgKGEpIEVtcHR5IHByZXByb2Nlc3NvciB2YWx1ZXMgbm8gbG9uZ2VyIGdlbmVyYXRlICJiYWQgY29uc3RhbnQKICAgICAgICAgICAgdmFsdWUiIGVycm9ycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08KICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08gQkFSCgogICAgICAgICAgICAoYikgTWFjcm8gbmFtZXMgY2FuIG5vdyBzcGFuIG11bHRpcGxlIGxpbmVzICh0ZWNobmljYWxseSB2YWxpZCwKICAgICAgICAgICAgYWx0aG91Z2ggcXVlc3Rpb25hYmxlIHByYWN0aWNlKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBBX0xPTkdfTUFDUk9fXAogICAgICAgICAgICAgICAgICBOQU1FIDQyCgogICAgICAgICAgICAoYykgV2hpdGVzcGFjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYmVmb3JlIGNlcnRhaW4gbWFjcm8gdmFsdWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIkhlbGxvIgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEJBUlwKICAgICAgICAgICAgICAgICAgIkhlbGxvIgogCjAzLzA3LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVtYXBzCiAgICAgICAgICAgIGluIHRoZSBMaWIvcnVieS90eXBlbWFwcy5pIGxpYnJhcnkgZmlsZS4KCjAzLzA3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9jYWxsYmFjayB0byBkZW1vc3RyYXRlIGhvdyBkaXJlY3RvcnMgY2FuCgkgICAgYmUgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzIGluIFB5dGhvbgoJICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9leHRlbmQgdG8gZGVtb25zdHJhdGUgdmlydHVhbCBtZXRob2QKCSAgICBjYWxscyBmcm9tIEMrKyB0byBQeXRob24gKHJlYWxseSB0aGUgc2FtZSBhcyB0aGUgY2FsbGJhY2sKCSAgICBleGFtcGxlLCBqdXN0IGEgZGlmZmVyZW50IGNvbnRleHQpLgoJICAgIEFkZGVkIGZvdXIgdGVzdHMgZm9yIHZlcnkgYmFzaWMgZGlyZWN0b3IgZnVuY3Rpb25hbGl0eS4gIFRoZXNlCgkgICAgaGF2ZSBydW50aW1lIHRlc3RzIHVuZGVyIHB5dGhvbi4KCSAgICBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW1pdHMgI2RlZmluZSBTV0lHX0RJUkVDVE9SUyBuZWFyIHRoZQoJICAgIHRvcCBvZiB0aGUgb3V0cHV0IGZpbGUgaWYgZGlyZWN0b3JzIGFyZSBlbmFibGVkLiAgVGhpcyBpcyB1c2VmdWwKCSAgICBmb3IgZGlzYWJsaW5nIHBhcnRzIG9mIHRlc3RzIGluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkb24ndAoJICAgIHN1cHBvcnQgZGlyZWN0b3JzLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBzZWN0aW9uIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgb24gY3Jvc3MgbGFuZ3VhZ2UKCSAgICBwb2x5bW9ycGhpc20gKGRpcmVjdG9ycykuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBUaGUgc2hvcnQtbGl2ZWQgIi1mZGlyZWN0b3JzIiBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFRvIGVuYWJsZSBkaXJlY3RvcnMsIGluc3RlYWQgdXNlIHRoZSBleHRlbmRlZCAlbW9kdWxlIAoJICAgIGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgoKCSAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiKSBtb2R1bGVuYW1lCgowMy8wNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIGxvbmcgbG9uZyB0eXBlbWFwcyBoYXZlIGJlZW4gcmV3cml0dGVuIHNvIHRoYXQgdGhleSBjYW4gYmUgbW9yZQogICAgICAgICAgICBlYXNpbHkgdXNlZCB3aXRoIG5vbiBJU08gY29tcGlsZXJzLCBsaWtlIFZpc3VhbCBDKysuIEZvciBleGFtcGxlCiAgICAgICAgICAgIGlmIHlvdSBhcmUgd3JhcHBpbmcgdGhlIFdpbmRvd3MgNjQgYml0IHR5cGUgX19pbnQ2NCB0aGUgbG9uZyBsb25nCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5OgoKICAgICAgICAgICAgICAgICVhcHBseSBsb25nIGxvbmcgeyBfX2ludDY0IH07CiAgICAgICAgICAgICAgICBfX2ludDY0IHZhbHVlMShfX2ludDY0IHgpOwoKICAgICAgICAgICAgX19pbnQ2NCB3aWxsIG5vdyBhcHBlYXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgbG9uZyBsb25nLgogICAgICAgICAgICAKMDMvMDYvMjAwMzogYmVhemxleQogICAgICAgICAgICAqKiogREVWRUxPUEVSIENIQU5HRSAqKioKICAgICAgICAgICAgU3dpZyBtb2R1bGUgbXV0YXRpb24gaGFzIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIFdoZW4gYSBsYW5ndWFnZQogICAgICAgICAgICBjbGFzcyBtZXRob2Qgd2FudHMgdG8gc2F2ZSBub2RlIGF0dHJpYnV0ZXMsIGl0IG5vdyB1c2VzIG9uZSBvZiB0aGUKICAgICAgICAgICAgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpCiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgpCgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlc2UgZnVuY3Rpb25zIGlzIGEgbmFtZXNwYWNlIGluIHdoaWNoCiAgICAgICAgICAgIHNhdmVkIGF0dHJpYnV0ZXMgYXJlIHBsYWNlZC4gIEZvciBleGFtcGxlLHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICAgTm9kZSAqbjsKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCJjRGVjbGFyYXRpb24iLG4sInR5cGUiLCJwYXJtcyIsIm5hbWUiLE5JTCk7CgogICAgICAgICAgICBzYXZlcyB0aGUgYXR0cmlidXRlcyBhcyAiY0RlY2xhcmF0aW9uOnR5cGUiLCAiY0RlY2xhcmF0aW9uOnBhcm1zIiwKICAgICAgICAgICAgYW5kIHNvIGZvcnRoLiAgIElmIG5lY2Vzc2FyeSwgYSBsYW5ndWFnZSBtb2R1bGUgY2FuIHJlZmVyIHRvCiAgICAgICAgICAgIG9sZCB2YWx1ZXMgYnkgdXNpbmcgdGhpcyBzcGVjaWFsIG5hbWVzcGFjZSBxdWFsaWZpZXIuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBhIHNwZWNpYWwgYXR0cmlidXRlICJ2aWV3IiBjb250YWlucyB0aGUgbmFtZQogICAgICAgICAgICBvZiB0aGUgbGFzdCBuYW1lc3BhY2UgdXNlZCB0byBzYXZlIGF0dHJpYnV0ZXMuICBJbiB0aGUgYWJvdmUgCiAgICAgICAgICAgIGV4YW1wbGUsICJ2aWV3IiB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAiY0RlY2xhcmF0aW9uIi4gICBUaGUgdmFsdWUKICAgICAgICAgICAgb2YgImNEZWNsYXJhdGlvbjp2aWV3IiB3b3VsZCBoYXZlIHRoZSBwcmV2aW91cyB2aWV3IGFuZCBzbyBmb3J0aC4KCiAgICAgICAgICAgIFN3aWdfcmVzdG9yZShuKSByZXN0b3JlcyBhIG5vZGUgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbGFzdAogICAgICAgICAgICBTd2lnX3JlcXVpcmUoKSBvciBTd2lnX3NhdmUoKSBjYWxsLgoKICAgICAgICAgICAgTm90ZTogIFRoaXMgY2hhbmdlIG1ha2VzIGl0IGVhc2llciBmb3IgbGFuZ3VhZ2UgbW9kdWxlcyB0byByZWZlcgogICAgICAgICAgICB0byBvbGQgdmFsdWVzIG9mIGF0dHJpYnV0ZXMuICAKCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNZXJnZWQgdGhlIGNyb3NzLWxhbmd1YWdlIHBvbHltb3JwaGlzbSBwYXRjaC4gIFdoZW4gZW5hYmxlZCwgQysrIAoJICAgICJwcm94eSIgY2xhc3NlcyAoY2FsbGVkIGRpcmVjdG9ycykgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzcGVjaWZpZWQgCgkgICAgQysrIGNsYXNzLiAgRGlyZWN0b3JzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiwgc2ltaWxhciAKCSAgICB0byB0aGUgd2F5IHRoZSB1c3VhbCBwcm94eSAoc2hhZG93KSBjbGFzc2VzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gCgkgICAgUHl0aG9uIHRvIEMrKy4gIFRvZ2V0aGVyLCB0aGVzZSB0d28gdHlwZXMgb2YgcHJveGllcyBhbGxvdyBDKysgCgkgICAgY2xhc3NlcyB0aGF0IGFyZSBleHRlbmRlZCBpbiBQeXRob24gdG8gYmVoYXZlIGp1c3QgbGlrZSBvcmRpbmFyeSAKCSAgICBDKysgY2xhc3NlcyBhbmQgYmUgdXNlZCBpbiBDKysgbGlrZSBuYXRpdmUgb2JqZWN0cy4gIAoJICAgIAoJICAgIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCB2ZXJ5IGV4cGVyaW1lbnRhbCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICBUbyBlbmFibGUgZGlyZWN0b3Igc3VwcG9ydCwgc3BlY2lmeSAnLWZkaXJlY3RvcnMnIG9uIHRoZSBTV0lHIGNvbW1hbmQKCSAgICBsaW5lIG9yIGluIHRoZSBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW4gdGhlIGludGVyZmFjZQoJICAgIGZpbGUsIGFkZCAlZmVhdHVyZSgiZGlyZWN0b3IiKSB0byBnZW5lcmF0ZSBkaXJlY3RvcnMgZm9yIGFsbCBjbGFzc2VzCgkgICAgdGhhdCBoYXZlIHZpcnR1YWwgbWV0aG9kcy4gIAoJICAgIAoJICAgIFNlZSBodHRwOi8vc3RtLmxibC5nb3YvfnRtMi9zd2lnL1Byb3h5RG9jLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KCSAgICAKCjAzLzAzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzbWFsbCBnbGl0Y2ggaW4gdHlwZW1hcCBsb2NhbCB2YXJpYWJsZSByZXBsYWNlbWVudC4gIElmIHlvdSBoYWQKICAgICAgICAgICAgYSB0eXBlbWFwIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgKCQxX3R5cGUgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gLi4uOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIG5vIG9jY3VycmVuY2Ugb2YgIiQxX3R5cGUiIGFwcGVhcmVkIGluIHRoZSBib2R5LCB0aGVuIHRoZSBsb2NhbAogICAgICAgICAgICB2YXJpYWJsZSB0eXBlIHdvdWxkbid0IGJlIHN1YnN0aXR1dGVkLgoKMDMvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IHZlcnNpb24gb2YgdGhlIENTaGFycCBtb2R1bGUgd2hpY2ggaXMgdHlwZW1hcCBiYXNlZC4KICAgICAgICAgICAgSXQgYWxzbyB1c2VzIEVDTUEgQyMgYW5kIG5vIGxvbmdlciB1c2VzIE1pY3Jvc29mdCBWaXN1YWwgQysrLk5FVCAKICAgICAgICAgICAgZ2x1ZS4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE5laWwgQ2F3c2UuCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUzNTQ4IF0gZXJyb3IgcGFyc2luZyBjYXN0aW5nIG9wZXJhdG9yIGRlZmluaXRpb24uCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgY2FzdGluZyBvcGVyYXRvcnMgZGVjbGFyZWQgb3V0c2lkZSBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbmxpbmUgQTo6b3BlcmF0b3IgY2hhciAqKCkgeyAuLi4gfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcnRpbiBDYXNhZG8uCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFub255bW91cyBiaXQtZmllbGRzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICAgaW50IHggOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50IHkgOiA4OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbm9ueW1vdXMgYml0LWZpZWxkcyBhcmUgaWdub3JlZCBieSBTV0lHLiAgIFByb2JsZW0KICAgICAgICAgICAgcmVwb3J0ZWQgYnkgRnJhbnogSPZwZmluZ2VyLgoKMDIvMjYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgdHlwZW1hcHMgaW4gdGhlIEV4YW1wbGVzL2phdmEvdHlwZW1hcCBleGFtcGxlIGFuZCBhbHNvIAogICAgICAgICAgICBmaXhlcyBzdWJ0bGUgYnVnIHdoZW4gdXNpbmcgdGhlIFN0cmluZ0J1ZmZlciB0eXBlbWFwcyBtb3JlIHRoYW4gb25jZS4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDIxMTIgXSBDb25zdGFudHMgY2hhciBidWcuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1MzM3IF0gUGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBub3QgZW50aXJlbHkgd29ya2luZy4KICAgICAgICAgICAgVGhlcmUgd2FzIGEgc3VidGxlIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgbmFtaW5nIGFuZCBvcmRlcmluZyBvZgogICAgICAgICAgICB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cy4gIE1hdGNoaW5nIHdvcmtlZCBva2F5LAogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIHRlbXBsYXRlcyB3ZXJlbid0IGV4cGFuZGVkIGNvcnJlY3RseS4KCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHBhcnNpbmcgKGFuZCBnZW5lcmF0aW5nIGNvZGUpIGZvciAKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBhcnJheXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgZm9vKGludCAoJngpWzEwXSk7CiAgCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUzNDcgXSBDb21waWxhdGlvbiB3YXJuaW5nIGZyb20gbGlicHkuYy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGFuaWVsIEwuIFJhbGwuCiAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdmlydHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgY2hlY2tpbmcgYW5kIHR5cGVkZWYuCgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICppbnRwdHI7CgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAqZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnRwdHIgZm9vKCkgeyB9OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cmVhdGluZyB0aGVzZSBkZWNsYXJhdGlvbnMgYXMgZGlmZmVyZW50IGV2ZW4gdGhvdWdoCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lICh2aWEgdHlwZWRlZikuCgowMi8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgcmFuZ2UgY2hlY2tpbmcgZm9yIHRoZSBOVU0yVVNIUlQgbWFjcm8sIHBlciBbIDY3NTM1MyBdLgoKMDIvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdGhlIGNvZGUgdGhhdCBkZXRlcm1pbmVkIGlmIGEgY2xhc3MgaXMgYWJzdHJhY3QKICAgICAgICAgICAgYW5kIGNhbiBiZSBpbnN0YW50aWF0ZWQuICAgIElmIHlvdSBoYWQgY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiB2aXJ0dWFsIEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDIDogdmlydHVhbCBBIHsgCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAvKiBOb3RlIG9yZGVyIG9mIGJhc2UgY2xhc3NlcyAqLwkKICAgICAgICAgICAgICAgICAgc3RydWN0IEQgOiBCLCBDIHsgfTsgICAgLyogT2sgKi8KICAgICAgICAgICAgICAgICAgc3RydWN0IEUgOiBDLCBCIHsgfTsgICAgLyogQnJva2VuICovCgogICAgICAgICAgICB0aGVuIFNXSUcgZGV0ZXJtaW5lZCB0aGF0IGl0IGNvdWxkIGluc3RhbnRpYXRlIEQoKSwgYnV0IG5vdCBFKCkuCiAgICAgICAgICAgIFRoaXMgaW5jb25zaXN0ZW5jeSBhcm9zZSBmcm9tIHRoZSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIAogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdG8gbG9jYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlydHVhbAogICAgICAgICAgICBtZXRob2RzLiAgIFRoaXMgcHJvYmxlbSBzaG91bGQgbm93IGJlIGZpeGVkLS0tU1dJRyB3aWxsIGF0dGVtcHQKICAgICAgICAgICAgdG8gbG9jYXRlIGFueSB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgbWV0aG9kIGJ5CiAgICAgICAgICAgIHRyYXZlcnNpbmcgb3ZlciB0aGUgZW50aXJlIGhpZXJhcmNoeS4KCjAyLzIyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB1c2luZyBlbnVtIHR5cGVtYXBzLiBUaGUgSmF2YSBmaW5hbCBzdGF0aWMgdmFyaWFibGUgdHlwZQogICAgICAgICAgICBjYW4gYmUgc2V0IHVzaW5nIHRoZSBqc3R5cGUgdHlwZW1hcCwgZW5hYmxpbmcgZW51bXMgdG8gYmUgbWFwcGVkIHRvIAogICAgICAgICAgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnQuIEJ1ZyByZXBvcnRlZCBieSBIZWluZXIgUGV0aXRoLgoKMDIvMjEvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCBDU2hhcnAgKEMjKSBtb2R1bGUgcHJvdG90eXBlCiAgICAgICAgICAgIGkuZS4gY3NoYXJwLmN4eCAmIGNzaGFycC5oIGF0IFNvdXJjZS9Nb2R1bGVzLy4KICAgICAgICAgICAgVGhleSBhcmUgZm9yIHRlc3QgdXNhZ2Ugb25seSBub3cgYW5kIG5lZWQgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgYWxzbyBuZWVkIHRvIGJlIG1vZGlmaWVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgIAowMi8yMC8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIHdpdGggLWZ2aXJ0dWFsLgogICAgICAgICAgICBTaW1pbGFyIGFzIGJlYXpsZXkncyBtb2RpZmljYXRpb24gdG9kYXkuCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGdjYy1zdHlsZSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgCiAgICAgICAgICAgIFBhdGNoIFsgNjIzMjU4IF0gR0NDLXN0eWxlIHZhcmFyZyBtYWNybyBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2UgTWFzb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IGNsYXNzZXMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhpbnQgeCkgPSAwOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhJbnRlZ2VyIHgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgZ2V0dGluZyBjb25mdXNlZCBhYm91dCB0aGUgbGF0dGVyIG1ldGhvZC0tLW1ha2luZyBCYXIKICAgICAgICAgICAgYWJzdHJhY3QuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlamF2YWNvbnN0KGZsYWcpIGNhbiBhbHNvIGJlIHVzZWQgb24gZW51bXMgYXMgd2VsbCBhcyBjb25zdGFudHMuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRydWUgSmF2YSBjb21waWxlciBjb25zdGFudHMgc28gdGhhdCB0aGV5IGNhbiBiZSAKICAgICAgICAgICAgdXNlZCBpbiBKYXZhIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gSGVpbmVyIFBldGl0aCBmb3IgcGF0Y2hlcy4KCjAyLzE5LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgTW9kaWZpZWQgLWZjb21wYWN0IGZlYXR1cmUgdG8gZGVhbCB3aXRoIFBQIGxpbmVzCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg5MDQwIF0gTWlzc2luZyByZXR1cm4gdmFsdWUgaW4gc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2JlcnQgSC4gZGUgVnJpZXMuCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgZmV3IGV2aWwgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHRlbXBsYXRlcywgbmFtZXNwYWNlcywgYW5kIHRoZQogICAgICAgICAgICAlZXh0ZW5kIGRpcmVjdGl2ZS4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoKMDIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtSdWJ5XSBJbXByb3ZlZCBzdXBwb3J0IGZvciBWaXN1YWwgQysrIGFuZCBvdGhlciBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuIAogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgIi9FWFBPUlQ6SW5pdF88bW9kdWxlPiIsIHdoZXJlIDxtb2R1bGU+IGlzIHRoZQogICAgICAgICAgICBzd2lnIG1vZHVsZSBuYW1lIHdoZW4gbGlua2luZyB1c2luZyB0aGVzZSBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuCgowMi8xNS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1mdmlydHVhbCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyByZWRpZmluZWQgdmlydHVhbCBmdW5jdGlvbiBpbiBjaGlsZHJlbiBjbGFzc2VzLgoKICAgICAgICAgICAgTW9kaWZpZWQgLWNvbXBhY3Qgb3B0aW9uIHRvIC1mY29tcGFjdCBvcHRpb24KCiAgICAgICAgICAgIEFkZGVkIC1zbWFsbCBvcHRpb24uCiAgICAgICAgICAgIC1zbWFsbCA9IC1mdmlydHVhbCAtZmNvbXBhY3QKICAgICAgICAgICAgQW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBmdXR1cmUgZmVhdHVyZSBvcHRpb25zLAogICAgICAgICAgICB3aGljaCBhcmUgdXNlZCB0byByZWR1Y2Ugd3JhcHBlciBmaWxlIHN6aWUuCgogICAgICAgICAgICBBZGRlZCBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlIGNoZWNrLgogICAgICAgICAgICBUbyBkeW5hbWljYWxseSBzZXQgdGhlIGZlYXR1cmUgb3B0aW9ucyBzdWNoIGFzIC1mY29tcGFjdCAmIC1mdmlydHVhbAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMi8xMy8yMDAzOiBsZW56CiAgICAgICAgICAgIFVwZGF0ZWQgRG9jL01hbnVhbC9QZXJsNS5odG1sIHRvIHRhbGsgYWJvdXQgQysrIGNvbXBpbGUgcHJvYmxlbXMKICAgICAgICAgICAgY29uZmlndXJlLmluIG5vdyBjaGVja3MgZm9yIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgUnVudGltZS9NYWtlZmlsZS5pbiBhbmQgRXhhbXBsZS9NYWtlZmlsZS5pbiBub3cgdXNlIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgQWRkZWQgTGliL3Blcmw1L25vZW1iZWQuaCB3aGljaCBjb250YWlucyBhbGwgdGhlIGtub3duIG1hY3JvIGNvbmZsaWN0cwoKMDIvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4NTQxMCBdIEMrKyBFeHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhdXNlcyBTV0lHIHRvIGV4aXQuCiAgICAgICAgICAgIEZpeGVzIGEgc3ludGF4IGVycm9yIHdpdGggZGVjbGFyYXRpb25zIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIGluc3RhbnRpYXRpb24gYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZS4KICAgICAgICAgICAgV2UgbWlnaHQgZG8gbW9yZSBsYXRlci4gIFJlcG9ydGVkIGJ5IFRob21hcyBXaWxsaWFtc29uLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJld3JvdGUgYm9vbCB0eXBlbWFwcyB0byByZW1vdmUgcGVyZm9ybWFuY2Ugd2FybmluZyBmb3IgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIFZpc3VhbCBDKysuCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB3cmFwcGluZyByZWZlcmVuY2UgdmFyaWFibGVzIChjb25zdCBub24tcHJpbWl0aXZlIGFuZCBhbGwgbm9uLWNvbnN0IHR5cGVzKSAKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgaW50JiBpOwogICAgICAgICAgICAgIENsYXNzJiBjOwogICAgICAgICAgICAgIGNvbnN0IENsYXNzJiBjOwoKMDIvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBtb3JlIHZlcnkgc3VidGxlIHByZXByb2Nlc3NvciBjb3JuZXIgY2FzZXMgcmVsYXRlZCB0byByZWN1cnNpdmUKICAgICAgICAgICAgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBjYXQoeCx5KSB4ICMjIHkKCiAgICAgICAgICAgICAgICAgICBjYXQoY2F0KDEsMiksMykgICAgLy8gUHJvZHVjZXM6IGNhdCgxLDIpMwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIHhjYXQoeCx5KSBjYXQoeCx5KQoKICAgICAgICAgICAgICAgICAgIHhjYXQoeGNhdCgxLDIpLDMpICAvLyBQcm9kdWNlcyAxMjMKCiAgICAgICAgICAgIFNlZSBLJlIsIDJuZCBFZC4gcC4gMjMxLgoKMDIvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNjgzODgyIF0gLSBwYXRjaCBzdWJtaXR0ZWQgYnkgRi4gUG9zdG1hIGZvciBTV0lHIHRvIGNvbXBpbGUgb24gSFAtVVguCgowMi8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4gUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzEwLzIwMDM6IHNvbmd5YW5mCiAgICAgICAgICAgIEFkZGVkIC1jb21wYWN0IG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIGNvbW1lbnRzIGFuZCBjb21iaW5pbmcgc2hvcnQgbGluZXMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKIAowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUxMzU1IF0gU3ludGF4IGVycm9yIHdpdGggY3N0cmluZy5pCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE9tcmkgQmFyZWwuCgowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjYzNjMyIF0gaW5jb21wYXRpYmlsaXR5IHdpdGggc3RhbmRhcmQgY3BwLgogICAgICAgICAgICBUaGlzIGlzIGEgcmVmaW5lbWVudCB0aGF0IGZpeGVzIHRoaXMgcHJvYmxlbToKCiAgICAgICAgICAgICAgICAgLy8gU29tZSBtYWNybyB3aXRoIGFuIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08oeCkgICAgICAgeAoKICAgICAgICAgICAgICAgICBpbnQgRk9POyAgICAgICAgLyogTm90IGEgbWFjcm8tLS1ubyBhcmd1bWVudHMgKi8KIAowMi8wNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1NDkxIF0gcGFyc2UgZXJyb3Igd2l0aCBnbG9iYWwgbmFtZXNwYWNlIHF1YWxpZmljYXRpb24uCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBKZXJlbXkgWWFsbG9wLgoKMDIvMDQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdmFyYXJncyBwcm9jZXNzaW5nIGludHJvZHVjZWQgYnkgdGhlIG51bWlucHV0cyB0eXBlbWFwIHBhcmFtZXRlci4KCjAxLzA4LzIwMDM6IHR0bgoJICAgIFt4bWxdIEZpeCBzdHJpbmctcmVwbGFjZW1lbnQgb3JkZXJpbmcgYnVnbGV0LgoJICAgIFRoYW5rcyB0byBHYXJ5IEhlcnJvbi4KCjEyLzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGdXJ0aGVyIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gVGhlIFNXSUcgZXhlY3V0YWJsZSBpcyBub3cgYnVpbHQgdXNpbmcgYSBzaW5nbGUgTWFrZWZpbGUuCiAgICAgICAgICAgIC0gVGhpcyBtYWtlZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQXV0b21ha2UgKFNvdXJjZS9NYWtlZmlsZS5hbSkuCiAgICAgICAgICAgIC0gRGVwZW5kZW5jeSB0cmFja2luZyBhbmQgdGFncyBzdXBwb3J0IGFyZSBpbiB0aGlzIG1ha2VmaWxlLgogICAgICAgICAgICAtIEF1dG9tYWtlIDEuNy4yIGFuZCBBdXRvY29uZiAyLjU0IG1pbmltdW0gdmVyc2lvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBTV0lHIGZyb20gQ1ZTLgogICAgICAgICAgICAtIFJ1bm5pbmcgLi9hdXRvZ2VuLnNoIG5vdyBpbnN0YWxscyBBdXRvY29uZi9BdXRvbWFrZSBzdXBwb3J0IGZpbGVzIGludG8KICAgICAgICAgICAgICBUb29scy9jb25maWcgYW5kIHRoZXNlIGZpbGVzIGFyZSBubyBsb25nZXIgc3RvcmVkIGluIENWUy4KICAgICAgICAgICAgLSBCdWcgZml4ZXMgaW4gJ21ha2UgaW5zdGFsbCcgZm9yIHN5c3RlbXMgdXNpbmcgLmV4ZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBhbmQKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcmVsZWFzZS1zdWZmaXg9d2hhdGV2ZXIKCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb3JlIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gQXV0b2NvbmYncyBBQ19DQU5PTklDQUxfSE9TVCByZXBsYWNlcyBwcm9wcmlldGFyeSBhcHByb2FjaCBmb3IgZGV0ZWN0aW5nIGJ1aWxkIGhvc3QuCiAgICAgICAgICAgIC0gQXV0b2NvbmYgc3VwcG9ydCBmaWxlcyBtb3ZlZCB0byBUb29scy9jb25maWcuCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBydW4gb24gTWFjT1MsIHN1Ym1pdHRlZCBieSBCZXJuYXJkIERlc2dyYXVwZXMuCiAgICAgICAgICAgIE1haW5seSBlbnN1cmluZyBnZW5lcmF0ZWQgZmlsZXMgYXJlIG91dHB1dCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZvcgogICAgICAgICAgICBzb21lIG1vZHVsZXMuCgoxMi8xMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmFyaW91cyBidWlsZCBtb2RpZmljYXRpb25zIGFuZCBidWcgZml4ZXM6CiAgICAgICAgICAgIC0gU2ltcGxpZmljYXRpb24gb2YgdmVyc2lvbiBzdHJpbmcuIFVzZSBhdXRvY29uZidzIFBBQ0tBR0VfVkVSU0lPTiBpbnN0ZWFkLgogICAgICAgICAgICAtIEJ1aWxkIHRpbWUgcmVtb3ZlZCBmcm9tIFNXSUcgdmVyc2lvbi4KICAgICAgICAgICAgLSBVc2luZyBzdGFuZGFyZCBhdXRvY29uZiBjb25maWcgaGVhZGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIC0gVXBkYXRlZCBvbGQgYXV0b2NvbmYgbWFjcm9zIGFzIHJlcG9ydGVkIGJ5IGF1dG91cGRhdGUuCiAgICAgICAgICAgIC0gUmVtb3ZlZCAkcHJlZml4IGluIGF1dG9jb25mIGZyb20gc2VhcmNoIHBhdGhzIGFzIGF1dG9jb25mIHdvbid0IGV4cGFuZCB0aGVtLgogICAgICAgICAgICAtIFN1YnRsZSBidWcgZml4IHdoZXJlICdtYWtlIHByZWZpeD0vc29tZXdoZXJlOyBtYWtlIGNsZWFuOyBtYWtlIHByZWZpeD0vc29td2hlcmUvZWxzZScKICAgICAgICAgICAgICBwcm9kdWNlZCBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBpbmNvcnJlY3QgbGlicmFyeSBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSBBZGRlZCAtbGRmbGFncyBjb21tYW5kbGluZSBvcHRpb24gZm9yIE16U2NoZW1lLCBPY2FtbCwgUGlrZSBhbmQgUEhQLgogICAgICAgICAgICAtIEZpeGVkIHJlcG9ydGluZyBvZiBjb21waWxlciB1c2VkIHdoZW4gdXNpbmcgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICAtIFNXSUcgd2ViIGFkZHJlc3MgYWRkZWQgdG8gLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgoKMTIvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBmaXggdG8gVGNsIGR5bmFtaWMgY2FzdCB0eXBlbWFwcy4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgS3Jpc3RvcGhlciBCbG9tLgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdGVtcGxhdGUgYXJndW1lbnQgcmVwbGFjZSBidWcuICBSZXBvcnRlZCBieQogICAgICAgICAgICBDaHJpcyBGbGF0bGV5LgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXZlcnRlZCBDSEFOR0VTIDA5LzAzLzIwMDIsIHByZXByb2Nlc3NvciBhcmd1bWVudCBldmFsdWF0aW9uLiAgQXJndW1lbnRzCiAgICAgICAgICAgIGFyZSBub3QgZXZhbHVhdGVkIGR1cmluZyBjb2xsZWN0aW9uLCBLJlIsIHAuIDIzMC4KCjEyLzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDkwMjIgXSBDb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIEtBSS9LQ0MKCjEyLzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyAncmVsLTEtMycgQ1ZTIGJyYW5jaCBtZXJnZWQgYmFjayBpbnRvIHRoZSBtYWluIGJyYW5jaC4KCgpWZXJzaW9uIDEuMy4xNyAoTm92ZW1iZXIgMjIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTM5MjIgXSBwcmVwcm9jZXNzb3IgZXJyb3JzIHdpdGggSEFWRV9MT05HX0xPTkcuCiAgICAgICAgICAgIAoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjE1NDgwIF0gbXpzY2hlbWUgU1dJR19NdXN0R2V0UHRyXy4KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUxMTkgXSBTV0lHX2Nyb2FrIGNhdXNlcyBjb21waWxlciB3YXJuaW5nLgoKMTEvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgdG8gY2xhc3MgbWVtYmVycy4KCjExLzE1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogT3ZlcmxvYWRlZCBDKysgZnVuY3Rpb25zIHdoaWNoIGNhbm5vdCBiZSBvdmVybG9hZGVkIGluIEphdmEgCiAgICAgICAgICAgIG9uY2UgYWdhaW4gaXNzdWUgYSB3YXJuaW5nLgoKMTEvMTQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBIYW5kbGluZyBvZiBOVUxMIHBvaW50ZXJzIGlzIGltcHJvdmVkLiBBIGphdmEgbnVsbCBvYmplY3Qgd2lsbCBub3cKICAgICAgICAgICAgYmUgdHJhbnNsYXRlZCB0byBhbmQgZnJvbSBhIE5VTEwgQy9DKysgcG9pbnRlciBieSBkZWZhdWx0LiBQcmV2aW91c2x5IHdoZW4gCiAgICAgICAgICAgIHdyYXBwaW5nOgoKICAgICAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzcyB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyAqcyk7CgogICAgICAgICAgICBhbmQgaXQgd2FzIGNhbGxlZCBmcm9tIEphdmEgd2l0aCBudWxsOgoKICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKG51bGwpCgogICAgICAgICAgICBhIEphdmEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4gRXh0cmEgdHlwZW1hcHMgaGFkIHRvIGJlIHdyaXR0ZW4gaW4KICAgICAgICAgICAgb3JkZXIgdG8gb2J0YWluIGEgTlVMTCBwb2ludGVyIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGxpa2UgdGhpcyBvbmUuIE5vdyB0aGUgCiAgICAgICAgICAgIGRlZmF1bHQgd3JhcHBpbmcgd2lsbCBkZXRlY3QgJ251bGwnIGFuZCB0cmFuc2xhdGUgaXQgaW50byBhIE5VTEwgcG9pbnRlci4KICAgICAgICAgICAgQWxzbyBpZiBhIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHBvaW50ZXIsIGVnOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIFNvbWVDbGFzcyAqYmFyKCkgeyByZXR1cm4gTlVMTDsgfQogICAgICAgICAgICAKICAgICAgICAgICAgVGhlbiB0aGlzIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIGEgU29tZUNsYXNzIHByb3h5IGNsYXNzIGhvbGRpbmcgYSBOVUxMCiAgICAgICAgICAgIHBvaW50ZXIuIE5vdyBudWxsIGlzIHJldHVybmVkIGluc3RlYWQuIFRoZXNlIGNoYW5nZXMgYXJlIHN1YnRsZSBidXQgdXNlZnVsLgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUgb3JpZ2luYWwgdHlwZW1hcHM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJCZqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJGphdmFjbGFzc25hbWUoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgoxMS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBtZXRob2RzIGFuZCBzaWduYXR1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICAgbWV0aChpbnQgbWV0aF9wYXJhbSkgPSAwOyAKICAgICAgICAgICAgfTsgCiAKIAogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9iYXIgOiBwdWJsaWMgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICBpbnQgbWV0aChpbnQgbWV0aF9wYXJhbV8xLCBpbnQgbWV0aF9wYXJhbV8yKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFic3RyYWN0X2JhciBpcyBzdGlsbCBhYnN0cmFjdC4KCiAgICAgICAgICAgIEZpeGVzIFsgNjI4NDM4IF0gRGVyaXZlZCBhYnN0cmFjdCBjbGFzcyBub3QgYWJzdHJhY3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGFuZCBwYXRjaGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBtYXRjaGluZyBwcm9ibGVtIHdpdGggdHlwZW1hcHMgYW5kIGFycmF5IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgIGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyIGJsYWhbMjBdOwoKICAgICAgICAgICAgYW5kIGEgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gJDFfZGltMCAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiAkMV9kaW0qIHZhcmlhYmxlcyB3ZXJlbid0IGJlIGV4cGFuZGVkIHByb3Blcmx5LiAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhbmthaiBLdW1hciBHb2VsLgogICAgICAgICAgICAgICAKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCBuZXcgbW9kdWxlIHRoYXQgZHVtcHMgU1dJRydzIHBhcnNlCgkgICAgdHJlZSBhcyAoQ29tbW9uKSBMaXNwIHMtZXhwcmVzc2lvbnMuICBUaGUgbW9kdWxlIGlzCgkgICAgaW52b2tlZCB3aXRoIFNXSUcncyAtc2V4cCBjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhlIG91dHB1dAoJICAgIGNhbiBiZSByZWFkIGludG8gQ29tbW9uIExpc3AuICBUaGVyZSBpcyAocHJvdG90eXBlKQoJICAgIGV4YW1wbGUgTGlzcCBjb2RlIHRoYXQgZ2VuZXJhdGVzIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCgkgICAgZGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIEtldmluIFJvc2VuYmVyZydzIFVGRkkuCgoJICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgUmVtb3ZlZCBkdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgImNwcF90ZW1wbGF0ZV9kZWNsIiBpbgoJICAgIHBhcnNlci55OyBiaXNvbiAxLjc1IGNvbXBsYWluZWQuCgoxMS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlZmF1bHQgcHJpbWl0aXZlIGFycmF5IGhhbmRsaW5nIGhhcyBjaGFuZ2VkIGxpa2UgYXJyYXlzIG9mIGNsYXNzZXMuIAogICAgICAgICAgICBDIHByaW1pdGl2ZSBhcnJheXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGEgSmF2YSBhcnJheSBidXQgd2l0aCBhIHBvaW50ZXIgCiAgICAgICAgICAgICh0eXBlIHdyYXBwZXIgY2xhc3MpLiBBZ2FpbiB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAKICAgICAgICAgICAgVGhlIG9yaWdpbmFsIHR5cGVtYXBzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGFycmF5c19qYXZhLmksIHNvIHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBtZXJlbHkgaW5jbHVkaW5nIHRoaXMgZmlsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKCiAgICAgICAgICAgIFRoZSBhcnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGV5IGFyZSBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGluY2x1ZGluZyB0aGlzIGZpbGUsIHRodXMgdGhpcyBvZnRlbiB1bnVzZWQgY29kZSBpcyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHNwZWNpZmljYWxseSByZXF1aXJpbmcgdGhpcyB0eXBlIG9mIGFycmF5IHN1cHBvcnQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgbmVzdGVkIG1vZHVsZSBkZWNsYXJhdGlvbnMgKGFzIHdhcwogICAgICAgICAgICBwcmV2aW91c2x5IGFkZGVkIGZvciB0aGUgUGVybCBtb2R1bGUpLiBTbyBhICVtb2R1bGUgZGlyZWN0aXZlCiAgICAgICAgICAgIG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIk91dGVyOjpJbm5lcjo6Rm9vIgoKICAgICAgICAgICAgd2lsbCBuZXN0IGV2ZXJ5dGhpbmcgYXMgKGluIFJ1YnkgY29kZSk6CgogICAgICAgICAgICAgICAgbW9kdWxlIE91dGVyCiAgICAgICAgICAgICAgICAgIG1vZHVsZSBJbm5lcgogICAgICAgICAgICAgICAgICAgIG1vZHVsZSBGb28KICAgICAgICAgICAgICAgICAgICAgICMgc3R1ZmYgZ29lcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAKMTEvMDUvMjAwMjogbWtvZXBwZSAKCSAgICBbTXpTY2hlbWVdIEFkZCBhbiBhcmd1bWVudCAoLWRlY2xhcmVtb2R1bGUpIHRoYXQgZ2VuZXJhdGVzCgkgICAgY29kZSB0byBjb3JyZWN0bHkgZGVjbGFyZSBhIHByaW1pdGl2ZSBtb2R1bGUgZXh0ZW5zaW9uLgoJICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBCcnVjZSBCdXR0ZXJmaWVsZC4KCjExLzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgcGF0Y2ggc3VibWl0dGVkIGJ5IE1pY2hhZWwgQ2FoaWxsIHRvIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyCiAgICAgICAgICAgIHdhcm5pbmdzIGZvciB0aGUgamVudiBhbmQgY2xzIHBhcmFtZXRlcnMuIFRoaXMgcGF0Y2ggYWxzbyBhbHNvIGFsbG93cyBvbmUKICAgICAgICAgICAgdG8gdXNlICJ2b2lkIiBpbiB0aGUgam5pIHR5cGVtYXAgZm9yIGFueSB0eXBlIHdpdGhvdXQgY29kZSBiZWluZyBnZW5lcmF0ZWQKICAgICAgICAgICAgYXR0ZW1wdGluZyB0byByZXR1cm4gYSB2YWx1ZS4KCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQXJyYXkgaGFuZGxpbmcgaXMgZGlmZmVyZW50LiBBcnJheXMgb2YgY2xhc3NlcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQKICAgICAgICAgICAgd2l0aCBwcm94eSBhcnJheXMsIGVnIHdyYXBwaW5nCgogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIHRoZXNlIEphdmEgZ2V0dGVycyBhbmQgc2V0dGVyczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFhbXSB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWFtdIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIHZlcnkgaW5lZmZpY2llbnQgYXMgdGhlIGVudGlyZSBhcnJheSBpcyBjb3BpZWQgbnVtZXJvdXMKICAgICAgICAgICAgdGltZXMgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBnZXR0ZXIgb3Igc2V0dGVyLiBUaGVzZSBhcnJheXMgYXJlIG5vdwogICAgICAgICAgICB3cmFwcGVkIHdpdGggYSBwb2ludGVyIHNvIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gYWNjZXNzIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IAogICAgICAgICAgICB1c2luZyBhIHByb3h5IGNsYXNzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWCB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWCBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgQXJyYXlzIG9mIGVudW1zIGhhdmUgYWxzbyBiZWVuIHNpbWlsYXJseSBjaGFuZ2VkLiBUaGlzIGJlaGF2aW91ciBpcyBub3cgbGlrZSB0aGUgCiAgICAgICAgICAgIG90aGVyIFNXSUcgbGFuZ3VhZ2UncyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIGFycmF5IGxpYnJhcnkgc2hvdWxkIGJlIHVzZWQgdG8gCiAgICAgICAgICAgIGFjY2VzcyB0aGUgb3RoZXIgZWxlbWVudHMuIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIGFjaGlldmVkIHVzaW5nIHRoZSAKICAgICAgICAgICAgbWFjcm9zIGFuZCB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgIEpBVkFfQVJSQVlTT0ZDTEFTU0VTKFgpCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUd28gbmV3IHR5cGVtYXBzIGphdmFpbiBhbmQgamF2YW91dCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJveHkgY2xhc3MgCiAgICAgICAgICAgIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3MgbWV0aG9kIGNhbGxzIHRvIHRoZSBKTkkgY2xhc3MuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIAogICAgICAgICAgICByZWFsbHkgdXNlZCBmb3IgdHJhbnNmb3JtaW5nIHRoZSBqc3R5cGUgKHVzZWQgaW4gcHJveHkgY2xhc3MgYW5kIHR5cGUgd3JhcHBlcgogICAgICAgICAgICBjbGFzc2VzKSB0byB0aGUganR5cGUgKHVzZWQgaW4gdGhlIEpOSSBjbGFzcykgYW5kIHZpc2EgdmVyc2EuIEEgamF2YWluIHR5cGVtYXAKICAgICAgICAgICAgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgYW4gaW4gdHlwZW1hcCBpcyB3cml0dGVuIGFuZCBzaW1pbGFybHkgamF2YW91dCBmb3IgYW4gb3V0CiAgICAgICAgICAgIHR5cGVtYXAuIEFuIGV4YW1wbGUgaXMgcHJvYmFibHkgYmVzdCB0byBzaG93IHRoZW0gd29ya2luZzoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIENsYXNzICJDbGFzcy5nZXRDUHRyKCRqYXZhaW5wdXQpIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSB1bnNpZ25lZCBzaG9ydCAiJGphdmFpbnB1dCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIENsYXNzICogewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3Mge307CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgKiBiYXIoQ2xhc3MgY2xzLCB1bnNpZ25lZCBzaG9ydCB1c2gpIHsgcmV0dXJuIG5ldyBDbGFzcygpOyB9OwogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgcHJveHkgY29kZSBpcyB0aGVuOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgYmFyKENsYXNzIGNscywgaW50IHVzaCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKGV4YW1wbGVKTkkuYmFyKENsYXNzLmdldENQdHIoY2xzKSwgdXNoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFNvbWUgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIHVzZSB0aGVzZSB0eXBlbWFwcy4KICAgICAgICAgICAgSGVyZSAkamF2YWlucHV0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdjbHMnIGFuZCAndXNoJy4gJGpuaWNhbGwgaGFzIGJlZW4gcmVwbGFjZWQgYnkgCiAgICAgICAgICAgIHRoZSBuYXRpdmUgbWV0aG9kIGNhbGwsICdleGFtcGxlSk5JLmJhciguLi4pJyBhbmQgJG93bmVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdmYWxzZScuCiAgICAgICAgICAgICRqYXZhaW5wdXQgaXMgYW5hbG9nb3VzIHRvIHRoZSAkaW5wdXQgc3BlY2lhbCB2YXJpYWJsZS4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAgICAgICAkam5pY2FsbCBpcyBhbmFsb2dvdXMgdG8gJGFjdGlvbiBpbiAlZXhjZXB0aW9uLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgY2FsbCB0byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICAkb3duZXIgaXMgcmVwbGFjZWQgYnkgZWl0aGVyIHRydWUgaWYgJW5ld29iamVjdCBoYXMgYmVlbiB1c2VkIG90aGVyd2lzZSBmYWxzZS4KCiAgICAgICAgICAgIFRoZSBqYXZhLnN3ZyBmaWxlIGNvbnRhaW5zIGRlZmF1bHQgamF2YWluIGFuZCBqYXZvdXQgdHlwZW1hcHMgd2hpY2ggd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGNvZGUKICAgICAgICAgICAgYXMgcHJldmlvdXNseS4gVGhpcyBjaGFuZ2UgaXMgb25seSBvZiBjb25jZXJuIHRvIHRob3NlIHdobyBoYXZlIHdyaXR0ZW4gdGhlaXIgb3duIHR5cGVtYXBzIGFzCiAgICAgICAgICAgIHlvdSB3aWxsIHRoZW4gbW9zdCBsaWtlbHkgaGF2ZSB0byB3cml0ZSB5b3VyIG93biBqYXZhaW4gYW5kIGphdmFvdXQgdHlwZW1hcHMuCgogICAgICAgICAgICBUaGUgamF2YW91dCB0eXBlbWFwIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGEgSmF2YSBkb3duY2FzdCB0byBiZSB1c2VkIG9uIGFic3RyYWN0IAogICAgICAgICAgICBwcm94eSBiYXNlIGNsYXNzZXMuIFNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIG9uIGR5bmFtaWNfY2FzdC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI0LzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gVXBnYWRlZCB0byBsaWJ0b29sIDEuNC4zLCBwcmVzdW1hYmx5IHcvIGJldHRlcgoJICAgIHN1cHBvcnQgZm9yIG5ld2lzaCBwbGF0Zm9ybXMgKGxpa2UgTWFjT1MgWCkuCgoxMC8yMS8yMDAyOiB0dG4KCSAgICBGaXhlZCBSdW50aW1lL01ha2VmaWxlLmluIGJ1ZyAtLSB0aGFua3MgdG8gUmljaGFyZCBDYWxtYmFjaC4KCjEwLzE4LzIwMDI6IHR0bgoJICAgIEZpeGVkIHR5cG8gaW4gZG9oLmggLS0gdGhhbmtzIHRvIE1heCBIb3JuLgoKVmVyc2lvbiAxLjMuMTYgKE9jdG9iZXIgMTQsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgJWZlYXR1cmUgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgV2lsbGlhbSBGdWx0b24uCgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIE9wZW5WTVMgYnVpbGQgZGlyZWN0b3J5ICh2bXMpLiAgQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIEplYW4tRnJhbudvaXMgUGllcm9ubmUuCgoxMC8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyBjbGF1c2UgdG8gdGhlIG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgVGhlIHRocm93cyBjbGF1c2UgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGZ1bmN0aW9ucwogICAgICAgICAgICBhbmQgbW9kdWxlIGNsYXNzIGZ1bmN0aW9ucy4KCjA5LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSBhbmQgY2xhc3NlcyB0aGF0CiAgICAgICAgICAgIHdlcmUgZGVmaW5lZCBidXQgbm90IHdyYXBwZWQuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IExlc2xpZSBCcm9va3MsCiAgICAgICAgICAgIEdlcnJ5IFdvb2RzLCBhbmQgb3RoZXJzLgoKMDkvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb21lIGVycm9yIGNoZWNraW5nIGFkZGVkOgogICAgICAgICAgICAxKSBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBjaGVjayBpbiB0aGUgY2hhciAqIHR5cGVtYXBzLiAKICAgICAgICAgICAgMikgQXMgU1dJRyB0cmVhdHMgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBhc3NpbmcgYnkgdmFsdWUgYWxsIHRoZQogICAgICAgICAgICBzYW1lLCBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBleHBlY3RzCiAgICAgICAgICAgIGFuIG9iamVjdCBwYXNzZWQgYnkgdmFsdWUgb3IgYnkgcmVmZXJlbmNlLiBBIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIAogICAgICAgICAgICBub3cgdGhyb3duIHVuZGVyIHRoaXMgc2NlbmFyaW8uCgowOS8yMC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNsZWFuIiBhbmQgIm1ha2UgaW5zdGFsbCIKCQkJICB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRXhwbGFpbiBob3cgdG8gZXh0ZW5kICJtYWtlIGluc3RhbGwiIHcvIGV4dHJhLWluc3RhbGwubGlzdC4KCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRpb24gb2YgdGhlICJpZ25vcmUiIHR5cGVtYXAuICAgVGhlICJpZ25vcmUiIHR5cGVtYXAgaGFzCiAgICAgICAgICAgIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSAiaW4iIHR5cGVtYXAuCiAgICAgICAgICAgIFRvIGlnbm9yZSBhbiBhcmd1bWVudCwgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbixudW1pbnB1dHM9MCkgaW50ICpvdXRwdXQgKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgYnVncyByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbgogICAgICAgICAgICBvZiB0aGUgImluIiBhbmQgImlnbm9yZSIgdHlwZW1hcHMgKHdoaWNoIHdlcmUgc3VwcG9zZWQgdG8gYmUKICAgICAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlKS4KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgdGhlIG51bWlucHV0cyBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgQ3VycmVudGx5LCB2YWx1ZXMgPjEgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvci4gIEhvd2V2ZXIsIGZ1dHVyZQogICAgICAgICAgICByZWxlYXNlcyBvZiBTV0lHIG1heSB1dGlsaXplIHRoYXQgdG8gc3VwcG9ydCBtdWx0aS1pbnB1dCB0eXBlbWFwcy4KCiAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgc3RpbGwgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGlzCiAgICAgICAgICAgIHRyYW5zbGF0ZWQgdG8gJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IGZvciB1bm5hbWVkIHN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgfSAqYmxhaDsKCgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2dlciBHaWJzb24uCiAgICAgICAgICAgIE5vdGU6IHdlIG1pZ2h0IGJlIGFibGUgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgaW4gc3BlY2lhbCBjYXNlcy4KCjA5LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgbW9kaWZpY2F0aW9uIHRvIGdlbmVyYXRlZCB3cmFwcGVyIGZ1bmN0aW9ucy4gIFBvaW50ZXIgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgYWx3YXlzIHNldCB0byBhbiBpbml0aWFsIHZhbHVlIG9mIDAuICAgU2ltcGxpZmllcyB0eXBlbWFwIHdyaXRpbmcgYW5kIGNsZWFudXAKICAgICAgICAgICAgY29kZSAoc2luY2UgeW91IGNhbiByZWx5IG9uIHplcm8tdmFsdWUgaW5pdGlhbGl6YXRpb24pLiAgIFRoaXMgYWxzbyBncmVhdGx5CiAgICAgICAgICAgIHJlZHVjZXMgdGhlIG5lZWQgdG8gZXZlciB3cml0ZSBhbiAiYXJnaW5pdCIgdHlwZW1hcC4KCjA5LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gc21hcnQtcG9pbnRlciBzdXBwb3J0LiAgSWYgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIGlzIHBhcnQgb2YgYW4gaWdub3JlZCBiYXNlIGNsYXNzIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBCYXI7CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAgICAgICAgLyogSWdub3JlZCAqLwogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICB0aGVuIG1ldGhvZHMgZnJvbSBGb28gYXJlIHN0aWxsIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKQogICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgICBUaGUgb25seSBjYXRjaCBpcyB0aGF0IHRoZSBvcGVyYXRvci0+KCkgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgIChzaW5jZSBpdCB3YXNuJ3Qgd3JhcHBlZCkuICAgVGhlcmVmb3JlLCB0aGVyZSB3b24ndCBiZSBhbnkKICAgICAgICAgICAgIF9fZGVyZWZfXygpIG9wZXJhdGlvbiB1bmxlc3MgaXQgaXMgZXhwbGljaXRseSBhZGRlZCB0byBTcGFtCiAgICAgICAgICAgICAoZWl0aGVyIHVzaW5nICVleHRlbmQgb3IganVzdCBwbGFjaW5nIG9wZXJhdG9yLT4oKSBpbiB0aGUKICAgICAgICAgICAgIGRlZmluaXRpb24gb2YgU3BhbSkuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNoZWNrIiB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRG9jdWVtZW50ZWQgbWV0aG9kb2xvZ3kgaW4gTWFudWFsL0V4dGVuZGluZy5odG1sLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW0RvY3NdIFByZWZpeGVkIE1hbnVhbC8qLmh0bWwgd2l0aCAiPCFET0NUWVBFIGh0bWwgLi4uPiIgdG8KCSAgICBwYW5kZXIgZG90aW5nbHkgdG8gKG92ZXItKXNlbnNpdGl2ZSBlZGl0b3JzLgoKMDkvMTAvMjAwMjogdHRuCgkgICAgW0d1aWxlXSBDb252ZXJ0ZWQgRXhhbXBsZXMvZ3VpbGUvc2ltcGxlICJtYWtlIGNoZWNrIgoJICAgIGJlaGF2aW9yIHRvIGFjdHVhbGx5IGNoZWNrIGV4ZWN1dGlvbiByZXN1bHRzLiAgUmVkdWNlZAoJICAgIGl0ZXJhdGlvbiBjb3VudHMgc28gdGhhdCB0aGUgdGVzdCBkb2Vzbid0IHRha2UgdG9vIGxvbmcuCgowOS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUctMS4zLjE1IHJlbGVhc2VkLgoKClZlcnNpb24gMS4zLjE1IChTZXB0ZW1iZXIgOSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBuYXN0eSBydW50aW1lIHR5cGUgY2hlY2tpbmcgYnVnIHdpdGggc3VidHlwZXMgYW5kIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuIAoKMDkvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGV4Y2VwdGlvbiBjbGFzc2VzIGZvciBhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UgY2FuIGJlIGdlbmVyYXRlZCBieSAKICAgICAgICAgICAgc3BlY2lmeWluZyB0aGVtIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW4gdGhlIHRocm93cyBhdHRyaWJ1dGUgaW4gYW55IG9uZQogICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiBpbiwgb3V0LCBjaGVjaywgZnJlZWFyZywgYXJnb3V0IGFuZCB0aHJvd3MuIEEgY2xhc3NpYwogICAgICAgICAgICBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50byBhIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cywgdGhyb3dzPSJqYXZhLmlvLklPRXhjZXB0aW9uIikgZmlsZV9leGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgIGpjbGFzcyBleGNlcCA9IGplbnYtPkZpbmRDbGFzcygiamF2YS9pby9JT0V4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmIChleGNlcCkKICAgICAgICAgICAgICAgICAgICAgICAgamVudi0+VGhyb3dOZXcoZXhjZXAsICQxLndoYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOyAvLyBvciB1c2UgU1dJR19mYWlsCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgZmlsZV9leGNlcHRpb24gey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIHRocm93KGZpbGVfZXhjZXB0aW9uKTsKCiAgICAgICAgICAgIFRoZSBKYXZhIG1ldGhvZCB3aWxsIHRoZW4gYmUgZGVjbGFyZWQgd2l0aCBhIHRocm93cyBjbGF1c2U6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Li4ufQoKMDkvMDgvMjAwMjogbWtvZXBwZQoJICAqIFtHdWlsZV0gSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGFyZ2xpc3Qgbm8KCSAgICBsb25nZXIgZ2V0cyBjbHV0dGVyZWQgd2l0aCB0eXBlIHNwZWNpZmljYXRpb24sIG1ha2luZyBpdAoJICAgIG1vcmUgcmVhZGFibGUuICAoQWxzbyB0aGUgSUxJU1AgZnVuY3Rpb24gQy11IE0teAoJICAgIGBhcmdsaXN0LWxpc3AnIFJFVCB3b3JrcyBiZXR0ZXIgdGhpcyB3YXkuKSAgVGhlIHR5cGVzIG9mCgkgICAgYXJndW1lbnRzIGFyZSBleHBsYWluZWQgaW4gYW4gZXh0cmEgc2VudGVuY2UgYWZ0ZXIgdGhlCgkgICAgYXJnbGlzdC4gCgkgICAgCgkgICAgVGhlcmUgYXJlIG5vdyB0d28gZG9jdW1lbnRhdGlvbi1yZWxhdGVkIHR5cGVtYXAgYXJndW1lbnRzOgoKCSAgICAgICAgJXR5cGVtYXAoaW4sIGRvYz0iJE5BTUUgaXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMiLCAKCQkJIGFyZ2xpc3Q9IiRuYW1lIikgIGludCAqVkVDVE9SIHsgLi4uIH0KCQkJIAogICAgICAgICAgICBUaGUgImFyZ2xpc3QiIHRleHRzIG9mIGFsbCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiBtYWtlIHVwCgkgICAgaXRzIGFyZ2xpc3QgaW4gdGhlIGRvY3VtZW50YXRpb24uICBUaGUgImRvYyIgdGV4dHMgb2YgYWxsCgkgICAgYXJndW1lbnRzIGFyZSBjb2xsZWN0ZWQgdG8gbWFrZSBhIHNlbnRlbmNlIHRoYXQgZGVzY3JpYmVzCgkgICAgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuICBSZWFzb25hYmxlIGRlZmF1bHRzIGFyZQoJICAgIHByb3ZpZGVkLiAKCgkgICAgQXMgdXN1YWwsICRuYW1lIGlzIHN1YnN0aXR1dGVkIGJ5IHRoZSBuYW1lIG9mIHRoZQoJICAgIGFyZ3VtZW50LiBUaGUgbmV3IHR5cGVtYXAgdmFyaWFibGUgJE5BTUUgaXMgbGlrZSAkbmFtZSwKCSAgICBidXQgbWFya2VkLXVwIGFzIGEgdmFyaWFibGUuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKCSAgICB1cHBlci1jYXNlZDsgaW4gVGVYaW5mbyBtb2RlICgiLXByb2Nkb2Nmb3JtYXQgdGV4aW5mbyIpIGl0CgkgICAgY29tZXMgb3V0IGFzIEB2YXJ7bmFtZX0uIAoJICAgIAoJICAgIFRoZSBkaXJlY3RpdmVzICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAgJW11bHRpcGxlX3ZhbHVlcyBub3cgYWxzbyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUKCSAgICBkb2N1bWVudGF0aW9uLiAoVGhpcyBpcyBhY2hpZXZlZCB2aWEgdGhlIG5ldyBwcmFnbWFzCgkgICAgcmV0dXJuX25vdGhpbmdfZG9jLCByZXR1cm5fb25lX2RvYywgcmV0dXJuX211bHRpX2RvYy4pCgoJICAgIERvY3VtZW50YXRpb24gaGFzIGFsc28gaW1wcm92ZWQgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZQoJICAgIHdyYXBwZWQgYXMgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMgKGNvbW1hbmQtbGluZSBzd2l0Y2gKCSAgICAiLWVtaXQtc2V0dGVycyIpLgoKICAgICAgICAgICogW0d1aWxlXSBFbWl0IGNvbnN0YW50cyBhcyBfaW1tdXRhYmxlXyB2YXJpYWJsZXMuICAoVGhpcwogICAgICAgICAgICB3YXMgYnJva2VuIHJlY2VudGx5LikKCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFVwZGF0ZWQgdGhlIHR5cGVtYXBzIGluIGxpc3QtdmVjdG9yLmkuCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgU2hvcnQtY2lyY3VpdCB0aGUgdHlwZWNoZWNrcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCgkgICAgKFRoZSBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdGlvbiBhcmUgdmlzaWJsZSBpbiB0aGUgbmV3CgkgICAgdGVzdGNhc2UgIm92ZXJsb2FkX2NvbXBsaWNhdGVkIi4pCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbHV0aW9uIGZvciBbIDU5NjQxMyBdCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgd3JhcHBlciBjb25zdHJ1Y3RvciBtb2RpZmllciBjYW4gYmUgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIAogICAgICAgICAgICBwcm90ZWN0ZWQuIE5vcm1hbGx5IFNXSUcgZ2VuZXJhdGVzIGEgY29uc3RydWN0b3IgbGlrZSB0aGlzIHdoaWNoIGNhbiBvbmx5IAogICAgICAgICAgICBiZSBhY2Nlc3NlZCB3aXRoaW4gb25lIHBhY2thZ2U6CgogICAgICAgICAgICAgIHByb3RlY3RlZCBCYXIobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIFNXSUcgYWNyb3NzIG11bHRpcGxlIHBhY2thZ2VzIG9yIHdhbnQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3IKICAgICAgICAgICAgYW55d2F5LCBpdCBjYW4gbm93IGJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIFRvIG1vZGlmeSB1c2UgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUgInB1YmxpYyIKCiAgICAgICAgICAgIHRvIGNoYW5nZSB0byBwdWJsaWMgZm9yIGFsbCBwcm94eSBjbGFzc2VzIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gInB1YmxpYyIKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIHR5cGVtYXBzIGZvciB0aGUgSmF2YSBtb2R1bGUuIEMrKyBleGNlcHRpb25zIGdldCBjb252ZXJ0ZWQgaW50bwogICAgICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBKYXZhIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICAKICAgICAgICAgICAgV2FybmluZzogVGhpcyBtYXkgY2hhbmdlIGZyb20gamF2YS5sYW5nLlJ1bnRpbWUgZXhjZXB0aW9uIGluIHRoZSBmdXR1cmUuCgowOS8wNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdmFyaWFibGVzIGRlY2xhcmVkIGFzIHJlZmVyZW5jZXMuCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjA5LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb3JlIHVwZGF0ZXMgdG8gdGhlIFJ1YnkgbW9kdWxlIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZwoJICAgIGEgbmV3IHR5cGVtYXAgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY29sbGVjdCBrZXktdmFsdWUKCSAgICBwYWlycyBmcm9tIGFuIGFyZ3VtZW50IGxpc3QgaW50byBhIEhhc2guCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbiBhbmQgY29uc3RydWN0b3JzLgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgRm9vPFQ+KCkgeyB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGV4dHJhIDxUPiBpbiB0aGUgY29uc3RydWN0b3Igd2FzIGNhcnJpZWQgdGhyb3VnaCBpbiB0aGUKICAgICAgICAgICAgbmFtZS0tY2F1c2luZyBydW50aW1lIHByb2JsZW1zIGluIGdlbmVyYXRlZCBtb2R1bGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3JkaSBBcm5hYmF0IEJlbmVkaWN0by4KIAowOS8wNS8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBTdXBwb3J0IG92ZXJsb2FkaW5nLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZWQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVzCgkgICAgdG8gdXNlIFJ1YnkgMS43IHN1cHBvcnQgZm9yIHRoZXNlIHR5cGVzIHdoZW4gYXZhaWxhYmxlLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG91dHB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlIHRvIHByaW1pdGl2ZQoJICAgIHR5cGVzLgoKMDkvMDQvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHBhc3MtYnktdmFsdWUgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBBcm5vCgkgICAgUGV0ZXJzIHZpYSBEZWJpYW4gYnVndHJhY2tpbmcgKCMxNTY5MDIpLCBwYXRjaCBieSBUb3JzdGVuCgkgICAgTGFuZHNjaG9mZiA8dG9yc3RlbkBkZWJpYW4ub3JnPi4KCjA5LzAzLzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKCSAgICBCZXR0ZXIgcmVmZXJlbmNlIHN1cHBvcnQuCgkgICAgRnVuY3Rpb25zIHRoYXQgd2FudCBhIHZvaWQqKiBjYW4gdGFrZSBhIE5VTEwgYnkgcmVmZXJlbmNlIGFuZAoJICAgIHRoZSB2b2lkKiB3aWxsIGJlIG1hZGUgZm9yIHlvdSBhbmQgdGhlbiBwYXNzZWQtYnktcmVmZXJlbmNlCgoJICAgIEFsc28gYWxsIGludGVnZXItY2xhc3MgbmF0aXZlIHR5cGVzIGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlCgkgICAgd2hlcmUgYW4gaW50KiBvciBpbnQmIGV0YyBpcyBuZWVkZWQKCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlZCB0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBwcmVwcm9jZXNzb3IgbWFjcm8gYXJndW1lbnRzLgogICAgICAgICAgICBBcmd1bWVudHMgYXJlIG5vdyBleHBhbmRlZCBieSB0aGUgcHJlcHJvY2Vzc29yICpiZWZvcmUqIHRoZXkKICAgICAgICAgICAgYXJlIHBhc3NlZCB0byBtYWNybyBleHBhbnNpb24uICBUaGlzIGZpeGVzIGEgc3VidGxlIGV4cGFuc2lvbgogICAgICAgICAgICBidWcgcmVwb3J0ZWQgYnkgQW50aG9ueSBIZWFkaW5nLgoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0aGUgZmlsZSBpbmNsdWRlIG9yZGVyIChhZ2FpbiwgYXBwYXJlbnRseSkuIFNlZSAyLzI3Lzk5LgoKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybF0gQmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LiAgU2luY2UgUGVybCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICByZWxpZXMgb24gc2V0am1wL2xvbmdqbXAsIHdyYXBwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBtb2RpZmllZCBzbGlnaHRseQogICAgICAgICAgICB0byBwcm92aWRlIGFuIGV4dHJhIGJsb2NrIHNjb3BlOgoKICAgICAgICAgICAgICAgIFhTKGZvbykgewogICAgICAgICAgICAgICAgICAgY2hhciBfc3dpZ21zZ1tTV0lHX01BWF9FUlJNU0ddID0gIiI7CiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfc3dpZ2VyciA9IF9zd2lnbXNnOwogICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsIHdyYXBwZXIgZnVuY3Rpb24gaGVyZSAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBTV0lHX2Nyb2FrKCJBbiBlcnJvciBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFhTUkVUVVJOKGFyZ3ZpKTsgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiAqLwogICAgICAgICAgICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBjb2RlICovCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjcm9hayhfc3dpZ19lcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG1hY3JvIFNXSUdfY3JvYWsoeCkgc2V0cyB0aGUgdmFsdWUgb2YgX3N3aWdlcnIgdG8geCBhbmQKICAgICAgICAgICAgZXhlY3V0ZXMgYSAiZ290byBmYWlsIi4gIFRoZSB3aG9sZSB3cmFwcGVyIGZ1bmN0aW9uIGlzIGVuY2xvc2VkCiAgICAgICAgICAgIGJsb2NrIHNjb3BlIHRvIHByb3ZpZGUgcHJvcGVyIGNsZWFudXAgb2YgQysrIG9iamVjdHMuICBTaW5jZQogICAgICAgICAgICBjcm9hayBleGVjdXRlcyBhIGxvbmdqbXAoKSwgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5IHJlY2xhaW0KICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoaXMgZXhlY3V0ZXMgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlIHdyYXBwZXIKICAgICAgICAgICAgZnVuY3Rpb24uCgogICAgICAgICAgICBUaGUgX3N3aWdtc2dbXSB2YXJpYWJsZSBpcyBub3JtYWxseSB1bnVzZWQsIGJ1dCBjYW4gYmUgdXNlZAogICAgICAgICAgICB0byBzdG9yZSBzbWFsbCBlcnJvciBtZXNzYWdlcyB1c2luZyBzcHJpbnRmIG9yIHNucHJpbnRmLiBJdAogICAgICAgICAgICBoYXMgYSBjYXBhY2l0eSBvZiBhdCBsZWFzdCAyNTYgYnl0ZXMgKFNXSUdfTUFYX0VSUk1TRykuCiAgICAgICAgICAgIAowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIGJldHRlciBzdXBwb3J0IGZvciBleGNlcHRpb25zLiAgSW5zdGVhZCBvZiByZXR1cm5pbmcgVENMX0VSUk9SLAogICAgICAgICAgICB1c2UgdGhlIG1hY3JvIFNXSUdfZmFpbCB0byByZXR1cm4gd2l0aCBhbiBlcnJvci4gIFRoaXMgZW5zdXJlcyB0aGF0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgY2xlYW5lZCB1cC4gIEV4Y2VwdGlvbiBzcGVjaWZpZXJzIGFyZSBub3cKICAgICAgICAgICAgaGFuZGxlZCBieSBkZWZhdWx0LgoKMDkvMDIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFRoZSB0eXBlLWNoZWNraW5nIHN5c3RlbSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGhhcyBoYWQgYSBmbGF3CgkgICAgaW4gdGhhdCBzb21lIHR5cGVzIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKCSAgICB3ZXJlbid0LiBUaGlzIGJ1ZyB3YXMgYmVzdCBkZW1vbnN0cmF0ZWQgYnkgdGhlIGluaGVyaXRfbWlzc2luZy5pCgkgICAgdGVzdCBzdWl0ZSBjYXNlLCB3aGljaCBkZWZpbmVzIGEgYmFzZSBjbGFzcyAiRm9vIiB0aGF0IGlzCgkgICAgc3ViY2xhc3NlZCBieSAiQmFyIi4gVGhlICJGb28iIGNsYXNzIGlzbid0IGFjdHVhbGx5IHdyYXBwZWQgKGkuZS4KCSAgICBpdCdzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gUnVieSkgYnV0IHdlJ2Qgc3RpbGwgbGlrZSB0byBiZQoJICAgIGFibGUgdG8gcGFzcyAiQmFyIiBpbnN0YW5jZXMgdG8gZnVuY3Rpb25zIGV4cGVjdGluZyBGb29zIGFuZCBoYXZlCgkgICAgdGhhdCB3b3JrOyBpdCB3YXNuJ3QuIFRoZSByZXZpc2VkIGltcGxlbWVudGF0aW9uIChzaW1pbGFyIHRvIHRoYXQKCSAgICB1c2VkIGZvciBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMpIGFkZHMgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKCSAgICAoX19zd2lndHlwZV9fKSB0byBlYWNoIG9iamVjdCB0aGF0IGluZGljYXRlcyBpdHMgU1dJRyB0eXBlOwoJICAgIHRoYXQgaXMsIGVhY2ggIkJhciIgaW5zdGFuY2Ugd2lsbCBub3cgaGF2ZSBhIHN0cmluZyBpbnN0YW5jZQoJICAgIHZhcmlhYmxlIGNhbGxlZCAiX19zd2lndHlwZV9fIiB3aG9zZSB2YWx1ZSBpcyAiX3BfQmFyIi4KCiAgICAgICAgICAgIFVubGVzcyBkZXZlbG9wZXJzIHdlcmUgdGFraW5nIGFkdmFudGFnZSBvZiB0aGlzIGxvdy1sZXZlbAoJICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCwgdGhleSBzaG91bGRuJ3Qgbm90aWNlIGFueSBjb21wYXRpYmlsaXR5CgkgICAgcHJvYmxlbXM7IG5ldmVydGhlbGVzcywgSSdtIG1hcmtpbmcgaXQgYXMgYSAicG90ZW50aWFsCgkgICAgaW5jb21wYXRpYmlsaXR5Ii4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMDEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNGIEJ1ZyAjNjAzMTk5LgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBPVVRQVVQsIElOUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciBDKysgCiAgICAgICAgICAgIHJlZmVyZW5jZXMuCgowOC8yNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXhlZCBlcnJvciBpbiAibGliX3N0ZF92ZWN0b3IiIHRlc3RjYXNlIGFuZAoJICAgIGNvbXBpbGVyIHdhcm5pbmcgaW4gImxpYl9jZGF0YSIgdGVzdGNhc2UuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICIlbWl4aW4iIGRpcmVjdGl2ZSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCgkgICAgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0byBtaXgtaW4gdG8gYQoJICAgIGNsYXNzLiBTbywgZm9yIGV4YW1wbGUsIGlmIHlvdSdkIGxpa2UgdG8gc3BlY2lmeSB0aGF0IFJ1YnkncwoJICAgIEVudW1lcmFibGUgbW9kdWxlIHNob3VsZCBiZSBtaXhlZC1pbiB0byB5b3VyIGNsYXNzIEZvbywgeW91J2QKCSAgICB3cml0ZToKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRW51bWVyYWJsZSI7CgkJCiAgICAgICAgICAgIG9yIHRvIHNwZWNpZnkgdGhhdCB0aGUgbW9kdWxlcyBGZWUsIEZpZSBhbmQgRm8gc2hvdWxkIGJlIG1peGVkCgkgICAgaW4gdG8gRm9vOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJGZWUsRmllLEZvIjsKCQkKCSAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlICVhbGlhcyBkaXJlY3RpdmUgc28gdGhhdCBtdWx0aXBsZSBhbGlhc2VzCgkgICAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kIGJ5IHVzaW5nIGEgY29tbWEtc2VwYXJhdGVkCgkgICAgbGlzdCBvZiBhbGlhc2VzLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkICJ0aHJvdyIgdHlwZW1hcHMgZm9yIHRoZSBSdWJ5IG1vZHVsZS4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgcHJpbnRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAnc3dpZyAtTScgbGlzdHMgYWxsIGZpbGUgZGVwZW5kZW5jaWVzLiAgJ3N3aWcgLU1NJyBsaXN0cwogICAgICAgICAgICBkZXBlbmRlbmNpZXMsIGJ1dCBleGNsdWRlcyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiAKICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICUgc3dpZyAtTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9zd2lnLnN3ZyBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9weXRob24vcHl0aG9uLnN3ZyBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgICAgJSBzd2lnIC1NTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NzU5OSBdIHVuaW9uIGluIGNsYXNzOiBpbmNvcnJlY3Qgc2NvcGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjAwMTMyIF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIG5hbWVzcGFjZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoaWJ1a2F3YSBZb3NoaWtpLgogCjA4LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQXV0b21hdGljIEMrKyBleGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCBmb3IgYWxsIGxhbmd1YWdlIG1vZHVsZXMuICAgIFRoaXMgaXMKICAgICAgICAgICAgcHJldHR5IHNpbXBsZS4gIElmIHlvdSBoYXZlIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB3cmFwX0Jhcl9ibGFoKCkgewogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEtPmJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb28gJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJ0aHJvdyIgdHlwZW1hcCBjb2RlIGluc2VydGVkLiAkMSA9IF9lICovCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgVGhlICJ0aHJvdyIgdHlwZW1hcCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbiBlcnJvciBpbiB0aGUgdGFyZ2V0IAogICAgICAgICAgICBsYW5ndWFnZS4gIEl0IGNhbiBkbyBhbnl0aGluZy4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCgidGhyb3ciKSBGb28gewogICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiRm9vIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUbyBtYWtlIHRoaXMgd29yayBpbiBlYWNoIGxhbmd1YWdlIG1vZHVsZSwgc2ltcGx5IGRlZmluZSBhIGZldyBkZWZhdWx0CiAgICAgICAgICAgICJ0aHJvdyIgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgYW5kIGEKICAgICAgICAgICAgZmV3IGNvbW1vbiBleGNlcHRpb24gdHlwZXMuICAgVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4KCiAgICAgICAgICAgIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgY2FuIGJlIGRpc2FibGVkIHVzaW5nIC1ub2V4Y2VwdCBvcgogICAgICAgICAgICBzZXR0aW5nIHRoZSBOb0V4Y2VwdCBnbG9iYWwgdmFyaWFibGUgdG8gMS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBbIFB5dGhvbiBdCiAgICAgICAgICAgIEF1dG9tYXRpYyB0cmFuc2xhdGlvbiBvZiBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGludG8gZXJyb3IgaGFuZGxpbmcgY29kZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBGb28gaXMgd3JhcHBlZCBhcyBhIGNsYXNzaWMtc3R5bGUgY2xhc3MgKGNvbXBhdGlibGUKICAgICAgICAgICAgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcpLiAgRnVydGhlcm1vcmUsIHlvdSBjYW4gd3JpdGUgUHl0aG9uIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IEZvbyxlOiAgICAgIyBOb3RlIHVzZSBvZiBleGNlcHRpb24gY2xhc3MgaGVyZSEKICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBGb28gZXJyb3IKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZSBvYmplY3QgImUiIGluIHRoZSBleGNlcHRpb24gaGFuZGxlciBpcyBqdXN0IGEgd3JhcHBlZCBGb28KICAgICAgICAgICAgb2JqZWN0LiAgQWNjZXNzIGl0IGxpa2UgYSBub3JtYWwgb2JqZWN0LgoKICAgICAgICAgICAgSWYgYW4gZXhjZXB0aW9uIGlzIG5vdCB3cmFwcGVkIGFzIGEgY2xhc3MsIGEgUnVudGltZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBleGNlcHRpb24gaXMKICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBvYmplY3QuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhpbnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLGU6CiAgICAgICAgICAgICAgICAgICBwcmludCBlLmFyZ3NbMF0gICAgICAgIyBJbnRlZ2VyIGV4Y2VwdGlvbiB2YWx1ZQoKICAgICAgICAgICAgQ29tbWVudHM6CgogICAgICAgICAgICAgICAgLSAgSWYgYSBjbGFzcyBpcyB1c2VkIGFzIGFuIGV4Y2VwdGlvbiwgaXQgKm11c3QqIGJlIHdyYXBwZWQKICAgICAgICAgICAgICAgICAgIGFzIGEgUHl0aG9uIGNsYXNzaWMtc3R5bGUgY2xhc3MgKG5ldyBjbGFzc2VzIGRvbid0IHdvcmspLgoKICAgICAgICAgICAgICAgIC0gIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgaXMgY29tcGF0aWJsZSB3aXRoICVleGNlcHRpb24uCgogICAgICAgICAgICAgICAgLSAgVXNlIC1ub2V4Y2VwdCB0byB0dXJuIG9mZiB0aGlzIGZlYXR1cmUuCgogICAgICAgICAgICAgICAgLSAgVGhlIG5ld2x5IGludHJvZHVjZWQgInRocm93IiB0eXBlbWFwIGlzIHVzZWQgdG8gcmFpc2UKICAgICAgICAgICAgICAgICAgIFB5dGhvbiBlcnJvcnMgKG5hdHVyYWxseSkuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbmZvcm1hdGlvbiBmcm9tIHRocm93KCkgc3BlY2lmaWVycyBpcyBub3cgc3RvcmVkIGluIHRoZSBwYXJzZQogICAgICAgICAgICB0cmVlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB0aHJvdyhzcGFtLGJhcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgc3RvcmVkIGluZm9ybWF0aW9uIGlzIGZ1bGx5IGNvcnJlY3RlZCBmb3IgbmFtZXNwYWNlcyBhbmQgd29ya3MKICAgICAgICAgICAgd2l0aCB0ZW1wbGF0ZXMuICBVc2VzIHdpbGwgZm9sbG93LgogICAgICAgICAgICAKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBubyBsb25nZXIgYXBwbGllZCB0byBtZW1iZXIgYWNjZXNzCiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGluIHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2god2hhdGV2ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm90IGFwcGxpZWQgdG8gYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICAgIGZvciBGb286OnguICAgVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZXh0cmEgY29kZQogICAgICAgICAgICBnZW5lcmF0ZWQuCgogICAgICAgICAgICBDYXZlYXQ6ICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSAqaXMqIHVzZWQgd2hlbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgICAgICBhY2Nlc3NlZCB0aHJvdWdoIGEgc21hcnQtcG9pbnRlciBvciBhIHN5bnRoZXNpemVkIGF0dHJpYnV0ZWQKICAgICAgICAgICAgYWRkZWQgd2l0aCAlZXh0ZW5kIGlzIHVzZWQuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgbW9yZSBwYXRjaGVzIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgU1dJRyAKICAgICAgICAgICAgYXMgYSA2NC1iaXQgZXhlY3V0YWJsZS4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjb25zdCByZWZlcmVuY2UgbWVtYmVycywgdmFyaWFibGVzLCBhbmQgc3RhdGljIG1lbWJlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgJnJlZjsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSAic2V0IiBmdW5jdGlvbnMgd2hpY2ggd291bGRuJ3QgY29tcGlsZS4gCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IgIkNsYXNzIFggbWlnaHQgYWJzdHJhY3QiIG9mZiBieSBkZWZhdWx0LgogICAgICAgICAgICBFbmFibGUgd2l0aCAtV2FsbC4KCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCBoYW5kbGluZyBvZiBjb25zdCBhbmQgbm9uLWNvbnN0IG92ZXJsb2FkZWQgbWV0aG9kcy4gIElmCiAgICAgICAgICAgIGEgY2xhc3MgZGVmaW5lcyBhIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpIGNvbnN0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlbiB0aGUgbm9uLWNvbnN0IG1ldGhvZCBpcyAqYWx3YXlzKiBzZWxlY3RlZCBpbiBvdmVybG9hZGluZyBhbmQKICAgICAgICAgICAgdGhlIGNvbnN0IG1ldGhvZCBzaWxlbnRseSBkaXNjYXJkZWQuICBJZiBydW5uaW5nIHdpdGggLVdhbGwsIGEgd2FybmluZwogICAgICAgICAgICBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKMDgvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCBpbmhlcml0YW5jZS4gICBDb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmxhaChkb3VibGUgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb0JhciA6IHB1YmxpYyBGb28sIHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmxhaChjaGFyICp4KTsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEJhcjo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgU1dJRyB3cmFwcyBGb29CYXI6OmJsYWggYXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QgdGhhdCB1c2VzIGFsbAogICAgICAgICAgICBhY2Nlc3NpYmxlIHZlcnNpb25zIG9mIGJsYWgoKS4gIFNlZSBzZWN0aW9uIDE1LjIuMiBpbiBTdHJvdXN0cnVwLCAzcmQgRWQuCgogICAgICAgICAgICBTV0lHIGFsc28gc3VwcG9ydHMgYWNjZXNzIGNoYW5nZSB0aHJvdWdoIHVzaW5nIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286Ong7CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgQ2F2ZWF0OiAgIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2hlY2sgdG8gc2VlIGlmIGRlY2xhcmF0aW9ucyBpbXBvcnRlZAogICAgICAgICAgICB2aWEgJ3VzaW5nJyBhcmUgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gIElmIHRoaXMgb2NjdXJzLCB0aGUKICAgICAgICAgICAgd3JhcHBlciBjb2RlIHdvbid0IGNvbXBpbGUgYW55d2F5cy0tLW5vdCBzdXJlIGl0J3Mgd29ydGggd29ycnlpbmcgYWJvdXQuCiAgICAgICAgICAKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBvdmVybG9hZGluZyBkaXNwYXRjaCB0byBub3QgaW5jbHVkZSBub2RlcyB3aXRoIGFuICJlcnJvciIgYXR0cmlidXRlLgogICAgICAgICAgICBBIGxhbmd1YWdlIG1vZHVsZSBjYW4gc2V0IHRoaXMgaWYgYSBub2RlIGNvdWxkbid0IGJlIHdyYXBwZWQgYW5kIHlvdSBkb24ndCB3YW50CiAgICAgICAgICAgIGl0IGluY2x1ZGVkIGluIHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4KCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBkaXNwYXRjaC4gICBUaGUgZGlzcGF0Y2hlciBpcyBub3cgYXdhcmUgb2YKICAgICAgICAgICAgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICBjbGFzcyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oRm9vICpmKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGlzcGF0Y2hlciByZS1vcmRlcnMgdGhlIGZ1bmN0aW9ucyBzbyB0aGF0IHNwYW0oQmFyICpiKSBpcwogICAgICAgICAgICBjaGVja2VkIGZpcnN0LS0taXQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHNwYW0oRm9vICpmKS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLVdlcnJvciBjb21tYW5kIGxpbmUgb3B0aW9uLiAgIElmIHN1cHBsaWVkLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIGVycm9ycyBhbmQgU1dJRyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTYxMzUgXSBUeXBlZGVmIG9mIHJlZmVyZW5jZSBjYW4ndCBjb21waWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICZJbnRSZWY7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oSW50UmVmIGkpOwoKICAgICAgICAgICAgU1dJRy0xLjMuMTQgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLgoKVmVyc2lvbiAxLjMuMTQgKEF1Z3VzdCAxMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFN0YXRpYyBjb25zdCBtZW1iZXJzIGluaXRpYWxpemVkIGR1cmluZyBkZWNsYXJhdGlvbiwgYW5kCgkgICAgb25seSB0aGVtLCBpZToKCgkgICAgc3RydWN0IEEKCSAgICB7CQkgCgkJc3RhdGljIGNvbnN0IGludCBhID0gMSA7ICAvLyB0aGlzIG9uZQoJCXN0YXRpYyBjb25zdCBpbnQgYjsgICAgICAgLy8gbm90IHRoaXMgb25lCiAgICAgICAgICAgIH07ICAgICAKCgkgICAgYXJlIGVtaXR0ZWQgbGlrZSBjb25zdGFudHMgKGVxdWl2YWxlbnQgdG8gZW51bXMgb3IKCSAgICBleHBsaWNpdCAlY29uc3RhbnQpLgoJICAgIAoJICAgIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byAnY3ZhcicKCSAgICBzaW5jZSB0aGV5IGxhY2sgdGhlIG5lZWRlZCByZWZlcmVuY2UgKHdlbGwsIHlvdSBjYW4gZm9yY2UKCSAgICB0aGVtIHRvIGhhdmUgYSByZWFsIHJlZmVyZW5jZSwgYnV0IGluIGFuIHVnbHkgd2F5IHdoaWNoCgkgICAgZ29lcyBjb21wbGV0ZWx5IGFnYWluIHRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIGluaXRpYWxpemUKCSAgICB0aGVtIGR1cmluZyBkZWNsYXJhdGlvbiwgeW91IGFsc28gaGF2ZSB0byBkZWFsIHdpdGggZXh0cmEKCSAgICBsaW5raW5nIG1hdHRlcnMsIGFuZCBpdCB0YWtlIGEgd2hpbGUgdG8gZmlndXJlIG91dCB3aGF0IGlzCgkgICAgdGhlIHByb2JsZW0gYW5kIGhvdyB0byBzb2x2ZSBpdCkuCgkgICAgCgkgICAgUGxlYXNlIHRlc3QgaXQgd2l0aCB5b3VyIHByZWZlcnJlZCB0YXJnZXQgbGFuZ3VhZ2UsIGFuZAoJICAgIG5vdCBvbmx5IHRoZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByZWFsbHkgcnVuIHRoZSBleGFtcGxlCgkgICAgaW4gdGhlIHRlc3Qtc3VpdGUgKHN0YXRpYy1jb25zdC1tZW1iZXItMi5pKSBiZWNhdXNlIHRoZQoJICAgIHByb2JsZW0gYW5kIHRoZSBzb2x1dGlvbiBjYW5ub3QgYmUgImZ1bGx5IiBhcHByZWNpYXRlZAoJICAgIHVudGlsIHlvdSB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBydW4gaXQuCgoJICAgIEluIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyAocHl0aG9uIHNwZWNpYWxseSksIHRoaXMgY2FuCgkgICAgcHJvZHVjZXMgYSBkaWZmZXJlbmNlIGluIHRoZSB3YXkgdGhhdCB0aGUgc3RhdGljIGNvbnN0YW50CgkgICAgbWVtYmVycyAnYScgYW5kICdiJyBhcmUgaW50ZXJuYWxseSB3cmFwcGVkLiBIb3BlZnVsbHksCgkgICAgdGhleSBzdGlsbCBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5LgoKCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIE5vdyBzdGF0aWMgY29uc3QgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgaW4gYSBtb3JlCgkgICAgbmF0dXJhbCB3YXksIGllLCBpZiB5b3UgaGF2ZQoKCSAgICBzdHJ1Y3QgQQogICAgICAgICAgICAgewkJIAoJCXR5cGVkZWYgdW5zaWduZWQgaW50IHZpZXdmbGFnczsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGZvcndhcmRfZmllbGQgPSAwOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgYmFja3dhcmRfZmllbGQ7CiAgICAgICAgICAgIH07ICAgICAKCSAgICAKCSAgICBub3cgeW91IGNhbiBkbzoKCgkJcHJpbnQgQS5iYWNrd2FyZF9maWVsZAoKCSAgICBhbmQgYWxzbwoKCSAgICAgICAgYSA9IEEoKQoJCXByaW50IGEuZm9yd2FyZF9maWVsZAoJCQoJICAgIE5vdGUgdGhhdCBpZiB0aGUgc3RhdGljIGNvbnN0IG1lbWJlcnMgZG9uJ3QgaGF2ZSBhbgoJICAgIGluaXRpYWxpemVyIChsaWtlIGJhY2t3YXJkX2ZpZWxkKSwgc3RpbGwgeW91IGNhbiBhY2Nlc3MKCSAgICB0aGVtIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgcHl0aG9uIHNpZGUsIGJ1dCB0aGUKCSAgICBpbXBsZW1lbnRhdGlvbiBpcyBhIHF1aXRlIGRpZmZlcmVudDogYmFja3dhcmRfZmllbGQgd2lsbAoJICAgIHN0aWxsIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHksIGFuZCBhbHNvLCB5b3UgYXJlIAoJICAgIHJlc3BvbnNpYmxlIHRvIGluaXRpYWxpemUgaXQgaW4gc29tZSBjb2RlIHVuaXQsIGFuZCBsaW5rIGl0CgkgICAgcHJvcGVybHkuIGZvcndhcmRfZmllbGQsIGJ5IHRoZSBvdGhlciBoYW5kLCB3aWxsIG5vdAoJICAgIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHkgYnV0IG9ubHkgYXMgYSBBIG1lbWJlciwgc2ltaWxhcgoJICAgIHRvIHdoYXQgaGFwcGVuIHdpdGggZW51bSBvciAlY29uc3RhbnQgbWVtYmVycy4KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIENvbW1vbiBjb2RlIGluIHRoZSBfX3NldGF0dHJfXy9fX2dldGF0dHJfXyBub3cKCSAgICBnb2VzIHRvIHR3byAiZnJlZSIgbWV0aG9kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm94eQoJICAgIGZpbGUsIGZyb20gd2hlcmUgZWFjaCBjbGFzcyB1c2UgaXQuIFRoaXMgY2hhbmdlIHJlZHVjZXMKCSAgICB0aGUgc2l6ZSBvZiB0aGUgcHJveHkgZmlsZSwgc3BlY2lhbGx5IGlmIHlvdSB3cmFwIGEgbG90IG9mCgkgICAgc21hbGwgY2xhc3NlcyBpbiBvbmUgbW9kdWxlICh1cCB0byAzMyUgaW4gc29tZSBjYXNlcyksCgkgICAgbWFraW5nIGl0IGZhc3RlciB0byBsb2FkIHRvby4KCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjaGFyICogcmV0dXJucyBOVUxMLAogICAgICAgICAgICB1bmRlZiBpcyByZXR1cm5lZCB0byB0aGUgUGVybCBpbnRlcnByZXRlci4KIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbmQgbmFtZXNwYWNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyooKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhlIHdyYXBwZXIgY29kZSwgU1dJRyB3YXMgdXNpbmcgLT5vcGVyYXRvciBGb28qKCkKICAgICAgICAgICAgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIC0+b3BlcmF0b3IgbnM6OkZvbyooKS4KCiAgICAgICAgICAgIE5vdGU6IGlmIHVzaW5nICVyZW5hbWUgd2l0aCBhIGNvbnZlcnNpb24gb3BlcmF0b3IsIHlvdQogICAgICAgICAgICBtaWdodCBoYXZlIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlcmVuYW1lKHRvRm9vUHRyKSBuczo6b3BlcmF0b3IgbnM6OkZvbyooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIF5eXl4gbm90ZSBleHRyYSBxdWFsaWZpZXIKICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIE1pbm9yIGVuaGFuY2VtZW50IHRvICdjb25zdCcgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICAgTm9ybWFsbHkgY29uc3QgZGVjbGFyYXRpb25zIGFyZSB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMKICAgICAgICAgICAgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggdGhlIGN2YXIgYXR0cmlidXRlIChzZWUgU1dJRy5odG1sIGZvcgogICAgICAgICAgICBhIGRpc2N1c3Npb24gb2Ygd2h5KS4gIEhvd2V2ZXIsIGluIG1hbnkgcHJvZ3JhbXMsICJjb25zdCIgCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBtYXkganVzdCBiZSBjb25zdGFudHMtLS1tYWtpbmcgdGhlIGN2YXIuIGFjY2VzcwogICAgICAgICAgICBhd2t3YXJkLiAgVG8gZml4IHRoaXMsICJjb25zdCIgZGVjbGFyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlCiAgICAgICAgICAgIGJvdGggdGhyb3VnaCBjdmFyLiBhbmQgYXMgYSBzaW1wbGUgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgRk9PID0gNDI7CgogICAgICAgICAgICBJbiBQeXRob246CgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLmN2YXIuRk9PCiAgICAgICAgICAgICAgICAgNDIKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5GT08KICAgICAgICAgICAgICAgICA0MgoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSB2YWx1ZSBvZiBhICJjb25zdCIgdmFyaWFibGUKICAgICAgICAgICAgbWlnaHQgY2hhbmdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0IEJBUiA9ICJIZWxsbyBXb3JsZCI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBwb2ludGVyIGl0c2VsZiBjYW4gbm90IGNoYW5nZSwgYnV0IHRoZSAKICAgICAgICAgICAgZGF0YSBiZWluZyBwb2ludGVkIHRvIGNvdWxkIGJlIG1vZGlmaWVkLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywKICAgICAgICAgICAgY3Zhci5CQVIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRvIG9idGFpbmVkIHRoZSBjdXJyZW50IHZhbHVlLgoKMDgvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBnZW5lcmF0aW9uIG9mIHRoZSBwcm94eSBjb2RlICgucHkgZmlsZXMpIHRvIG1vcmUKICAgICAgICAgICAgY2xvc2VseSBmb2xsb3cgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9ucyBhcyB0aGV5IGFwcGVhciBpbgogICAgICAgICAgICB0aGUgLmkgZmlsZS4gICBJbiB0aGUgcGFzdCwgYWxsIG9mIHRoZSBjbGFzcyB3cmFwcGVycyBhcHBlYXJlZAogICAgICAgICAgICBmaXJzdCwgZm9sbG93ZWQgYnkgZnVuY3Rpb24gc3R1YnMsIGluc2VydGVkIFB5dGhvbiBjb2RlLCBhbmQKICAgICAgICAgICAgb3RoZXIgZGV0YWlscy4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkgbWV0aG9kIF9kZWxldGUoKSBjaGFuZ2VkIHRvIGRlbGV0ZSgpLiBUaGVyZSBzaG91bGRuJ3QgZXZlcgogICAgICAgICAgICBiZSBhIHdyYXBwZWQgZnVuY3Rpb24gY2FsbGVkIGRlbGV0ZSgpIGFzIGl0IGlzIGEgQysrIGtleXdvcmQgYW5kIHRoZXJlCiAgICAgICAgICAgIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBtZW1iZXIgZnVuY3Rpb24gaW4gQy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhlIGZ1bmN0aW9uIGJhY2sgaW4KICAgICAgICAgICAgZm9yIGFsbCBwcm94eSBjbGFzc2VzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgSmF2YSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdW1tYXJ5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiBpbXByb3ZpbmcgdGhlIEphdmEgbW9kdWxlIAogICAgICAgICAgICBmb3IgdmVyIDEuMy4xNC4gIElmIGF0IGFsbCBwb3NzaWJsZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHRha2UgYWR2YW50YWdlcyBvZiB0aGUgCiAgICAgICAgICAgIGltcHJvdmVtZW50cy4gSWYgeW91IHdlcmUgdXNpbmcgcHJveHkgY2xhc3NlcyB5b3UgbWF5IG5vdCBub3RpY2UgYW55IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGljaCB3aWxsIGhlbHAgd2l0aCBtb3N0IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBjb2RlIHRoYXQgdXNlcwogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIG91dHB1dDoKCiAgICAgICAgICAgIFJlcGxhY2U6CiAgICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIFdpdGg6CiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im1vZHVsZW5hbWUiKSBtb2R1bGVuYW1lOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzPSJwdWJsaWMiOwoKICAgICAgICAgICAgVGhlIHByb3h5IGNvbnN0cnVjdG9ycyB0aGF0IHRvb2sgcGFyYW1ldGVycyAobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pCiAgICAgICAgICAgIHdlcmUgcHVibGljIGFuZCBhcmUgbm93IHByb3RlY3RlZC4gSWYgeW91IHdlcmUgbWFraW5nIHVzZSBvZiB0aGVzZSB0aGVuIHlvdSdsbCAKICAgICAgICAgICAgaGF2ZSB0byBtb2RpZnkgeW91ciBjb2RlIGFuZCB0aGUgYmVzdCBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlIG5ldyB0eXBlIAogICAgICAgICAgICB3cmFwcGVyIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgb3RoZXIgbWFpbiBhcmVhcyBhcmUgdGhlIHByYWdtYXMgYW5kIGdsb2JhbCB2YXJpYWJsZSB3cmFwcGluZy4gUmVwbGFjZSAKICAgICAgICAgICAgdGhlIHByYWdtYXMgd2l0aCBvbmUgb2YgdGhlIG5ldyBkaXJlY3RpdmVzIG9yIHR5cGVtYXBzIG1lbnRpb25lZCBiZWxvdyBhbmQgdXNlCiAgICAgICAgICAgICVyZW5hbWUgb24gdGhlIHZhcmlhYmxlcy4KCiAgICAgICAgICAgIElmIHlvdSB3ZXJlIG5vdCB1c2luZyBwcm94eSBjbGFzc2VzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSBhIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBqdHlwZSB0eXBlbWFwLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHdyYXBwaW5nIHR3byBkaW1lbnNpb24gYXJyYXkgdmFyaWFibGVzLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbF0KICAgICAgICAgICAgT2JqZWN0IG1hbmFnZW1lbnQgbm93IGhhcyBhIG11Y2ggYmV0dGVyIHNlbnNlIG9mIG93bmVyc2hpcC4KICAgICAgICAgICAgT3duZXJzaGlwIGJpdHMgaXMgY2hhbmdlZCB3aGVuZXZlciBhbiBvYmplY3QgaXMgc3RvcmVkIGluIGEKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgICAgIEZvbyAqbmV4dDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgaW4gUHl0aG9uCgogICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24KICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICA+Pj4gZyA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBnLm5leHQgPSBmICAgICAgICAgICMgQXNzaWduIGEgcG9pbnRlcgogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duICAgICAgICAgICAjIE5vdGljZSBvd25lcnNoaXAgY2hhbmdlCiAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICBUaGlzIHNjaGVtZSBpcyBtb3N0bHkgYSBjb25zZXJ2YXRpdmUgaGV1cmlzdGljIGRlc2lnbmVkIHRvIAogICAgICAgICAgICBwcm92aWRlIHNlZ21lbnRhdGlvbiBmYXVsdHMuICBJdCBjb3VsZCBjYXVzZSBhIG1lbW9yeSBsZWFrCiAgICAgICAgICAgIGlmIG93bmVyc2hpcCBpcyBjaGFuZ2VkIHVubmVjZXNzYXJpbHkuICBJbiB0aGlzIGNhc2UsIHlvdSBjYW4KICAgICAgICAgICAgZWl0aGVyIHdyaXRlIGEgdHlwZW1hcCAodGhhdCBkb2Vzbid0IGNoYW5nZSBvd25lcnNoaXApLCBvcgogICAgICAgICAgICBtYW51YWxseSBzZXQgdGhlIHRoaXNvd24gYXR0cmlidXRlIGJhY2sgdG8gMS4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gTWFqb3IgdXNhYmlsaXR5IGltcHJvdmVtZW50cyB0byB0aGUgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgICAgU3VwcG9zZSB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgCiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHZvaWQgIGJsYWgoRm9vICpmKTsKCiAgICAgICAgICAgIEluIHBhc3QgdmVyc2lvbnMgb2YgU1dJRywgeW91IGNvdWxkIGNyZWF0ZSBvYmplY3RzIGFuZCB1c2UKICAgICAgICAgICAgdGhlbSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJSBGb28gZgogICAgICAgICAgICAgICAgJSBmIGNvbmZpZ3VyZSAteCAzCiAgICAgICAgICAgICAgICAlIGYgc3BhbQogICAgICAgICAgICAgICAgMzcKICAgIAogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIGlzIHRoYXQgaWYgeW91IHRyaWVkIHRvIGNhbGwgYmxhaCgpLCBpdCBkaWRuJ3QKICAgICAgICAgICAgd29yazoKCiAgICAgICAgICAgICAgICAlIGJsYWggZgogICAgICAgICAgICAgICAgVHlwZSBFcnJvci4gRXhwZWN0ZWQgX3BfRm9vCiAgICAgICAgICAgICAgICAlCgogICAgICAgICAgICBJbnN0ZWFkLCB5b3UgaGFkIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJSBibGFoIFtmIGNnZXQgLXRoaXNdCiAgCiAgICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZXh0cmFjdHMgdGhlIC10aGlzIHBvaW50ZXIsIGF2b2lkaW5nIHRoaXMKICAgICAgICAgICAgcHJvYmxlbS4gIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcgImJsYWggZiIgaXMgcGVyZmVjdGx5IGxlZ2FsIGFuZAogICAgICAgICAgICBldmVyeXRoaW5nIHdpbGwgc3RpbGwgd29yayBub3JtYWxseS4KCiAgICAgICAgICAgIENhdmVhdDogU2luY2UgcG9pbnRlciBzdHJpbmdzIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUgKF8pLAogICAgICAgICAgICBkb24ndCB1c2UgdGhpcyBpbiBvYmplY3QgbmFtZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlIEZvbyBfZiAKICAgICAgICAgICAgICAgICUgYmxhaCBfZiAgICAgICAgIyBQb3RlbnRpYWwgY3Jhc2gKCiAgICAgICAgICAgIE9iamVjdHMgbm93IGhhdmUgYSAtdGhpc293biBhdHRyaWJ1dGUgdGhhdCBzaG93cyB0aGUgb3duZXJzaGlwLgogICAgICAgICAgICBUaGlzIGJ1aWxkcyB1cG9uIHRoZSBDSEFOR0VTIDExLzI0LzIwMDEgZW50cnkuCgowOC8wNy8yMDAyOiBzYW1qYW0sIFNhbSBMaWRkaWNvdHQKICAgICAgICAgICAgUHJvcGVybHkgaW1wbGVtZW50ZWQgcG9pbnRlciBzeXN0ZW0gdXNpbmcgcGhwIHJlc291cmNlcy4KICAgICAgICAgICAgU3RpbGwgbmVlZCB0byB3b3JrIG91dCB3aGV0aGVyIG9yIG5vdCB0byBsZXQgc2NyaXB0LXVzZXJzIGNhbGwKICAgICAgICAgICAgZGVzdHJ1Y3RvcnMgZGlyZWN0bHkKCjA4LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXBncmFkZWQgbXpzY2hlbWUgbW9kdWxlIHRvIHN1cHBvcnQgdmVyc2lvbiAyMDEgYW5kIGFkZGVkCiAgICAgICAgICAgIG92ZXJsb2FkaW5nIHN1cHBvcnQuCgowOC8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgZXh0cmEgZ3JvdXBpbmcgKGluIHZlcnkgbGltaXRlZCBjYXNlcykuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAoRnVuY1B0cikoaW50LCBkb3VibGUpOwoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCAqKioKICAgICAgICAgICAgCjA4LzAzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVzIHRvIHR5cGVtYXBzLmkgYXMgdGhvc2UgZG9uZSBwcmV2aW91c2x5IGZvciBQZXJsLAogICAgICAgICAgICBQeXRob24gYW5kIFRjbCBtb2R1bGVzLiBOb3cgc3VwcG9ydHMgcmVmZXJlbmNlIHR5cGVzIHdpdGggSU5QVVQsCiAgICAgICAgICAgIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMuCgowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgY3N0cmluZy5pIGFkZGVkLiAgUHJvdmlkZXMgbWFjcm9zIGZvcgogICAgICAgICAgICBtYW5pcHVsYXRpbmcgY2hhciAqIGRhdGEuCiAKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gIFVzZSAlbmV3b2JqZWN0IGluc3RlYWQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVuZXdvYmplY3QgZm9vOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgY2hhciAqZm9vKCk7CgogICAgICAgICAgICAlbmV3b2JqZWN0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsCiAgICAgICAgICAgIGV0Yy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgYXR0cmlidXRlICdqbmljbGFzc25hbWUnIGZvciB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBhbGxvd3MgYSB3YXkgb2YKICAgICAgICAgICAgY2hhbmdpbmcgdGhlIEpOSSBjbGFzcyBuYW1lIGZyb20gdGhlIGRlZmF1bHQgd2hpY2ggdXNlcyB0aGUgbW9kdWxlbmFtZSB3aXRoIEpOSQogICAgICAgICAgICBhcHBlbmRlZCBhZnRlciBpdC4KCiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im5hbWUiKSBtb2R1bGVuYW1lCgogICAgICAgICAgICBJZiAnbmFtZScgaXMgdGhlIHNhbWUgYXMgJ21vZHVsZW5hbWUnIHRoZW4gdGhlIG1vZHVsZSBjbGFzcyBuYW1lIGdldHMgY2hhbmdlZAogICAgICAgICAgICBmcm9tICdtb2R1bGVuYW1lJyB0byBtb2R1bGVuYW1lTW9kdWxlLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmlsZSBpbmNsdWRlIG9yZGVyLiAgTGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZGlyZWN0b3JpZXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGdlbmVyaWMgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOiAgInN3aWdfbGliL3B5dGhvbi9mb28uaSIgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgInN3aWdfbGliL2Zvby5pIi4gICAgSSB0aG91Z2h0IHRoaXMgd2FzIHRoZSBjYXNlIGFscmVhZHksIGJ1dAogICAgICAgICAgICBhcHBhcmVudGx5IGl0IGhhcyBiZWVuIGJyb2tlbiBmb3IgcXVpdGUgc29tZSB0aW1lLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdGRfZGVxdWUuaSBsaWJyYXJ5IGZpbGUuICBXb3JrIGluIHByb2dyZXNzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbCxQZXJsXQogICAgICAgICAgICBJbXByb3ZlbWVudHMgdG8gdHlwZW1hcHMuaS4gIElOUFVUL0lOT1VUIHR5cGVtYXBzIHBlcmZvcm0gYmV0dGVyCiAgICAgICAgICAgIGVycm9yIGNoZWNraW5nLiAgVHlwZW1hcHMgYXJlIG5vdyBzdXBwbGllZCBmb3IgcmVmZXJlbmNlcyBsaWtlIAogICAgICAgICAgICBpbnQgJk9VVFBVVCwgZG91YmxlICZJTk9VVCwgZXRjLgogICAgICAgICAgCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRGVwcmVjYXRlZCB0aGUgVF8qIGFuZCBMXyogdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KICAgICAgICAgICAgTXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBhcmUgYWx3YXlzIHBsYWNlZCBpbiBhIHR1cGxlLiBEZXByZWNhdGVkCiAgICAgICAgICAgIHRoZSBCT1RIIHR5cGVtYXBzLiAgVGhpcyBpcyBub3cgSU5PVVQgKGUuZy4sIGludCAqSU5PVVQpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIGFycmF5LmksIGNhcnJheS5pLCBhbmQgdGltZXIuaSBsaWJyYXJ5IGZpbGVzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgVXNlIGNwb2ludGVyLmkgaW5zdGVhZC4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZvciBjb25zaXN0ZW5jeSB0aGUgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgdXNlIHRoZSBKYXZhQmVhbiAKICAgICAgICAgICAgcHJvcGVydHkgZGVzaWduIHBhdHRlcm4gbGlrZSBtZW1iZXIgdmFyaWFibGVzIGFsd2F5cyBoYXZlLiBUaGlzIG1lYW5zIGlmIHlvdSBhcmUgCiAgICAgICAgICAgIHdyYXBwaW5nIGEgdmFyaWFibGUgY2FsbGVkIGZvbywgdGhlIGdldHRlciBpcyBjYWxsZWQgZ2V0Rm9vKCkgYW5kIHRoZSBzZXR0ZXIgaXMgCiAgICAgICAgICAgIGNhbGxlZCBzZXRGb28oKS4gQmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlcyB0byB0aGUgSmF2YSBtb2R1bGUgdGhlIGdldHRlcnMgYW5kIAogICAgICAgICAgICBzZXR0ZXJzIHdlcmUgY2FsbGVkIGdldF9mb28oKSBhbmQgc2V0X2ZvbygpLiBJZiB5b3UgcmVhbGx5IHdhbnQgdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBmdW5jdGlvbiBuYW1lcyB1c2UgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGxpa2UgdGhpczogJXJlbmFtZShfZm9vKSBGb287CgowNy8zMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNhc3RpbmcgcHJvYmxlbSB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgICAgY2xhc3MgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXIgOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXogOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBzcGFtIDogcHVibGljIGJhciwgcHVibGljIGJheiB7fTsKCiAgICAgICAgICAgIHRoZW4gdGhlIHdyYXBwZXJzIHdvdWxkbid0IGNvbXBpbGUgZHVlIHRvIGFuIGFtYmlndW91cyBjYXN0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEdWUgdG8gbmV3IHN0YXRpYyB0eXBlY2hlY2tpbmcgYWxsIHBvaW50ZXJzIGhlbGQgaW4gYSBKYXZhIGxvbmcgYXJlIHBhcnQgb2YgCiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBhbmQgdGhpcyBwb2ludGVyIHZhbHVlIGluIHRoZSBKYXZhIGxvbmcgaGFzIGJlY29tZSBhYnN0cmFjdGVkCiAgICAgICAgICAgIGRhdGEuIFRoZSB0eXBlIHdyYXBwZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhcyBzdWNoIHByb3RlY3RlZC4KICAgICAgICAgICAgSWYgeW91IG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwb2ludGVycyBmcm9tIEphdmEgb3IgZm9yIGV4YW1wbGUgY3JlYXRlIGEgcHJveHkgCiAgICAgICAgICAgIGNsYXNzIG9yIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgYSBudWxsIHBvaW50ZXIsIGFkZCBhIGZ1bmN0aW9uL2NvbnN0cnVjdG9yIAogICAgICAgICAgICB0byBkbyBzbyB3aXRoIHRoZSAlamF2YWNvZGUgdHlwZW1hcC4gWW91IGNhbiBhbHNvIG1ha2UgZ2V0Q1B0cigpIHB1YmxpYyBhZ2FpbiB3aXRoCiAgICAgICAgICAgIHRoZSAlamF2YWdldGNwdHIgdHlwZW1hcC4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZXMgZm9yICV0eXBlbWFwKGlnbm9yZSkuIEluIHBhcnRpY3VsYXIgd2hlbiBpZ25vcmluZyB0aGUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgaW4gYSBmdW5jdGlvbi4gQWxzbyBmb3IgYWxsIHBhcmFtZXRlcnMgaW4gY29uc3RydWN0b3JzLiBUaGVzZSBtb2RzIGhhdmUgYWxzbyBmaXhlZAogICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyBmb3IgcHJveHkgY2xhc3NlcyAtIFNGIDU4MTc5MS4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJW5ld29iamVjdCAocmVwbGFjZW1lbnQgZm9yICVuZXcpIG5vdyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gCgowNy8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlbWFwIGNvcGllcywgJWFwcGx5LCBhbmQgJWNsZWFyIGluc2lkZQogICAgICAgICAgICBDKysgbmFtZXNwYWNlcy4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpOSSBjbGFzcyBub3cgaGFzIHBhY2thZ2UgYWNjZXNzIGFzIHRoZSBjbGFzcyBtb2RpZmllcgogICAgICAgICAgICBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gInB1YmxpYyIgdG8gbm90aGluZy4gVGhpcyBoYXMgYmVlbiBkb25lCiAgICAgICAgICAgIGFzIHRoaXMgY2xhc3MgaXMgbm93IG1vcmUgZm9yIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBTV0lHIHNpbmNlIHRoZSBtb2R1bGUKICAgICAgICAgICAgY2xhc3MgaGFzIHN0YXRpYyB0eXBlIGNoZWNraW5nIGZvciBhbGwgdHlwZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlICVqbmljbGFzc2NsYXNzbW9kaWZpZXIgCiAgICAgICAgICAgIHByYWdtYSB0byBjaGFuZ2UgaXQgYmFjayB0byAicHVibGljIi4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkvU2hhZG93IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGUgLXByb3h5IGFuZCAKICAgICAgICAgICAgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAKICAgICAgICAgICAgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRoZW4gdXNlIHRoZSBuZXcgLW5vcHJveHkgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZW1haW5pbmcgcHJhZ21hcyBzaGFrZXVwLiBUaGVzZSB3ZXJlIHRoZSByZW1haW5pbmcgcHJhZ21hcyBhbmQgdGhlaXIKICAgICAgICAgICAgbmV3IG5hbWVzIHdoZXJlIGNoYW5nZWQ6CgogICAgICAgICAgICBtb2R1bGViYXNlCiAgICAgICAgICAgIG1vZHVsZWNvZGUKICAgICAgICAgICAgbW9kdWxlY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgbW9kdWxlaW1wb3J0ID0+IG1vZHVsZWltcG9ydHMKICAgICAgICAgICAgbW9kdWxlaW50ZXJmYWNlID0+IG1vZHVsZWludGVyZmFjZXMKCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbXBvcnRzIHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IHRvIGhvdyB0aGUgbW9kdWxlaW1wb3J0IHByYWdtYSB3b3JrZWQuIAogICAgICAgICAgICBOb3cgaXQgYWN0dWFsbHkgdGFrZXMgY29kZSB3aGljaCBnZXRzIHBsYWNlZCBiZWZvcmUgdGhlIGNsYXNzIGRlZmluaXRpb24gc28gdGhlIAogICAgICAgICAgICB3aG9sZSBpbXBvcnQgc3RhdGVtZW50IGhhcyB0byBiZSBnaXZlbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWltcG9ydHM9JXsKICAgICAgICAgICAgaW1wb3J0IGphdmEuaW8uKjsKICAgICAgICAgICAgaW1wb3J0IGphdmEubWF0aC4qOwogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1vZHVsZWludGVyZmFjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvbGQgbW9kdWxlaW50ZXJmYWNlIGluIHRoYXQgaWYgCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGlzIHJlcXVpcmVkIHRoZXkgbXVzdCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gb25lIHVzZSBvZiAKICAgICAgICAgICAgdGhlIHByYWdtYSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWludGVyZmFjZXM9IlNlcmlhbGl6YWJsZSwgTXlJbnRlcmZhY2UiCgogICAgICAgICAgICBUaGVzZSBsYXN0IHR3byBwcmFnbWFzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGphdmFpbnRlcmZhY2VzIGFuZCBqYXZhaW1wb3J0cyAKICAgICAgICAgICAgdHlwZW1hcC4KCiAgICAgICAgICAgIEEgc2ltaWxhciBzZXQgb2YgcHJhZ21hcyBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBuYW1lbHk6CgogICAgICAgICAgICBqbmljbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnQKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2UKCiAgICAgICAgICAgIFRoZXNlIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIG1vZHVsZSBjb3VudGVycGFydHMuIE5vdGUgdGhhdCBwcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBtb2R1bGVYWFggcHJhZ21hcyB3b3JrZWQgb24gdGhlIG9sZCBtb2R1bGUgY2xhc3Mgd2hpY2ggaXMgbm93IGNhbGxlZCB0aGUKICAgICAgICAgICAgSk5JIGNsYXNzICh0aGUgY2xhc3Mgd2l0aCB0aGUgbmF0aXZlIGZ1bmN0aW9ucykuIFRoZSBqbmljbGFzc1hYWCBwcmFnbWFzIG5vdyAKICAgICAgICAgICAgd29yayBvbiB0aGUgbmV3IG1vZHVsZSBjbGFzcyAodGhlIGNsYXNzIHRoYXQgaGFzIGFsbCB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzLCBwbHVzIGFsbCBvdGhlcgogICAgICAgICAgICByZW1haW5pbmcgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGxvdy1sZXZlbCBwcm9jZWR1cmFsIGludGVyZmFjZSkuCgogICAgICAgICAgICBJbiBzdW1tYXJ5IHRoZSBjb250ZW50cyBvZiB0aGUgcHJhZ21hcyBtYWtlIHVwIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgPGpuaWNsYXNzaW1wb3J0cz4KICAgICAgICAgICAgPGpuaWNsYXNzbW9kaWZpZXJzPiBjbGFzcyBtb2R1bGVuYW1lIGV4dGVuZHMgPGpuaWNsYXNzYmFzZT4gaW1wbGVtZW50cyA8am5pY2xhc3NpbnRlcmZhY2VzPiB7CiAgICAgICAgICAgICAgICA8am5pY2xhc3Njb2RlPgogICAgICAgICAgICAgICAgLi4uIFNXSUcgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAuLi4KICAgICAgICAgICAgfQp9CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVwcmVjYXRlZCBtb2R1bGVtZXRob2Rtb2RpZmllcnMgcHJhZ21hIGFuZCByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBhIGJldHRlciAlZmVhdHVyZSBiYXNlZCBkaXJlY3RpdmUgY2FsbGVkICVqYXZhbWV0aG9kbW9kaWZpZXJzLgogICAgICAgICAgICBBIHVzZWZ1bCBleGFtcGxlIHdvdWxkIGJlIGZvciBzeW5jaHJvbmlzYXRpb24gaW4gbXVsdGktdGhyZWFkZWQgYXBwczoKCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGZvbyhpbnQgYSkgInB1YmxpYyBzeW5jaHJvbml6ZWQiOwoKICAgICAgICAgICAgQ2hhbmdlcyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGRlZmF1bHQgKCJwdWJsaWMiKSB0byAicHVibGljIHN5bmNocm9uaXplZCIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNldmVyYWwgZGlyZWN0aXZlcyBub3cgYWxsb3cgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBUaGVzZSBpbmNsdWRlOgoKICAgICAgICAgICAgICAgICVtb2R1bGUobmFtZT0idmFsdWUiLCBuYW1lPSJ2YWx1ZSIsIC4uLikgbW9kdWxlbmFtZQogICAgICAgICAgICAgICAgJWltcG9ydChuYW1lPSJ2YWx1ZSIsIC4uLikgImZpbGVuYW1lLmkiCiAgICAgICAgICAgICAgICAlZXh0ZW5kKG5hbWU9InZhbHVlIiwgLi4uKSBjbGFzc25hbWUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVzZSBjdXJyZW50bHkgaGF2ZSBubyBlZmZlY3QgYW5kIGFyZSByZXNlcnZlZCBmb3IKICAgICAgICAgICAgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgICAgCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnRzIHRvIHNtYXJ0LXBvaW50ZXIgaGFuZGxpbmcuICBTV0lHIG9ubHkgcHJvdmlkZXMKICAgICAgICAgICAgZXh0cmEgc3VwcG9ydCBmb3IgYSBzbWFydC1wb2ludGVyIGlmIG9wZXJhdG9yLT4oKSByZXR1cm5zCiAgICAgICAgICAgIGEgcHJvcGVyIHBvaW50ZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CgogICAgICAgICAgICBJZiBvcGVyYXRvci0+KCkgcmV0dXJucyBhbiBvYmplY3QgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLAogICAgICAgICAgICB0aGVuIFNXSUcgZXhhbWluZXMgdGhlIHJldHVybmVkIG9iamVjdCB0byBzZWUgaWYgaXQgYWxzbwogICAgICAgICAgICBpbXBsZW1lbnRzIG9wZXJhdG9yLT4oKS4gIElmIHNvLCBTV0lHIGNoYXNlcyBvcGVyYXRvci0+KCkKICAgICAgICAgICAgdW50aWwgaXQgY2FuIGZpbmQgb25lIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cwogICAgICAgICAgICBjYXNlcyBsaWtlIHRoaXMgdG8gd29yazoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEJhciBvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpICAgICAgIyBJbnZva2VzIEZvbzo6YmxhaCgpCgogICAgICAgICAgICBUaGUgcy5ibGFoKCkgY2FsbCBhY3R1YWxseSBpbnZva2VzOgoKICAgICAgICAgICAgICAgICAgKChzLm9wZXJhdG9yLT4oKSkub3BlcmF0b3ItPigpKS0+YmxhaCgpOwogCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB0eXBlZGVmIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vICYgRm9vUmVmOwogICAgICAgICAgICAgICAgIEZvb1JlZiBibGFoKCk7CgogICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QKICAgICAgICAgICAgY29tcGlsZS4KCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgV3JhcHBpbmcgb2Ygc3RhdGljIG1ldGhvZHMgaGFzIGJlZW4gaW1wcm92ZWQgaW4gcHJveHkgY2xhc3Nlcy4gIEluIG9sZGVyCiAgICAgICAgICAgIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhpczoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgc3RhdGljIG1ldGhvZCB3YXMgb25seSBhdmFpbGFibGUgYXMgYSBmdW5jdGlvbiBGb29fYmFyKCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgID4+PiBGb29fYmFyKCkKCiAgICAgICAgICAgIE5vdywgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGFsc28gYmUgaW52b2tlZCB0aHJvdWdoIGFuIGluc3RhbmNlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgICAgPj4+IGYuYmFyKCkgICAgICAgICMgSW52b2tlcyBzdGF0aWMgbWV0aG9kCgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYWxsIHZlcnNpb25zIG9mIFB5dGhvbi4gIEFkZGl0aW9uYWxseSwgZm9yIFB5dGhvbi0yLjIsCiAgICAgICAgICAgIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGFzOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvby5iYXIoKQoKICAgICAgICAgICAgVGhlIG9sZC1zdHlsZSBmdW5jdGlvbiBpcyBzdGlsbCBzdXBwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSWYKICAgICAgICAgICAgeW91IGNhcmUgYWJvdXQgbWFraW5nIHlvdXIgY29kZSBhY3Jvc3MgZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbiwKICAgICAgICAgICAgZWl0aGVyIHVzZSBGb29fYmFyKCkgb3IgYWNjZXNzIHRoZSBtZXRob2QgdGhyb3VnaCBhbiBpbnN0YW5jZS4KIAowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUuICBQcm94eSBjbGFzc2VzIG5vdyB1dGlsaXplIG5ldyBQeXRob24tMi4yCiAgICAgICAgICAgIGZlYXR1cmVzIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGFuZCBzdGF0aWMgbWV0aG9kcy4gIEhvd2V2ZXIsIHRoZXNlIGZlYXR1cmVzCiAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgaW4gYSB3YXkgdGhhdCBwcm92aWRlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCiAgICAgICAgICAgIFB5dGhvbiB2ZXJzaW9ucy4gIEluIG90aGVyIHdvcmRzLCBwcm94eSBjbGFzc2VzIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uIGFuZCBvbmx5IHVzZSBuZXcgZmVhdHVyZXMgd2hlbiBydW5uaW5nIG9uIFB5dGhvbi0yLjIuCgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAlZXh0ZW5kIHNvIHRoYXQgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbiBiZSBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHgpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqcykgeyB9OwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBib3RoIEMrKyAqYW5kKiBDLgoKMDcvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBNb3JlIG5ldyB0eXBlbWFwcyBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIGNhbiBiZSBmdXJ0aGVyIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgY29kZSBmb3IgZ2VuZXJhdGluZyB0aGUgCiAgICAgICAgICAgIGZpbmFsaXplKCkgbWV0aG9kcyAocHJveHkgY2xhc3NlcyBvbmx5KSBhbmQgdGhlIGdldENQdHIoKSBtZXRob2RzIGZvciBwcm94eSAKICAgICAgICAgICAgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhZmluYWxpemUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgICAgICAgICBfZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgdHlwZW1hcCB3aWxsIGVuYWJsZSB1c2VycyB0byBoYW5kbGUgSmF2YSBudWxsIGJ5IG92ZXJyaWRpbmcKICAgICAgICAgICAgdGhpcyB0eXBlbWFwIC0gYSByZXF1ZXN0ZWQgZmVhdHVyZS4KCiAgICAgICAgICAgIFRoZSAtbm9maW5hbGl6ZSBjb21tYW5kbGluZSBvcHRpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVGhlIGphdmFmaW5hbGl6ZQogICAgICAgICAgICB0eXBlbWFwIGlzIG1vcmUgcG93ZXJmdWwgYXMgaXQgd2lsbCBhbGxvdyB0aGUgcmVtb3ZhbCBvZiB0aGUgZmluYWxpemUgbWV0aG9kcyAKICAgICAgICAgICAgZm9yIGFsbCBvciBhbnkgb25lIG9yIG1vcmUgcGFydGljdWxhciBwcm94eSBjbGFzcy4KCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGdldENQdHJYWFgoKSBmdW5jdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgc3RhdGljIGZ1bmN0aW9uIGFuZAogICAgICAgICAgICBpcyBub3cgb2YgdGhlIGZvcm06CgogICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cihYWFggb2JqKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBpcyBhIHJlcXVlc3RlZCBjaGFuZ2Ugd2hpY2ggd2lsbCBhbGxvdyBKYXZhIG51bGwgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBudWxsCiAgICAgICAgICAgIGNhbiBiZSBwYXNzZWQgaW4gZm9yIG9iai4gSG93ZXZlciwgdG8gYWNoaWV2ZSB0aGlzIHRoZSBhcHByb3ByaWF0ZSBjb2RlIG11c3QgYmUKICAgICAgICAgICAgd3JpdHRlbiB1c2luZyB0aGUgbmV3IGphdmFnZXRjcHRyIHR5cGVtYXAgZGlyZWN0aXZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGlzIGZ1bmN0aW9uIGJhY2sgaW4gdXNpbmcgdGhlCiAgICAgICAgICAgIG5ldyBqYXZhY29kZSB0eXBlbWFwOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CgogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjEyIGFuZCBTV0lHLTEuMy4xMwogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTEgYW5kIGVhcmxpZXIKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICV9CgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZGlyZWN0aXZlIHRvIGNvbnRyb2wgY29uc3RhbnQgY29kZSBnZW5lcmF0aW9uIC0gJWphdmFjb25zdC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGhhbmRsaW5nIGNvbnN0YW50cyBpcyB0byBnZXQgdGhlIHZhbHVlIHRocm91Z2gKICAgICAgICAgICAgYSBKTkkgY2FsbCwgZWcKCiAgICAgICAgICAgICNkZWZpbmUgWUVMTE9XIDUKICAgICAgICAgICAgI2RlZmluZSBCSUcgMTIzNExMCgogICAgICAgICAgICByZXN1bHRzIGluOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gbW9kdWxlbmFtZS5nZXRfWUVMTE9XKCk7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSBtb2R1bGVuYW1lLmdldF9CSUcoKTsKCiAgICAgICAgICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIEphdmEgbW9kdWxlIGluaXRpYWxpc2VkIHRoZSB2YWx1ZSB1c2luZyB0aGUgQyB2YWx1ZToKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IDU7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMjM0TEw7CgogICAgICAgICAgICBUaGlzIHdvcmtzIGluIG1vc3QgY2FzZXMsIGJ1dCB0aGUgdmFsdWUgZm9yIEJJRyB3b24ndCBjb21waWxlIGFzIDEyMzRMTCBpcyBub3QKICAgICAgICAgICAgdmFsaWQgSmF2YSBjb2RlIGFuZCB0aGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgdGhlIGRlZmF1bHQgaXMgbm93IHRvIGdldCB0aGUgCiAgICAgICAgICAgIHZhbHVlcyB0aHJvdWdoIGEgSk5JIGNhbGwuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZXNlICdjb25zdGFudHMnIGNhbm5vdCBiZSB1c2VkIAogICAgICAgICAgICBpbiBzd2l0Y2ggc3RhdGVtZW50cy4gVGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIGFsbG93cyBvbmUgdG8gc3BlY2lmeSB0aGUKICAgICAgICAgICAgd2F5IHRoZSBjb25zdGFudCB2YWx1ZSBpcyBpbml0aWFsaXNlZCBhbmQgd29ya3MgbGlrZSBvdGhlciAlZmVhdHVyZQogICAgICAgICAgICBkaXJlY3RpdmVzLCBlZwoKICAgICAgICAgICAgJWphdmFjb25zdCgwKTsgICAgIC8vIGFsbCBjb25zdGFudHMgZnJvbSB0aGlzIHBvaW50IG9uIGFyZSBpbml0aWFsaXNlZCB1c2luZyB0aGUgQyB2YWx1ZQogICAgICAgICAgICAlamF2YWNvbnN0KDEpIEJJRzsgLy8ganVzdCBCSUcgaW5pdGlhbGlzZWQgdXNpbmcgSk5JIGNhbGwgKG11c3QgYmUgcGFyc2VkIGJlZm9yZSBCSUcgaXMgZGVmaW5lZCkKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgKioqIElNUE9SVEFOVCBDSEFOR0VTIFRPIFRIRSBQWVRIT04gTU9EVUxFICoqKgoKICAgICAgICAgICAgKDEpIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbmFibGVzIHNoYWRvdy9wcm94eSBjbGFzc2VzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0d28gZmlsZXMgYXJlIGFsd2F5cyBjcmVhdGVkIGJ5IFNXSUcuICBGb3IKICAgICAgICAgICAgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgIC8vIGZpbGU6IGZvby5pCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBmb28KICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZW4gc3dpZyBnZW5lcmF0ZXMgdHdvIGZpbGVzICJmb29fd3JhcC5jIiBhbmQgImZvby5weSIuCgogICAgICAgICAgICAoMikgVGhlIG5hbWUgb2YgdGhlIGxvdy1sZXZlbCBDIGV4dGVuc2lvbiBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZAogICAgICAgICAgICB0byBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZQogICAgICAgICAgICB0byBjb21waWxlIHRoZSBtb2R1bGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAkIGNjIC1jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMiBmb29fd3JhcC5jCiAgICAgICAgICAgICAgICAkIGNjIC1zaGFyZWQgZm9vX3dyYXAubyAkKE9CSlMpIC1vIF9mb28uc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIGV4dHJhIHVuZGVyc2NvcmUKCiAgICAgICAgICAgIFRoaXMgbmFtaW5nIHNjaGVtZSBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIgUHl0aG9uIG1vZHVsZXMgdGhhdAogICAgICAgICAgICB1dGlsaXplIGV4dGVuc2lvbiBjb2RlLiAgRm9yIGluc3RhbmNlLCB0aGUgc29ja2V0IG1vZHVsZSBjb25zaXN0cwogICAgICAgICAgICBvZiAiX3NvY2tldC5zbyIgYW5kICJzb2NrZXQucHkiLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywKICAgICAgICAgICAgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSB3YXMgbmFtZWQgImZvb2Ntb2R1bGUuc28iLgoKICAgICAgICAgICAgKDMpIEEgbmV3IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBpbnNlcnQgUHl0aG9uIGNvZGUgaW50bwogICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAucHkgZmlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVweXRob25jb2RlICV7CiAgICAgICAgICAgICAgICBkZWYgZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkhlbGxvIFdvcmxkIgogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2R1bGVzIGFzIGEgbWl4IG9mIEMgYW5kIFB5dGhvbi4KICAgICAgICAgICAgIFB5dGhvbiBjb2RlIGlzIHNlYW1sZXNzbHkgYWRkZWQgdG8gdGhlIG1vZHVsZS4KCiAgICAgICAgICAgICg0KSBUaGUgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICBUaGlzIGlzIHR1cm5lZCBvbgogICAgICAgICAgICBieSBkZWZhdWx0LgoKICAgICAgICAgICAgKDUpIFRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGV4dHJhIHB5dGhvbiBmaWxlLCB1c2UgdGhlICItbm9wcm94eSIKICAgICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGxpa2VseSBicmVhayB0aGUgYnVpbGQgZW52aXJvbm1lbnQgb2YgcHJvamVjdHMgdGhhdAogICAgICAgICAgICB1dGlsaXplIHNoYWRvdyBjbGFzc2VzLiAgIFRvIGZpeCB0aGlzLCB5b3UgcHJvYmFibHkgb25seSBuZWVkIHRvCiAgICAgICAgICAgIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IC5zbyBmaWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIE1ha2VmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBleGFtcGxlY21vZHVsZS5zbwoKICAgICAgICAgICAgSnVzdCBjaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gX2V4YW1wbGUuc28KCiAgICAgICAgICAgICoqKiBET0NVTUVOVEFUSU9OIFVQREFURSAqKioKICAgICAgICAgICAgVGhlIGZpbGUgRG9jL01hbnVhbC9QeXRob24uaHRtbCBoYXMgYmVlbiB1cGRhdGVkIHRvIGRlc2NyaWJlIHRoZXNlIGNoYW5nZXMuCgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtbm9leHRlcm4gb3B0aW9uLiAgIElmIHN1cHBsaWVkLCBTV0lHIHdpbGwgbm90IGdlbmVyYXRlCiAgICAgICAgICAgIGV4dHJhIGV4dGVybiBkZWNsYXJhdGlvbnMuICBUaGlzIGlzIHNvbWV0aW1lcyBhbiBpc3N1ZSBvbiAKICAgICAgICAgICAgbm9uLXVuaXggcGxhdGZvcm1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIHdhcm5pbmcgZm9yIGlnbm9yZWQgZnJpZW5kIGZ1bmN0aW9ucy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzQ0OTggXSAtcHJveHkgYW5kICVpbmNsdWRlICJwb2ludGVyLmkiIGNsYXNoLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYXZpZCBDcmVhc3kuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc2MTAzIF0gZ2xvYmFsIGRlc3RydWN0aW9uIHdhcm5pbmcgd2l0aCBzaGFkb3cuCiAgICAgICAgICAgIFBlcmwgZXh0ZW5zaW9ucyBzaG91bGQgbm8gbG9uZ2VyIHJlcG9ydCB0aGUgd2FybmluZwoKICAgICAgICAgICAgICAgIlVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGR1cmluZyBnbG9iYWwgZGVzdHJ1Y3Rpb24uIgogCiAgICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoICJwZXJsIC13Ii4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJyZXR0IFdpbGxpYW1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbiBDKysgbW9kZSwgU1dJRyBub3cgYWx3YXlzIGRlZmluZXMgbmFtZXNwYWNlIHN0ZC4gIEJ5IGRlZmF1bHQsCiAgICAgICAgICAgIGl0J3MgZW1wdHkuICBIb3dldmVyLCB0aGlzIHdpbGwgc2lsZW5jZSBlcnJvcnMgZnJvbSBwcm9ncmFtcwogICAgICAgICAgICB0aGF0IGluY2x1ZGUgc3RhdGVtZW50cyBzdWNoIGFzICJ1c2luZyBuYW1lc3BhY2Ugc3RkOyIuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgQnVnIFsgNTg0MDE3IF0gdXNpbmcgbmFtZXNwYWNlIHN0ZCBnZW5lcmF0ZXMgZXJyb3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDcvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIG5ldyB3YXJuaW5nIG1lc3NhZ2UgZm9yICVhcHBseS4gIElmIHlvdSB1c2UgJWFwcGx5IGJ1dCBubyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgZGVmaW5lZCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBzaG91bGQgaGVscCB3aXRoCiAgICAgICAgICAgIHByb2JsZW1zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqT1VUUFVUIHsgLi4uIH07CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMgb2YgU1dJRywgdGhpcyBzaWxlbnRseSBkaWQgbm90aGluZy4gIE5vdyB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgdGhpczoKICAKICAgICAgICAgICAgICAgICAgIGZpbGU6bGluZS4gV2FybmluZy4gQ2FuJ3QgYXBwbHkgKGNoYXIgKk9VVFBVVCkuIE5vIHR5cGVtYXBzIGFyZSBkZWZpbmVkLgoKMDcvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdGFydGVkIEphdmEgcHJhZ21hIGRlcHJlY2F0aW9uLiBSZXBsYWNlbWVudHMgdXNlICV0eXBlbWFwIGJhc2VkIAogICAgICAgICAgICBkaXJlY3RpdmVzIGFuZCBlbmFibGUgcHJveHkgY2xhc3NlcyBhbmQgdGhlIG5ldyB0eXBlIHdyYXBwZXIgY2xhc3NlcyB0byBiZSAKICAgICAgICAgICAgdGFpbG9yZWQgaW4gdmFyaW91cyB3YXlzLiBUaGVzZSBhcmUgdGhlIG5ldyB0eXBlbWFwczoKICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlKSAgICAgICAgICAgLSBiYXNlIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIC0gY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgSmF2YSBjbGFzczogZGVmYXVsdCBpcyAicHVibGljIgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgICAgICAgICAgIC0gamF2YSBjb2RlIGlzIGNvcGllZCB2ZXJiYXRpbSB0byB0aGUgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgICAgICAgIC0gaW1wb3J0IHN0YXRlbWVudHMgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWludGVyZmFjZXMpICAgICAtIGludGVyZmFjZXMgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgIAogICAgICAgICAgICBBbmQgdGhlc2UgYXJlIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZXMgYmVpbmcgZGVwcmVjYXRlZDoKICAgICAgICAgICAgYWxsc2hhZG93YmFzZQogICAgICAgICAgICBhbGxzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbGxzaGFkb3djb2RlCiAgICAgICAgICAgIGFsbHNoYWRvd2ltcG9ydAogICAgICAgICAgICBhbGxzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgc2hhZG93YmFzZQogICAgICAgICAgICBzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBzaGFkb3djb2RlCiAgICAgICAgICAgIHNoYWRvd2ltcG9ydAogICAgICAgICAgICBzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0YXJnZXQgYSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgRm9vICJpbXBvcnQgamF2YS51dGlsLioiOwogICAgICAgICAgICBvciBhIHBhcnRpY3VsYXIgdHlwZSB3cmFwcGVyIGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgZG91YmxlKiAiaW1wb3J0IGphdmEubWF0aC4qIjsKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAoY29ycmVjdGVkIHR5cG8gaW4gbGluZSBiZWxvdyAtIDA2LzI2LzIwMDgpCiAgICAgICAgICAgICAgICVmcmFnbWVudCgidHlwZV9oZWFkZXIiLCJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0idHlwZV9oZWFkZXIiKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGNvZGUgZnJhZ21lbnQgaXMgb25seSBlbWl0dGVkIGlmIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFjdHVhbGx5IHVzZWQuICAgQSBzaW1pbGFyIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIGFubm90YXRpb24gYW5kIHRoZSAlZmVhdHVyZSBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJmcmFnbWVudCIsInR5cGVfaGVhZGVyIikgIFNvbWVEZWNsYXJhdGlvbjsKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byAlZnJhZ21lbnQgaXMgdGhlIGZyYWdtZW50IG5hbWUuICBUaGUgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgICAgIGlzIHRoZSBmaWxlIHNlY3Rpb24gd2hlcmUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkLiAgCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUgaXMgZm9yIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgICBhbmQgYWR2YW5jZWQgdXNlcnMgd2FudGluZyB0byBzdHJlYW1saW5lIHR5cGVtYXAgY29kZS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIG1lbWJlcmluIHR5cGVtYXBzIGZvciBhbGwgYXJyYXlzIGluIGFuIGF0dGVtcHQgdG8gZWxpbWluYXRlCiAgICAgICAgICAgIGNvbmZ1c2lvbiBhYm91dCB0aGVpciB1c2UuCgowNi8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBzbWFydC1wb2ludGVycy4gIFdoZW4gYSBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIG9wZXJhdG9yLT4oKSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBCYXIgKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIGxvY2F0ZXMgY2xhc3MgQmFyIGFuZCB0cmllcyB0byB3cmFwIGl0cyBtZW1iZXIgdmFyaWFibGVzIGFuZAogICAgICAgICAgICBtZXRob2RzIGFzIHBhcnQgb2YgRm9vLiAgRm9yIGV4YW1wbGUsIGlmIEJhciB3YXMgZGVmaW5lZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFlvdSBjb3VsZCBkbyB0aGlzIChpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKToKCiAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgZi54ID0gNCAgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjp4CiAgICAgICAgICAgICAgZi5zcGFtKCkgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjpzcGFtCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEMrKwogICAgICAgICAgICBzbWFydC1wb2ludGVycy0tLXdoaWNoIGFsbG93IGF0dHJpYnV0ZXMgdG8gYWNjZXNzZWQgdHJhbnNwYXJlbnRseQogICAgICAgICAgICB0aHJvdWdoIG9wZXJhdG9yLT4uCgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkgaW4gU1dJRy0tLW5vIHNwZWNpYWwgZGlyZWN0aXZlcwogICAgICAgICAgICBhcmUgbmVlZGVkLiAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4gIFVzZSAlaWdub3JlIHRvIGlnbm9yZSAKICAgICAgICAgICAgb3BlcmF0b3ItPi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDYvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlZXhjZXB0IGRpcmVjdGl2ZS4gICAlZXhjZXB0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgowNi8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNsZWFudXAgb2YgdGhlIG1vZHVsZXMgZGlyZWN0b3J5LiAgRWxpbWluYXRlZCBtb3N0CiAgICAgICAgICAgIGhlYWRlciBmaWxlcywgY29uc29saWRhdGVkIG1vZHVsZSBjb2RlIGludG8gc2luZ2xlIGZpbGVzLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaW5zdGFudGlhdGlvbiBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgQWxsIGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMgbXVzdCBub3cgZGVmaW5lIGEgZmFjdG9yeSBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqCiAgICAgICAgICAgICAgICBzd2lnX3B5dGhvbih2b2lkKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBZVEhPTigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbiBhIHRhYmxlIGFuZCBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICAgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIHN3aWdtYWluLmN4eC4gIAoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBoYXMgYSBudW1iZXIgb2YgYmVuZWZpdHMuICBJdCBkZWNvdXBsZXMgdGhlIAogICAgICAgICAgICBTV0lHIG1haW4gcHJvZ3JhbSBmcm9tIGhhdmluZyB0byBrbm93IGFib3V0IHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9ucyBmb3IgZWFjaCBtb2R1bGUuICBBbHNvLCBieSB1c2luZyBhIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIGxvYWRpbmcKICAgICAgICAgICAgb2YgbW9kdWxlcyAoc2ltcGx5IGxvYWQgdGhlIGZpbGUgYW5kIGludm9rZSB0aGUgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbikuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3IgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28gJigpOwoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIG9wZXJhdG9yIG5ld1tdIGFuZCBvcGVyYXRvciBkZWxldGVbXS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHByb2JsZW0gZm9yIGNvbnN0YW50cyBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgaW52b2x2aW5nIHRlbXBsYXRlcy4KCjA2LzE5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBhIGJ1ZyBmb3IgdGhlICctZmVhdHVyZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50OwogICAgICAgICAgICB0aGF0IHNldHRpbmcgd2FzIGVmZmVjdGl2ZWx5IGJlaW5nIGlnbm9yZWQgYW5kIHNvIHRoZSBmZWF0dXJlCiAgICAgICAgICAgIG5hbWUgd2FzIGFsd2F5cyBzZXQgZXF1YWwgdG8gdGhlIG1vZHVsZSBuYW1lLgoKMDYvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBtZW1iZXJzIGFuZCBlbnVtcyBpbiB0ZW1wbGF0ZXMuCgpWZXJzaW9uIDEuMy4xMyAoSnVuZSAxNywgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGNoYXIgKmRhdGEgeyAuLi4gfTsgCgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHJlbmFtaW5nIGFuZCBkZWNsYXJhdGlvbgogICAgICAgICAgICBtYXRjaGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgRm9vOjpwcmludDsgICAgICAgICAgLy8gUmVuYW1lIGluIG5hbWVzcGFjZSBGb28KICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyOjpibGFoOyAgICAgICAgICAgICAgIC8vIElnbm9yZSBhIGRlY2xhcmF0aW9uCgogICAgICAgICAgICAlcmVuYW1lIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbnNpZGUgbmFtZXNwYWNlIGJsb2NrcyBhcyB3ZWxsLiBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgcHJpbnQ7ICAgICAgICAgLy8gQXBwbGllcyB0byBwcmludCBiZWxvdwoKICAgICAgICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3N0IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBzaG91bGQgd29yayBwcm9wZXJseSBpbnNpZGUgbmFtZXNwYWNlcy4KICAgICAgICAgICAgTm8gb3RoZXIgY2hhbmdlcyBhcmUgbmVlZGVkLgogICAgICAKMDMvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nLiAgIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIG1hbmFnZXMgc3RydWN0dXJlcyBhbmQgdW5pb25zIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlIHRoYW4gbm9ybWFsCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIEFOU0kgQy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IGhhdmUgYSBzdHJ1Y3R1cmUKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IEZvbygpIHsgLi4uIH0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgbW9yZSBsaWtlIEMrKy4gICBJdCdzIG5vdCBjbGVhciB0aGF0IFNXSUcgZXZlcgogICAgICAgICAgICByZWFsbHkgc3VwcG9ydGVkIHRoZSBBTlNJIEMgYW55d2F5cy0tLXVzaW5nIHRoZSBzYW1lIG5hbWUgd291bGQKICAgICAgICAgICAgYWxtb3N0IGNlcnRhaW5seSBnZW5lcmF0ZSBhIG5hbWUtY2xhc2ggaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjAzLzIyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDUxNzMwMiBdIGZvciBoYW5kbGluZyBvZiByZW5hbWVkIG92ZXJsb2FkZWQKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBOb3csIHJlbmFtZWQgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBpbnRvIGNsYXNzIHNpbmdsZXRvbiBtZXRob2RzIChiYXNpY2FsbHkgYWN0aW5nIGFzICJmYWN0b3J5IgogICAgICAgICAgICBtZXRob2RzKS4KCjAzLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MzI5NTcgXSAlaWdub3JlIHBhcnNlIGVycm9yIGFuZCBjYXN0aW5nIG9wZXJhdG9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjAzLzE4LzIwMDI6IGJlYXpsZXkgKCoqIEFEVkFOQ0VEIFVTRVJTIE9OTFkgKiopCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgY2FzdGluZyBpbiByZXR1cm4gdmFsdWVzLiAgQSBzb21ld2hhdAogICAgICAgICAgICBjb21tb24gcHJvYmxlbSBpbiBjZXJ0YWluIEMrKyBwcm9ncmFtcyBpcyBmdW5jdGlvbnMgdGhhdCBoaWRlCiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB1bmRlcmx5aW5nIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCAKICAgICAgICAgICAgZnJvbSBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBwcm9ncmFtIG1pZ2h0IGluY2x1ZGUKICAgICAgICAgICAgc29tZSBnZW5lcmljIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgTm9kZSAqZ2V0Tm9kZSgpOwoKICAgICAgICAgICAgSG93ZXZlciwgTm9kZSAqIG1heSBqdXN0IGJlIGJhc2UgY2xhc3MgdG8gYSB3aG9sZSBoaWVyYXJjaHkKICAgICAgICAgICAgb2YgZGlmZmVyZW50IG9iamVjdHMuICAgSW5zdGVhZCBvZiByZXR1cm5pbmcgdGhpcyBnZW5lcmljIE5vZGUgKiwKICAgICAgICAgICAgaXQgbWlnaHQgYmUgbmljZSB0byBhdXRvbWF0aWNhbGx5IGRvd25jYXN0IHRoZSBvYmplY3QgaW50byB0aGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZSB1c2luZyBzb21lIGtpbmQgZHluYW1pYyBjYXN0LgoKICAgICAgICAgICAgQXNzdW1pbmcgeW91IHVuZGVyc3RhbmQgdGhlIHBlcmlsIGludm9sdmVkLCBhIGRvd25jYXN0IGNhbiBub3cKICAgICAgICAgICAgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaW4gdGhlIHJ1bi10aW1lIHR5cGUKICAgICAgICAgICAgY2hlY2tlcjoKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKlNXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICosIHZvaWQgKipwdHIpOwoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgogICAgICAgICAgICB0eXBlLiAgSWYgc28sIGEgZGlmZmVyZW50IHR5cGUgZGVzY3JpcHRvciAoZm9yIHRoZSBjb252ZXJ0ZWQgdHlwZSkKICAgICAgICAgICAgaXMgcmV0dXJuZWQuICAgVGhpcyB0eXBlIGRlc2NyaXB0b3Igd291bGQgdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZQogICAgICAgICAgICBhIHBvaW50ZXIgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCiAgICAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3Ugd291bGQgd3JpdGUgYSB0eXBlbWFwIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogewogICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU1dJR19UeXBlRHluYW1pY0Nhc3QoJDFfZGVzY3JpcHRvciwgKHZvaWQgKiopICYkMSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gU1dJR19OZXdQb2ludGVyT2JqKCQxLCB0eSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogPSBTV0lHVFlQRSAqRFlOQU1JQzsKCiAgICAgICAgICAgIFRvIG1ha2UgdGhlIHR5cGVtYXAgaGF2ZSBhbnkgZWZmZWN0LCB5b3UgaGF2ZSB0byB3cml0ZSBhIHN1cHBvcnRpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHBlcmZvcm0gZG93bmNhc3RpbmcuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHN0YXRpYyBzd2lnX3R5cGVfaW5mbyAqCiAgICAgICAgICAgICAgTm9kZV9keW5hbWljX2Nhc3Qodm9pZCAqKnB0cikgewogICAgICAgICAgICAgICAgIE5vZGUgKipucHRyID0gKE5vZGUgKiopIHB0cjsKICAgICAgICAgICAgICAgICBFbGVtZW50ICplID0gZHluYW1pY19jYXN0PEVsZW1lbnQgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRWxlbWVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRGF0YSAqZCA9IGR5bmFtaWNfY2FzdDxEYXRhICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBkOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0RhdGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHR5cGVzIGFyZSBkZXRlcm1pbmVkLiBkeW5hbWljX2Nhc3Q8PgogICAgICAgICAgICB1c2VzIEMrKyBSVFRJLiAgSG93ZXZlciwgaWYgeW91IGhhZCBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcKICAgICAgICAgICAgdGhlIHR5cGUsIHlvdSBjb3VsZCB1c2UgdGhhdCBoZXJlLiAgTm90ZTogaXQgaXMgaW1wb3J0YW50IHRvIHNhdmUKICAgICAgICAgICAgdGhlIG5ldyBwb2ludGVyIHZhbHVlIGJhY2sgaW50byB0aGUgYXJndW1lbnQgYXMgc2hvd24uICBXaGVuIGRvd25jYXN0aW5nLAogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgY291bGQgY2hhbmdlLiAKCiAgICAgICAgICAgIEZpbmFsbHksIHRvIG1ha2UgdGhlIGNhc3RpbmcgZnVuY3Rpb24gYXZhaWxhYmxlLCB5b3UgaGF2ZSB0byByZWdpc3RlcgogICAgICAgICAgICBpdCB3aXRoIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIuIFB1dCB0aGlzIG1hY3JvIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICAgICBEWU5BTUlDX0NBU1QoU1dJR1RZUEVfcF9Ob2RlLCBOb2RlX2R5bmFtaWNfY2FzdCk7CgogICAgICAgICAgICBOb3RlOiB0aGlzIGZlYXR1cmUgZG9lcyBub3QgaW50cm9kdWNlIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiAKICAgICAgICAgICAgbm9ybWFsIFNXSUcgb3BlcmF0aW9uLiAgVGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGJ5IHdyaXRpbmcKICAgICAgICAgICAgYSBuZXcgdHlwZW1hcCB0aGF0IGV4cGxpY2l0bHkgY2FsbHMgU1dJR19UeXBlRHluYW1pY0Nhc3QoKSB0bwogICAgICAgICAgICBtYWtlIGEgY29udmVyc2lvbi4gCiAgCiAgICAgICAgICAgIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZHluYW1pY19jYXN0LmkgY29udGFpbnMgYSBzaW1wbGUgZXhhbXBsZS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEphdmEgbW9kdWxlIGR1ZSB0byBkaWZmZXJlbmNlcwogICAgICAgICAgICBpbiB0aGUgdHlwZS1jaGVja2luZyBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjAzLzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU21hbGwgY2hhbmdlIHRvIHR5cGUtbmFtZSBoYW5kbGluZyBvZiB1bm5hbWVkIHN0cnVjdHVyZXMgYW5kCiAgICAgICAgICAgIHR5cGVkZWYuICBJZiBhIHN0cnVjdHVyZSBvZiB0aGlzIGZvcm0gYXBwZWFyczoKCiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBUaGVuICdGb28nIGlzIHVzZWQgYXMgdGhlIHByb3BlciB0eXBlbmFtZSBmb3IgdGhlIHN0cnVjdHVyZS4KICAgICAgICAgICAgRnVydGhlcm1vcmUsIEZvbyBjYW4gbm93IGJlIHVzZWQgYXMgYSBuYW1lIGluIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgICAgU1dJRyB3YXMgYWxyZWFkeSBraW5kIG9mIGRvaW5nIHRoaXMsIGJ1dCB0aGlzIG1vZGlmaWNhdGlvbiByZWZpbmVzCiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBtb3JlIGNsb3NlbHkgZm9sbG93IHRoZSBDKysgQVJNLCBzZWN0aW9uCiAgICAgICAgICAgIDcuMS4zLCBwLiAxMDYuICBUaGlzIGZpeGVzIGEgY291cGxlIG9mIG9ic2N1cmUgY29ybmVyIGNhc2VzLgoKMDMvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBhIGZldyBlbmhhbmNlbWVudHMuICBGaXJzdCwgdHlwZSBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZWVkZWQgZm9yIGNhc3RpbmcgYW5kIHR5cGUtZXF1aXZhbGVuY2UgaXMgZ2VuZXJhdGVkIGV2ZW4gd2hlbiBiYXNlLWNsYXNzZXMKICAgICAgICAgICAgYXJlbid0IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgIHsgICAgLyogQmFyIHVuc3BlY2lmaWVkICovCiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHZvaWQgYmxhaChCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmxhaCgpIGZ1bmN0aW9uIHN0aWxsIGFjY2VwdHMgRm9vICogZXZlbiB0aG91Z2ggbm90aGluZwogICAgICAgICAgICBpcyByZWFsbHkga25vd24gYWJvdXQgQmFyLiAgIFByZXZpb3VzIFNXSUcgdmVyc2lvbnMgd291bGQganVzdCBnZW5lcmF0ZQogICAgICAgICAgICBhIHR5cGUgZXJyb3IuCgogICAgICAgICAgICBJbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgdGhyb3VnaCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBCYXIgT3RoZXJCYXI7CiAgICAgICAgICAgICAgIGNsYXNzIEZvbzogcHVibGljIE90aGVyQmFyIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBjbGFzcyBvZiBPdGhlckJhciBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgYmFjayB0bwogICAgICAgICAgICBCYXIuICAgVGhlIHVzZSBvZiB0aGUgbmFtZSBPdGhlckJhciBpcyBsb3N0IGluIHRoaXMgcmVzb2x1dGlvbiAodGhlIHdyYXBwZXJzCiAgICAgICAgICAgIHdpbGwgc2ltcGx5IHVzZSBCYXIgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIE90aGVyQmFyKS4KICAgICAgICAgICAKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICAldHlwZW1hcCwgJWFwcGx5LCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGNhbiBub3cgYXBwZWFyIGluc2lkZQogICAgICAgICAgICBjbGFzcyBkZWZpbml0aW9ucy4gICAKCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gY29tcGlsaW5nIFNXSUcgb24gNjQtYml0CiAgICAgICAgICAgIHBsYXRmb3Jtcy4KCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoICJpZ25vcmUiIGFuZCAiaW4iIHR5cGVtYXBzLiAgTG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAiaW4iIHdlcmUgYmVpbmcgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gZXZlbgogICAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIG5ldmVyIHVzZWQuICAgTW9zdGx5IGhhcm1sZXNzLCBidXQgaXQgd291bGQgbGVhZAogICAgICAgICAgICB0byBhIHZhcmlldHkgb2YgY29tcGlsYXRpb24gd2FybmluZ3MuCiAgCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCB0eXBlIHN5c3RlbSBhbmQgaGFuZGxpbmcgb2YgbmVzdGVkIEMrKwogICAgICAgICAgICB0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNvbWVtZXRob2QoQmxhaCB4KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdvdWxkIGltcGxpY2l0bHkgYmUgc2V0IHRvIEJhcjo6QmxhaC4KICAgICAgICAgICAgQWx0aG91Z2ggdGhpcyBpcyB0ZWNobmljYWxseSBhbGxvd2VkLCBpdCBicmVha3MgdHlwZW1hcHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzo6QmxhaCB7IC4uLiB9CgogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIGxpa2UgeW91IGV4cGVjdC4gICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgaW4gU1dJRy0xLjMuMTIuCiAgICAgICAgICAgIE5vdywgdHlwZXMgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjbGFzcyBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZC4KICAgICAgICAgICAgU28sIHRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3aWxsIGJlIEZvbzo6QmxhaC0tLXNpbmNlIHRoZQogICAgICAgICAgICB0eXBlIEJsYWggd2FzIGRlZmluZWQgaW4gRm9vLgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBzdWJ0bGUgdHlwZSBzY29waW5nIHByb2JsZW1zIHdpdGggdHlwZWRlZiBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBCbGFoOwogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKEJsYWggeCwgOjpCbGFoIHkpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwgY2hhbmdlIHRvIGhhbmRsZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgogICAgICAgICAgICBGaXJzdCwgdGhlcmUgaXMgbm8gcG9ydGFibGUgb3IgcmVsaWFibGUgd2F5IHRvIHdyYXAKICAgICAgICAgICAgYSB2YXJhcmdzIGZ1bmN0aW9uIGluIGZ1bGwgZ2VuZXJhbGl0eS4gIEhvd2V2ZXIsIHlvdSAqY2FuKiBjaGFuZ2UKICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2luZyAldmFyYXJncy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKikgZnByaW50ZjsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIC4uLik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyICIuLi4iIGlzCiAgICAgICAgICAgIHNpbXBseSByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiAldmFyYXJncy4gVGhpcwogICAgICAgICAgICByZXN1bHRzIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgY2hhciAqcyk7CgogICAgICAgICAgICBNb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgICBjYW4gYmUgZGVmaW5lZC4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgc3BlY2lmaWVzIGEKICAgICAgICAgICAgbWF4aW11bSBvZiBmb3VyIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKngxID0gMCwgY2hhciAqeDIgPSAwLCBjaGFyICp4MyA9IDAsIGNoYXIgKng0ID0gMCkgZnByaW50ZjsKIAogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIGhhbmRsaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuICB2YXJhcmdzCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGFzIGEgcHJvcGVyIHBhcmFtZXRlciBhbmQgaXMgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICBjb2RlIGdlbmVyYXRvci4gIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbid0IGJlIGhhbmRsZWQgY29ycmVjdGx5CiAgICAgICAgICAgIChhbmQgd2lsbCBnZW5lcmF0ZSBhIHR5cGVtYXAgd2FybmluZykuICAgVGhpcyBjaGFuZ2UgaGFzIGJlZW4KICAgICAgICAgICAgbWFkZSB0byBiZXR0ZXIgaW5jb3Jwb3JhdGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyB3aXRoIG90aGVyCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgc3VjaCBhcyAlaWdub3JlLCAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLgoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUyMjU1NSBdIFN5bnRheCBlcnJvciBwYXJzaW5nICJkZWZpbmUiIGNvbnN0cnVjdC4gU1dJRwogICAgICAgICAgICBpcyBhIGxpdHRsZSBtb3JlIHJlc3RyaWN0aXZlIGluIGRldGVybWluaW5nICNkZWZpbmUgc3RhdGVtZW50cwogICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBhcyBjb25zdGFudHMuICBBbHNvIGFkZGVkIGEgYmV0dGVyIHBhcnNlcgogICAgICAgICAgICBlcnJvciBydWxlIGZvciBoYW5kbGluZyBiYWQgY29uc3RhbnRzLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBDbGFzc2VzIHJlbmFtZWQgd2l0aCAlcmVuYW1lIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSAKICAgICAgICAgICAgYW5vdGhlciBjbGFzcyBnZW5lcmF0ZSBtb3JlIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBjb2RlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBTRiBbICM1MjM2MzIgXSBhbmQgWyAjNTEzMzM1IF0gYm90aCByZXBvcnRlZCBieSBJc3JhZWwgCiAgICAgICAgICAgIFRhbm5lci4gU3VwcG9ydCBmb3IgdHlwZXMgdGhhdCBhcmUgdXNlZCB3aGljaCBhcmUgaW4gYSB0eXBlZGVmLiBUaGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIG5hbWUgaXMgZ2VuZXJhdGVkLiBBbHNvIGdlbmVyYXRlZCBjb3JyZWN0CiAgICAgICAgICAgIHNoYWRvdyBjbGFzc25hbWUgd2hlbiBhIHRlbXBsYXRlZCBjbGFzcyBpcyB1c2VkIHdpdGhpbiBhbm90aGVyIAogICAgICAgICAgICB0ZW1wbGF0ZWQgY2xhc3MuIFNlZSB0aGUgY3BwX3R5cGVkZWYuaSB0ZXN0Y2FzZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gdHlwZSB3YXMgZ2VuZXJhdGVkIGluIHNoYWRvdyBjbGFzc2VzIGZvciB0eXBlcyAKICAgICAgICAgICAgdGhhdCB3ZXJlbid0IHdyYXBwZWQgYnkgU1dJRy4gIFRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSByYXcgCiAgICAgICAgICAgIHBvaW50ZXIsIGllIG5vIHNoYWRvdyBjbGFzcy4KCjAyLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZWQgYnkgJXJlbmFtZSwgJWlnbm9yZSwgYW5kCiAgICAgICAgICAgICVmZWF0dXJlLiAgIElmIGEgdHlwZSBzaWduYXR1cmUgaXMgc3VwcGxpZWQsIGl0IG11c3QgZXhhY3RseQogICAgICAgICAgICBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uLS0taW5jbHVkaW5nIGFueSB1c2Ugb2YKICAgICAgICAgICAgY29uc3QuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvbzEpICAgZm9vKGludCk7CiAgICAgICAgICAgICAgICAlcmVuYW1lKGJhcjEpICAgYmFyKGludCkgY29uc3Q7CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOyAgICAgICAvLyBNYXRjaGVkIC0tPiBmb28xCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpIGNvbnN0OyAvLyBOb3QgbWF0Y2hlZCAKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7ICAgICAgIC8vIE5vdCBtYXRjaGVkCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpIGNvbnN0OyAvLyBNYXRjaGVkIC0tPiBiYXIxCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBub24tY29uc3Qgc3BlY2lmaWNhdGlvbiB3b3VsZCBtYXRjaAogICAgICAgICAgICBib3RoIHRoZSBub24tY29uc3QgYW5kIGNvbnN0IGRlY2xhcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSB3aG9sZQogICAgICAgICAgICBwb2ludCBvZiAlcmVuYW1lIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgaXMgdGhhdCB0aGV5IGJlIGFibGUKICAgICAgICAgICAgdG8gcHJlY2lzZWx5IHBpbnBvaW50IGV4YWN0IGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIHRoZSBwcm9ibGVtLgoKMDIvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMuCiAgICAgICAgICAgIFNXSUcgbm93IG1ha2VzIGEgcHJlbGltaW5hcnkgcGFzcyBvdmVyIHRoZSBwYXJzZSB0cmVlIHRvIGRpc2NvdmVyCiAgICAgICAgICAgIHdoaWNoIGNsYXNzZXMgc3VwcG9ydCBkZWZhdWx0IGFsbG9jYXRpb24uICAgVGhpcyBmaXhlcyBhIG51bWJlcgogICAgICAgICAgICBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFuZCBjYWxsL3JldHVybiBieSB2YWx1ZS4KCjAyLzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IG9uIEN5Z3dpbjogUGVybCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIEphdmEgc2hvdWxkCiAgICAgICAgICAgIHdvcmsgb3V0IG9mIHRoZSBib3gsIGJhcnJpbmcgdGhlIHJ1bnRpbWUgbGlicmFyeS4gUmVtb3ZlZCBkbGx3cmFwIAogICAgICAgICAgICBhbmQgcmVwbGFjZWQgd2l0aCBuZXdseSB3b3JraW5nIGdjYyAtc2hhcmVkIGluc3RlYWQgZm9yIEN5Z3dpbi4gCiAgICAgICAgICAgIEFsbCB0aGlzIHdpbGwgcmVxdWlyZSB0aGUgbmV3IGltcHJvdmVkIGJpbnV0aWxzIDIwMDEwODAyIGFuZCBsYXRlciwKICAgICAgICAgICAgYnV0IHRoZSBsYXRlc3QgQ3lnd2luIGlzIHVzdWFsbHkgdGhlIGJlc3QgcmVjb21tZW5kYXRpb24uCgowMi8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFuZCBQZXJsIHNoYWRvdyBjbGFzc2VzLiBSZXBvcnRlZCBieSBDaGlhLWxpYW5nIEthby4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZml4IHRvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIEMrKyBjbGFzcwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgc28gdGhhdCB3ZSBnZXQgYm90aCBhICJuZXciIHNpbmdsZXRvbiBtZXRob2QKICAgICAgICAgICAgYW5kIGFuICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yIGVhY2ggY2xhc3MuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIGVuYWJsZXMgZGV2ZWxvcGVycyB0byBkZXJpdmUgbmV3IFJ1YnkgY2xhc3NlcyBmcm9tCiAgICAgICAgICAgIFNXSUctd3JhcHBlZCBDKysgY2xhc3NlcyBhbmQgdGhlbiBvdmVycmlkZSB0aGVpciBpbml0aWFsaXplCiAgICAgICAgICAgIG1ldGhvZHMgdG8gcHJvdmlkZSBzdWJjbGFzcy1zcGVjaWZpYyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYXNzaXZlIGRvY3VtZW50YXRpb24gdXBkYXRlIGZvciB0aGUgUnVieSBtb2R1bGUsCiAgICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEZpbGVzLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEFuIGVycm9yIGluIHRoZSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUnVieQogICAgICAgICAgICB3YXMgY2F1c2luZyBzZXZlcmFsIG9mIHRoZSBleGFtcGxlcyB0byBmYWlsLiBSZXBvcnRlZCBieQogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBFbnVtZXJhdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcyAoc3VjaAogICAgICAgICAgICBhcyB0aG9zZSBzZWVuIGluIHRoZSBFeGFtcGxlcy9ydWJ5L2VudW0gZXhhbXBsZSkgd2VyZSBub3QKICAgICAgICAgICAgYmVpbmcgZXhwb3J0ZWQgd2l0aCB0aGUgY29ycmVjdCBuYW1lcy4gUmVwb3J0ZWQgYnkgV2lsbGlhbQogICAgICAgICAgICBGdWx0b24uCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB3ZSBydW4gYWNyb3NzIG92ZXJsb2FkZWQKICAgICAgICAgICAgY2xhc3MgY29uc3RydWN0b3JzIGZvciBDKysgY29kZSwgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBub3QKICAgICAgICAgICAgc3VwcG9ydGVkIChldmVuIGlmIHRoZSBvdmVybG9hZHMgaGF2ZSBiZWVuICVyZW5hbWVkKS4gRm9yIGFuCiAgICAgICAgICAgIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmssIHNlZSBFeGFtcGxlcy9ydWJ5L29wZXJhdG9yLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGFuICJpZ25vcmVkIiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgcGFyc2VyIHJ1bnMKICAgICAgICAgICAgYWNyb3NzIGFuIG9wZXJhdG9yIT0oKSBkZWNsYXJhdGlvbiBmb3IgQysrIGNvZGUuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICJpbXBvcnQiLCAiaW1wb3J0X3RlbXBsYXRlIiwgIm9wZXJhdG9yIiBhbmQKICAgICAgICAgICAgInRlbXBsYXRlIiBleGFtcGxlcy4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtdWx0aS1tb2R1bGUgc3VwcG9ydC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgbWlzc2luZyAiI2RlZmluZSBTV0lHX05PSU5DTFVERSIgYXQgdGhlIHRvcCBvZgogICAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdoZW4gdGhlICctYycgb3B0aW9uIGlzIHVzZWQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBDb3JyZWN0ZWQgYSBtaW5vciBvZmYtYnktb25lIGVycm9yIGZvciB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgICAgc3dpZ190eXBlc1tdIGFycmF5IHRoYXQncyBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIgY29kZS4KCjAyLzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgU0YgWyAjNTE1MDU4IF0gV3JvbmcgY29kZSBmb3IgQysrIHRlbXBsYXRlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KClZlcnNpb24gMS4zLjExIChKYW51YXJ5IDMxLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIGZvciBDKysgb2JqZWN0cyB0aGF0IGRlZmluZQogICAgICAgICAgICBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyB0byB0aGUgdHlwZW1hcCBzeXN0ZW0KICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHdyYXAgQysrIG9iamVjdHMgd2l0aCBubyBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLiAgIFRoaXMgaGFzIGJlZW4gZml4ZWQsIGJ1dCB0aGUgc29sdXRpb24gCiAgICAgICAgICAgIGludm9sdmVzIHNvbWUgY2xldmVyIHRlbXBsYXRlIG1hZ2ljIGNvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4gIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBmaWxlCiAgICAgICAgICAgIExpYi9zd2lnLnN3ZyBmb3IgZnVydGhlciBkZXRhaWxzLiAgVGhpcyBzb2x1dGlvbiBpcwogICAgICAgICAgICBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZWZpbmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEdsb2JhbCB2YXJpYWJsZXMgYW5kIG1lbWJlciBkYXRhIG9mIHR5cGUgImNvbnN0IGNoYXIgKiIKICAgICAgICAgICAgY2FuIGJlIHNldCwgYnV0IHRoZSBvbGQgdmFsdWUgaXMgc2lsZW50bHkgZGlzY2FyZGVkIHdpdGhvdXQKICAgICAgICAgICAgYW55IGdhcmJhZ2UgY29sbGVjdGlvbi4gICBUaGlzIG1heSBnZW5lcmF0ZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgdG8gbW9yZSBzYWZlbHkgaGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vID0gIkhlbGxvIFdvcmxkXG4iOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCdzIG5vdCBzYWZlIHRvIGZyZWUgdGhlIG9sZCB2YWx1ZS4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgY2FuIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IHZhbHVlIGFuZCBtYWtlIGZvbyBwb2ludAogICAgICAgICAgICB0byBpdC4gICBUbyBmaXggdGhpcyBtZW1vcnkgbGVhaywgeW91IGNhbiBwcm9iYWJseSBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNsZWFyIGNvbnN0IGNoYXIgKmZvbzsKICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKiB7Y29uc3QgY2hhciAqZm9vfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbWlub3IgdHlwZW1hcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLiAgRmlyc3QsCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBieSBpbmNsdWRpbmcgYSBzcGVjaWFsCiAgICAgICAgICAgIHdhcm5pbmcgYXR0cmlidXRlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChpbix3YXJuaW5nPSJJJ20gZ29pbmcgdG8gZG8gc29tZXRoaW5nIGRhbmdlcm91cyIpIC4uLgoKICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZSB3aWxsIHNob3cgdXAgd2hlbmV2ZXIgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYXBwbGllZC4KCiAgICAgICAgICAgIFNlY29uZCwgYSB0eXBlbWFwIGNhbiBmb3JjZSBhIG5vLW1hdGNoIGJ5IGRlZmluaW5nCgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHNvbWV0eXBlICJwYXNzIjsKCiAgICAgICAgICAgIElmIHRoaXMgaXMgdXNlZCwgdGhlIHR5cGVtYXAgc3lzdGVtIHdpbGwgKm5vdCogcmVjb3JkIGEKICAgICAgICAgICAgdHlwZW1hcCBtYXRjaCBmb3IgInNvbWV0eXBlIi4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGJsb2NrCiAgICAgICAgICAgIHNlbGVjdGVkIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZGlzYWJsZQogICAgICAgICAgICBhIHR5cGVtYXAgZmVhdHVyZSBmb3Igc29tZSB0eXBlLCB5b3UgY291bGQgZG8gdGhpcy4KCiAgICAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBnbG9iYWwgdmFyaWFibGVzIG9mIHR5cGUgJ2NvbnN0IGNoYXIgKicgdG8gYmUgc2V0LgogICAgICAgICAgICAgICAldHlwZW1hcCh2YXJpbikgY29uc3QgY2hhciAqICJwYXNzIjsKCiAgICAgICAgICAgIEl0IG1pZ2h0IGFsc28gYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgdG8gZG8gc3VidGxlIGFuZAogICAgICAgICAgICBzdHJhbmdlIHRoaW5ncyB3aXRoIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICAgbWFrZSAnYmxhaCAqJyBhbiBvdXRwdXQgdmFsdWUgYW5kICdjb25zdCBibGFoIConIGFuIGlucHV0CiAgICAgICAgICAgIHBhcmFtZXRlciwgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBibGFoICooYmxhaCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBCbG9jayB1bnF1YWxpZmllZCB0eXBlbWFwcyBkZWZpbmVkIGFib3ZlICovCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgICAgIGNvbnN0IGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBpbnB1dCB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAoVGhpcyBwb3RlbnRpYWwgYXBwbGljYXRpb25zIG9mIHR5cGVtYXBzIHN1Z2dlc3RlZCBieSBHcmVnIFN0ZWluKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMjkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIGVudW1lcmF0aW9ucyB3ZXJlIHdyYXBwZWQgd2hlbiB0aGUgLXNoYWRvdyAKICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgowMS8yOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGFycmF5cyBhcmUgc3VjY2Vzc2Z1bGx5IHdyYXBwZWQuIEluIGZhY3QgdGhleSBzdGFydGVkCiAgICAgICAgICAgbW9zdGx5IHdvcmtpbmcgaW4gU1dJRy0xLjMuMTAuCgowMS8yOC8yMDAyOnJpY2hhcmRwCgkgICBBZGRlZCBmaXJzdCBhdHRlbXB0IGF0IEMrKyBhbmQgLXNoYWRvdyBzdXBwb3J0IGZvciBQSFA0IG1vZHVsZSwKCSAgIHBsZWFzZSB0ZXN0IGFuZCBtYWlsIG1lIGlmIGFueSBwcm9ibGVtcy9pZGVhcyBvbiBpbXByb3ZpbmcgaXQuCgoJICAgVGhlcmUgaXMgYSBrbm93biBwcm9ibGVtIHdpdGggdW5pbml0aWFsaXplZCBtZW1iZXIgdmFyaWFibGVzLAoJICAgcGxlYXNlIHNlZSBFeGFtcGxlcy9waHA0L3N5bmMvUkVBRE1FIGZvciBkZXRhaWxzLgoKCSAgIEFsc28gbW9yZSBQSFAgZG9jdW1lbnRhdGlvbiBhZGRlZCB0byBEb2MvTWFudWFsL1BocC5odG1sCgowMS8yNy8yMDAyOmJlYXpsZXkKICAgICAgICAgICBUaGUgQU5TSSBDIHNpemVfdCB0eXBlIGlzIG5vdyByZWNvZ25pemVkIGFzIGFuIGludGVnZXIgYnkgZGVmYXVsdC4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHN1cHBvcnQgYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgIFRoaXMgaXMgbm90IGEgcG9ydGFibGUgZmVhdHVyZSBhbmQgd2lsbCByZXF1aXJlIGNvbXBpbGVyIHN1cHBvcnQKICAgICAgICAgICBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiAgSW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgICAgICAgbG9uZyBsb25nIChlLmcuLCBUY2wgYW5kIFBlcmwpLCBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKICAgICAgICAgICBvZiBkaWdpdHMuICBUaGlzIHByZXZlbnRzIHRoZWlyIHVzZSBpbiBhcml0aG1ldGljIGNhbGN1bGF0aW9ucywgYnV0CiAgICAgICAgICAgc3RpbGwgYWxsb3dzIHZhbHVlcyB0byBiZSBzZXQgZnJvbSBhIHN0cmluZy4gIAoKICAgICAgICAgICBsb25nIGxvbmcgc3VwcG9ydCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBzdHJ0b2xsKCkgYW5kIHN0cnRvdWxsKCkKICAgICAgICAgICBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgJ2xsZCcgYW5kICdsbHUnIGZvcm1hdCBzcGVjaWZpZXJzCiAgICAgICAgICAgb2Ygc3ByaW50ZigpLgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNTAxODI3IF0gRGVsZXRlIG1ldGhvZCBpcyBub3QgY2FsbGVkLiAgIFRoZSBUY2wKICAgICAgICAgICBtb2R1bGUgd2Fzbid0IGNvcnJlY3RseSBjYWxsaW5nIGRlc3RydWN0b3JzIHdoZW4gdGhleQogICAgICAgICAgIHdlcmUgZGVmaW5lZCB1c2luZyAlYWRkbWV0aG9kcy4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUmVpbmhhcmQgRm9iYmUuCgowMS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLiAgVHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gYSBudW1iZXIgb2YgbW9kdWxlcyBmb3IgaGFuZGxpbmcgdGhlc2UgdHlwZXMuCiAgICAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBwYXJzZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYWNjZXB0IGxvbmcgbG9uZwogICAgICAgICAgIGxpdGVyYWxzIHN1Y2ggYXMgMTIzNExMIGFuZCAxMjM0VUxMLgoKMDEvMjcvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEEgQyBjaGFyW10gaXMgbWFwcGVkIHRvIGEgSmF2YSBTdHJpbmcgd2hpY2ggaXMgdGhlIGRlZmF1bHQgCiAgICAgICAgICAgU1dJRyBoYW5kbGluZyBvZiBjaGFyW10gYW5kIGNoYXIqLiBJdCB1c2VkIHRvIGJlIG1hcHBlZCB0byBieXRlW10uIAogICAgICAgICAgIE5vdGUgdGhhdCBhIEMgc2lnbmVkIGNoYXJbXSBhcnJheSBpcyBtYXBwZWQgdG8gYnl0ZVtdLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjAxLzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCByZXR1cm4tYnktdmFsdWUsIEMrKywgYW5kCiAgICAgICAgICAgb2JqZWN0cyB0aGF0IGRlZmluZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvZWwgUmVlZC4KCjAxLzI1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBPdmVyaGF1bCBvZiB0aGUgSmF2YSBtb2R1bGUuIFRoZSBDIGNvZGUgZ2VuZXJhdGlvbiBpcyBub3cgCiAgICAgICAgICAgZG9uZSBmcm9tIHR5cGVtYXBzLgoKMDEvMjQvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFN1cHBvcnQgZm9yIGFycmF5cyBvZiBlbnVtIHBvaW50ZXJzCgowMS8yMC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRXJyb3IgY2hlY2tpbmcgZm9yIG51bGwgSmF2YSBvYmplY3RzIGJlaW5nIHBhc3NlZCB0byBuYXRpdmUgCiAgICAgICAgICAgZnVuY3Rpb25zLiAgRXhjZXB0aW9uIHRocm93biBub3cgd2hlcmVhcyBiZWZvcmUgdGhlIEpWTSBjcmFzaGVkLgoKMDEvMTgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENvcnJlY3RlZCBiZWhhdmlvdXIgZm9yIGZ1bmN0aW9ucyB0aGF0IHRha2UgYXJyYXlzLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgd2hlbiB0aGlzIGMgZnVuY3Rpb246IAoKICAgICAgICAgICB2b2lkIGFycmF5Zm4oaW50IGFycmF5W10pOwogICAgICAgICAgIAogICAgICAgICAgIGlzIHdyYXBwZWQgdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGZ1bmN0aW9uCgogICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgYXJyYXlmbihpbnRbXSBhcnJheSk7CgogICAgICAgICAgIGlzIHByb2R1Y2VkLiBQcmV2aW91c2x5IGlmIHRoZSBDIGZ1bmN0aW9uIG1hZGUgYW55IGNoYW5nZXMgdG8gdGhlIAogICAgICAgICAgIGFycmF5IGVsZW1lbnRzLCB0aGVzZSB3ZXJlIG5vdCByZWZsZWN0ZWQgYmFjayBpbnRvIHRoZSBKYXZhIGFycmF5LiAKICAgICAgICAgICBUaGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQgc28gdGhhdCB0aGUgY2hhbmdlcyBhcmUgcHJvcG9nYXRlZCBiYWNrCiAgICAgICAgICAgdG8gSmF2YSBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCBzZWUgdGhlc2UgY2hhbmdlcy4gVGhpcyBpcyAKICAgICAgICAgICBob3cgcHVyZSBKYXZhIGZ1bmN0aW9ucyB3b3JrLCBpZSBhcnJheXMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCgowMS8xNS8yMDAyOm1rb2VwcGUKICAgICAgICAgICBbR3VpbGVdIE5ldyBmaWxlIGNwbHVzcGx1cy5pIHdpdGggQysrIHR5cGVtYXBzIGNvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgTWFyY2lvIEx1aXMgVGVpeGVpcmEgPG1hcmNpb3RAaG9sbHkuY29sb3N0YXRlLmVkdT4uCgowMS8xMS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2hhbmdlZCBtYXBwaW5nIG9mIEMgbG9uZyB0byBKYXZhIHR5cGUuIFdhcyBtYXBwZWQgdG8gSmF2YQogICAgICAgICAgIGxvbmcsIG5vdyBtYXBwZWQgdG8gSmF2YSBpbnQuIElmIHlvdSB3YW50IHRoZSBwcmV2aW91cyBtYXBwaW5nIHRvIAogICAgICAgICAgIEphdmEgbG9uZyB1c2UgdGhpcyBhcHByb2FjaCBpbiB5b3VyIGludGVyZmFjZSBmaWxlOgogICAgICAgICAgIAogICAgICAgICAgICAgJWNsZWFyIGxvbmc7CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmcgICAgICAgICAgICAgImpsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmcgICAgICAgICAgICJsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nICAgICAgICAgICJsb25nIgoKICAgICAgICAgICAgICVjbGVhciBsb25nW0FOWV07CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmdbQU5ZXSAgICAgICAgImpsb25nQXJyYXkiCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZ1tBTlldICAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZ1tBTlldICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGxvbmdbQU5ZXSAgICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgbG9uZ1tBTlldICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGxvbmdbQU5ZXSAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgbG9uZ1tBTlldICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIFRoaXMgbmV3IG1hcHBpbmcgaXMgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIGludGVyZmFjaW5nIHRvIDMyIGJpdCAKICAgICAgICAgICBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgMzItYml0IEpWTXMuIEZvciBmdXR1cmUgCiAgICAgICAgICAgNjQtYml0IEpWTXMgeW91IG1heSBoYXZlIHRvIGNoYW5nZSB0aGVzZSBtYXBwaW5ncyAtIGVnIG9uIFVuaXggTFA2NCAKICAgICAgICAgICBzeXN0ZW1zLCBidXQgbm90IG9uIE1pY3Jvc29mdCA2NGJpdCBXaW5kb3dzIHdoaWNoIHdpbGwgYmUgdXNpbmcgYSAKICAgICAgICAgICBQNjQgSUwzMiBtb2RlbC4gVGhpcyBtYXkgYmUgYXV0b21hdGVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU1dJRy4KCjAxLzEwLzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgNTAxNjc3IF0gJWluaXQgYmxvY2sgaW4gd3JvbmcgcGxhY2UuIFJlcG9ydGVkCiAgICAgICAgICAgYnkgTHVpZ2kgQmFsbGFiaW8uCgowMS8wOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBzdXBwb3J0IGZvciB0aGUgbG9uZyBsb25nIHR5cGUuIHNpZ25lZCBsb25nIGxvbmcgaXMgCiAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBsb25nLiB1bnNpZ25lZCBsb25nIGxvbmcgaXMgbWFwcGVkIHRvIEJpZ0ludGVnZXIuCgowMS8wOS8yMDAyOmJlYXpsZXkKICAgICAgICAgICBFeHBlcmltZW50YWwgY2hhbmdlIHRvIHBhcnNlciB0byBiZXR0ZXIgc3VwcG9ydCBtaXhpbmcgb2YKICAgICAgICAgICBpbnQsIGxvbmcsIHNob3J0LCB1bnNpZ25lZCwgZmxvYXQsIGFuZCBkb3VibGUuICAgVGhlIHBhcnNlcgogICAgICAgICAgIHNob3VsZCBub3cgc3VwcG9ydCB0eXBlcyBsaWtlIHRoaXM6CiAgICAKICAgICAgICAgICAgICAgIHNob3J0IHVuc2lnbmVkIGludAogICAgICAgICAgICAgICAgaW50ICAgdW5zaWduZWQgc2hvcnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNob3J0CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuYWJsZXMgYSB0eXBlIG9mICdsb25nIGRvdWJsZScgKHByZXZpb3VzbHkKICAgICAgICAgICAgdW5zdXBwb3J0ZWQpIHRvIGJlIHVzZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDYXN0aW5nIGZpeCBmb3Igd2hlbiBmdW5jdGlvbiByZXR1cm4gdHlwZSBpcyBhIHBvaW50ZXIgYXMgCiAgICAgICAgICAgcmVwb3J0ZWQgYnkgR2FyeSBQZW5uaW5ndG9uIDIwMDItMDEtMDUuIFRoZSB1cHBlciAzMmJpdHMgb2YgdGhlIAogICAgICAgICAgIDY0IGJpdCBqbG9uZyB3aWxsIGhhdmUgY29udGFpbmVkIGp1bmsgZm9yIDMyYml0IHBvaW50ZXJzLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJldHRlciBwb2ludGVyIGhhbmRsaW5nIGluIEphdmEgaXMgcG9zc2libGUgYXMgdGhlIAogICAgICAgICAgIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGhhdmUgYmVlbiBhZGRlZCBpbnRvIHR5cGVtYXBzLmkuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gJG51bGwgY2FuIGJlIHVzZWQgaW4gaW5wdXQgdHlwZW1hcHMgdG8gcmV0dXJuIGVhcmx5IGZyb20gSk5JIAogICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGhhdmUgZWl0aGVyIHZvaWQgb3IgYSBub24tdm9pZCByZXR1cm4gdHlwZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChjaGVjaykgaW50ICogJXsgCiAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICV9CgogICAgICAgICAgIElmIHRoZSB0eXBlbWFwIGdldHMgcHV0IGludG8gYSBmdW5jdGlvbiB3aXRoIHZvaWQgYXMgcmV0dXJuLCAkbnVsbCAKICAgICAgICAgICB3aWxsIGV4cGFuZCB0byBub3RoaW5nOgoKICAgICAgICAgICAgIHZvaWQgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKICAgICAgICAgICBvdGhlcndpc2UgJG51bGwgZXhwYW5kcyB0byB6ZXJvLCB3aGVyZSBqYXZhcmV0dXJudHlwZSBpcyBlaXRoZXIgYSAKICAgICAgICAgICBwb2ludGVyIG9yIGEgcHJpbWl0aXZlIHR5cGU6CgogICAgICAgICAgICAgamF2YXJldHVybnR5cGUgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCjAxLzAyLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBUaGUgSmF2YSBtb2R1bGUgaW5jb3JyZWN0bHkgdXNlZCBhcmdvdXQgdHlwZW1hcHMgZm9yIAogICAgICAgICAgIHN0cmluZ3MuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCBhbmQgdGhlIGNvZGUgbm93IHJlc2lkZXMKICAgICAgICAgICBpbiB0aGUgZnJlZWFyZyB0eXBlbWFwLiBUaGUgYXJnb3V0IGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBzcGxpdCBpbnRvIAogICAgICAgICAgIGFyZ291dCBhbmQgZnJlZWFyZyB0eXBlbWFwcy4gVGhpcyBjb3JyZWN0aW9uIG1heSByZXF1aXJlIHNvbWUgdXNlciAKICAgICAgICAgICB3cml0dGVuIHR5cGVtYXBzIHRvIGJlIG1vZGlmaWVkLiAKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBNdWx0aSB0eXBlbWFwcyBub3cgd29ya2luZyBmb3IgSmF2YSBzZWUgbXVsdGltYXAgZXhhbXBsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyAtIGZyZWVhcmcgdHlwZW1hcCBjb2RlIHdhcyBhcHBlYXJpbmcKICAgICAgICAgICBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gSkNBTEwgbWFjcm8gZm9yIEpOSSBjYWxscyB0aGF0IHdvcmsgaW4gYm90aCBDIGFuZCBDKysgdHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBKQ0FMTDAsIEpDQUxMMSwgSkNBTEwyLCBKQ0FMTDMgYW5kIEpDQUxMNCAKICAgICAgICAgICBtYWNyb3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSZXNvbHZlZCBzb21lIGluY29uc2lzdGVudCBiZWhhdmlvciB3aXRoICVyZW5hbWUgYW5kIGNsYXNzIHJlbmFtaW5nLgogICAgICAgICAgIElmIHlvdSBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICBCYXI7CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZW4gdGhlICVyZW5hbWUgZGlyZWN0aXZlIGFwcGxpZXMgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLAogICAgICAgICAgIGFuZCB0aGUgZGVzdHJ1Y3RvciAoYWxsIHdpbGwgYmUgcmVuYW1lZCB0byBGb28pLgoKICAgICAgICAgICBJZiBhIGNsYXNzIGRlZmluZXMgbW9yZSB0aGFuIG9uZSBjb25zdHJ1Y3RvciwgdGhlIG92ZXJsb2FkZWQgdmFyaWFudHMKICAgICAgICAgICBjYW4gc3RpbGwgYmUgcmVuYW1lZCBieSBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMgdG8gJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXJlbmFtZShCYXJfY29weSkgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICAgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIG9kZCBjb3JuZXIgY2FzZXMuICBJZiB5b3Ugc3BlY2lmeQoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pIDo6QmFyOwoKICAgICAgICAgICB0aGVuIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIGNoYW5nZWQgYW5kIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCiAgICAgICAgICAgbmFtZXMgYXJlIGxlZnQgdW5tb2RpZmllZC4gIElmIHlvdSBzcGVjaWZ5IAoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICo6OkJhcjsKCiAgICAgICAgICAgdGhlbiB0aGUgbmFtZXMgb2YgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZnVuY3Rpb25zIGFyZSBtb2RpZmllZCBidXQKICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgbm90LgoKMTIvMjEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIGpuaSwganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcyBubyBsb25nZXIgaGFyZGNvZGVkIGJ1dCByZWFsIAogICAgICAgICAgIHR5cGVtYXBzLiBOZXcgdmFyaWFibGUgc3Vic3RpdHV0aW9uLCAkamF2YWNsYXNzbmFtZSwgY2FuIGJlIHVzZWQgaW4KICAgICAgICAgICB0aGUganN0eXBlIHR5cGVtYXBzLiBJdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBKYXZhIHNoYWRvdyBjbGFzcyBuYW1lCiAgICAgICAgICAgd2hlcmUgYXBwbGljYWJsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyB0byBkbyB3aXRoIGluaGVyaXRhbmNlIHdoZW4gCiAgICAgICAgICAgdXNpbmcgJWltcG9ydC4KICAgICAgICAgICBbSmF2YV0gQSBmZXcgbW9yZSBidWcgZml4ZXMsIHRvZG8gd2l0aCAlcmVuYW1lIGFuZCB1c2luZyB0aGUga2luZAogICAgICAgICAgIHdpdGggdGhlIHR5cGUsIGVnIAogICAgICAgICAgIHZvaWQgZm4odW5pb24gdW5pIG15dW5pLCBzdHJ1Y3Qgc3RyIG15c3RyLCBjbGFzcyBjbCBteWNsKTsKCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ5NDUyNCBdIFByZXByb2Nlc3NvciBidWcgLSBhcG9zdHJvcGhlIGFuZCAjc3Vic3QuCgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBTV0lHX1ZFUlNJT04gcHJlcHJvY2Vzc29yIHN5bWJvbC4gICBUaGlzIGlzIGEgaGV4YWRlY2ltYWwKICAgICAgICAgICBpbnRlZ2VyIHN1Y2ggYXMgMHgwMTAzMTEgKGNvcnJlc3BvbmRpbmcgdG8gU1dJRy0xLjMuMTEpLiAgVGhpcyBjYW4KICAgICAgICAgICBiZSB1c2VkIGluIHRoZSBpbnRlcmZhY2UgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICNpZiBTV0lHX1ZFUlNJT04gPj0gMHgwMTAzMTEKICAgICAgICAgICAgICAgLyogVXNlIHNvbWUgZmFuY3kgbmV3IGZlYXR1cmUgKi8KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgIE5vdGU6IFRoZSB2ZXJzaW9uIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIFNXSUcKICAgICAgICAgICB3cmFwcGVyIGZpbGUuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEyLzIwLzIwMDE6bWtvZXBwZQoJICAgW016U2NoZW1lXTogUmVuYW1lZCBtenN3aWdfbWFrZV9ib29sZWFuIHRvCgkgICBzd2lnX21ha2VfYm9vbGVhbiwgYXMgdGhlIGxhdHRlciBpcyB1c2VkIGluIHRoZSB0eXBlbWFwcy4KCSAgIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMTIvMTcvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBSZXdyb3RlIGxpc3QtdmVjdG9yLmkgdXNpbmcgbXVsdGktZGlzcGF0Y2gKCSAgIHR5cGVtYXBzLiAgVXBkYXRlZCBwb2ludGVyLWluLW91dC5pLiAgTWFrZSB0aGUKCSAgIGRlcHJlY2F0ZWQgdHlwZW1hcC1zdWJzdGl0dXRpb24gb2YgIiRzb3VyY2UiIGluICJhcmdvdXQiCgkgICB3b3JrIGFzIGJlZm9yZS4KCjEyLzE2LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgbWFjcm9zICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAlbXVsdGlwbGVfdmFsdWVzIHRvIHVzZSB0aGUgcHJvcGVyICVwcmFnbWEgc3ludGF4LiAgTmV3CgkgICBHdWlsZSBleGFtcGxlL3Rlc3QgIm11bHRpdmFsdWUiOyBuZXcgR3VpbGUgcnVuLXRlc3QgZm9yCgkgICB0ZXN0LXN1aXRlIGl0ZW0gImxpc3QtdmVjdG9yIiAoY3VycmVudGx5IGJyb2tlbikuCgoxMi8xNC8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIHR5cGVtYXAtc3Vic3RpdGlvbiBidWcgZm9yICJ2YXJpbiIuICBSZWxheGVkCgkgICB2YWxpZC1pZGVudGlmaWVyIGNoZWNrIHRvIGFsbG93IGFsbCBSNVJTIGlkZW50aWZpZXJzLgoKClZlcnNpb24gMS4zLjEwIChEZWNlbWJlciAxMCwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgJXR5cGVtYXAgc28gdGhhdCAleyAuLi4gJX0gY2FuIGFsc28gYmUgdXNlZCBhcyBhCiAgICAgICAgICAgY29kZSBibG9jayAobW9zdGx5IGZvciBjb21wbGV0ZW5lc3MpLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAlewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoaXMgZm9ybSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBuZXcgYmxvY2sgc2NvcGUuICBBbHNvLCB0aGUKICAgICAgICAgICBjb2RlIGVuY2xvc2VkIGluICV7IC4uLiAlfSBpcyBub3QgcHJvY2Vzc2VkIGJ5IHRoZSBwcmVwcm9jZXNzb3IuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NTk2MTQgXSBTV0lHIHdpdGggbXVsdGlwbGUgVENMIGludGVycHJldGVycy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxNzE0MSBdIHJ1YnlkZWMuc3dnIGlzIHdyb25nCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUGF1bCBCcmFubmFuLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDEwNTU3IF0gUHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIG9uIE5ULgogICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hZ251cyBManVuZy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ0NTIzMyBdIEVuaGFuY2VtZW50OiBoYW5kbGUgYWNjZXNzIGNoYW5nZS4KICAgICAgICAgICBTV0lHIG5vdyBwYXJzZXMgKGJ1dCBpZ25vcmVzKSBDKysgYWNjZXNzIGNoYW5nZXMgZm9yIHRoZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZygpIHsgfQogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQSgpIHt9CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIGNsYXNzIEIgOiBwcml2YXRlIEEgewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQigpIDogQSgpIHsgfQogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgQTo6c29tZXRoaW5nOyAgICA8LS0tLSBQYXJzZWQsIGJ1dCBpZ25vcmVkCiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgoxMi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBGaXggZm9yIFJ1YnkgdG8gd29yayB1c2luZyBWaXN1YWwgQysrLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDY1Njg3IF0gdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVycyBmYWlsLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4OTU5NCBdIFB5U3RyaW5nX0Zyb21TdHJpbmcgY2FuJ3QgdGFrZSBOVUxMIGFyZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2huIE1lcnJpdHQuICAgU1dJRyBub3cgY29udmVydHMgc3RyaW5nIHZhbHVlcwogICAgICAgICAgIHRvIFB5dGhvbiB1c2luZyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgcmVzdWx0b2JqID0gcmVzdWx0ID8gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXN1bHQpIDogUHlfQnVpbGRWYWx1ZSgiIik7CgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NjM1NjEgXSBUeXBlIGNvbnZlcnNpb25zIG5vdCBnZW5lcmF0ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoJCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MDIxNyBdIFRjbCBkZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcyMDg4IF0gZGVmaW5lZChNQUNSTykgZXhwYW5kZWQgZXZlcnl3aGVyZS4KICAgICAgICAgICBFbWJlZGRlZCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBzdWNoIGFzCgogICAgICAgICAgICAgICUjaWYgZGVmaW5lZChGT08pCgogICAgICAgICAgIGFyZSBub3QgZXhwYW5kZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NjQ2NyBdIFByb2JsZW1zIHdpdGggI2RlZmluZSAmIGNvbW1hcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NzU0NyBdIHdyb25nIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEJhZCBwcm90b3R5cGVzIGluIExpYi90Y2wvcHRybGFuZy5pLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDgzMTgyIF0gQ29uc3RhbnRzIGNhbiB0YWtlIGFyZ3MgYnkgbWlzdGFrZS4gCiAgICAgICAgICAgV2hlbiBzd2lnIC1wZXJsNSAtY29uc3QgaXMgdXNlZCwgY29uc3RhbnRzIGFyZSBkZWNsYXJlZAogICAgICAgICAgIHdpdGggYSB2b2lkIHByb3RvdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN1YiBJQ09OU1QgKCkgeyAkZXhhbXBsZWM6OklDT05TVCB9CgogICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBSaWNoIFdhbGVzLgoKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTmV3ICVleGNlcHRpb24gZGlyZWN0aXZlLiAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSAlZXhjZXB0LgogICAgICAgICAgIEl0IHdvcmtzIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGV4Y2VwdCBpdCBkb2VzIG5vdCBhY2NlcHQgYSAKICAgICAgICAgICBsYW5ndWFnZSBzcGVjaWZpZXIuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIGNhdGNoKFNvbWVFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIGVycm9yCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgJWV4Y2VwdGlvbiBpcyBhbHNvIG5hbWUgYXdhcmUtLS1hbGxvd2luZyBpdCB0byBiZSBhcHBsaWVkIHRvCiAgICAgICAgICAgc3BlY2lmaWMgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIGFueSBmdW5jdGlvbi9tZXRob2QgZm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIoZG91YmxlKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIoZG91YmxlKSBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgc2VtYW50aWNzIG9mIHRoaXMgbmFtZSBtYXRjaGluZyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3Vic3RhbnRpYWwgY2xlYW51cCBvZiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlLiAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICB1c2VkIHRvIGJlIGNyZWF0ZWQgaW4gdGhpcyByYXRoZXIgY29tcGxpY2F0ZWQgbWFubmVyIGludm9sdmluZyBhYm91dAogICAgICAgICAgIGEgaGFsZi1kb3plbiBzdHJpbmdzIGNyZWF0ZWQgaW4gYml0cyBhbmQgcGllY2VzLiAgIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gYSBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXItLWluIHRoZSBzYW1lCiAgICAgICAgICAgb3JkZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhlIG9yZGVyIGluIHdoaWNoIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIHNoYWRvdyBmaWxlIG1heSBkaWZmZXIuCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSAoJXsgLi4uICV9LCAlcnVudGltZSwgJWhlYWRlciwgJXdyYXBwZXIsIGV0Yy4pCiAgICAgICAgICAgY2FuIG5vdyBiZSB1c2VkIGluc2lkZSBvZiBhIGNsYXNzIGRlZmluaXRpb24uICAgVGhpcyBoYXMgcG90ZW50aWFsCiAgICAgICAgICAgdXNlcyB3aGVuIGdlbmVyYXRpbmcgc2hhZG93IGNsYXNzIGNvZGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJWluc2VydCgic2hhZG93IikgJXsKICAgICAgICAgICAgICAgICAjIFNvbWUgcHl0aG9uIGNvZGUKICAgICAgICAgICAgICAgICBkZWYgYmxhaChzZWxmKToKICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJJJ20gYmxhaCEiCiAgICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIHN1cHBvcnQgZm9yIGNsYXNzIGNvZGUgaW5zZXJ0aW9uIGRlcGVuZHMgb24gdGhlIGxhbmd1YWdlIG1vZHVsZS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgaW50ZW50IG9mIHRoaXMgZmVhdHVyZSBpcyB0byBzaW1wbGlmeSB0aGUgdGFzayBvZiBleHRlbmRpbmcKICAgICAgICAgICBzaGFkb3cgY2xhc3MgY29kZS4gICBJbiB0aGUgUHl0aG9uIG1vZHVsZSwgdGhpcyBpbnNlcnRzIGNvZGUgd2l0aCB0aGUKICAgICAgICAgICBwcm9wZXIgbGV2ZWwgb2YgaW5kZW5kYXRpb24gKHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3YXMgdXNlZCBpbiB0aGUgU1dJRwogICAgICAgICAgIGludGVyZmFjZSkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgSmF2YSBhbmQgUHl0aG9uIG1vZHVsZXMgdG8gd29yayBvbiBjeWd3aW4uCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSBhIGxvdCBvZiB0aGUgcHl0aG9uIG1vZHVsZSBoYXMgc3RhcnRlZCB0byBwcm9kdWNlcyBjb2RlIAogICAgICAgICAgIHdoaWNoIGNhbm5vdCBiZSBhdXRvLWltcG9ydGVkIHVzaW5nIGN5Z3dpbiBsaWJ0b29scyBzbyBtb3N0IG9mIGl0IGlzIAogICAgICAgICAgIHN0aWxsIGJyb2tlbi4KCjExLzI4LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlcmVuYW1lIGFuZCAlZmVhdHVyZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIGluc2lkZQogICAgICAgICAgIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBmb28oaW50KTsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBmb28oZG91YmxlKTsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gdGhpcyBtYW5uZXIsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBvbmx5IGFwcGxpZXMKICAgICAgICAgICB0byBtZW1iZXJzIG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBhcHBlYXJzIGFzIHdlbGwgYXMgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzLiAgSW4gZmFjdCwgdGhpcyBpcyByZWFsbHkganVzdCB0aGUgc2FtZQogICAgICAgICAgIGFzIHNheWluZzoKCiAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBGb286OmZvbyhpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgRm9vOjpmb28oZG91YmxlKTsKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHRoZSBleHBlcmltZW50YWwgJWZlYXR1cmUgZGlyZWN0aXZlLiAgJWZlYXR1cmUgY2FuIGJlCiAgICAgICAgICAgdXNlZCB0byBhdHRhY2ggYXJiaXRyYXJ5IHN0cmluZyBhdHRyaWJ1dGVzIHRvIHBhcnNlIHRyZWUgbm9kZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgYmxhaCB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIHdoYXRldmVyOyAgICAgIAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSAqOjp4X3NldCAieCI7CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJibGFoIikgRm9vOjpiYXIoaW50LGRvdWJsZSkgY29uc3QgInNwYW0iOwoKICAgICAgICAgICBUaGUgc3ludGF4IGlzIGJvcnJvd2VkIGZyb20gdGhlICVyZW5hbWUgZGlyZWN0aXZlLiAgSW4gZmFjdCwgdGhlCiAgICAgICAgICAgZXhhY3Qgc2FtZSBzZW1hbnRpY3MgYXBwbHkgKGluaGVyaXRhbmNlLCBtYXRjaGluZywgZXRjLikuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGEgdmVyeSBwb3dlcmZ1bCBsb3ctbGV2ZWwgcHJpbWl0aXZlIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICBjdXN0b21pemUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIGFuZCB0byBwcm92aWRlIGhpbnRzIHRvIAogICAgICAgICAgIGFueSBzdGFnZSBvZiBjb2RlIGdlbmVyYXRpb24uICAgRmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvCiAgICAgICAgICAgcGFyc2UgdHJlZSBub2RlcyBhcyBhdHRyaWJ1dGVzIHdpdGggbmFtZXMgbGlrZSAiZmVhdHVyZToqIiB3aGVyZSAqIAogICAgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBmZWF0dXJlIG5hbWUgKGUuZy4sICJmZWF0dXJlOmV4Y2VwdCIsICJmZWF0dXJlOnNldCIsIAogICAgICAgICAgIGV0Yy4pLiAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIHRoZW4gbG9vayBmb3IgdGhlIGZlYXR1cmVzIHVzaW5nIAogICAgICAgICAgIGEgc2ltcGxlIGF0dHJpYnV0ZSBsb29rdXAuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGludGVuZGVkIHRvIGJlIGEgcmVwbGFjZW1lbnQgZm9yIGEgbnVtYmVyIG9mCiAgICAgICAgICAgb2xkZXIgU1dJRyBkaXJlY3RpdmVzIGluY2x1ZGluZyAlZXhjZXB0IGFuZCBzcGVjaWFsaXplZAogICAgICAgICAgIHByYWdtYXMuIEl0IGlzIG1vcmUgcG93ZXJmdWwgKGR1ZSB0byBpdHMgcGFyYW1ldGVyaXplZAogICAgICAgICAgIG5hbWUgbWF0Y2hpbmcpIGFuZCBpdCBwcm92aWRlcyB2ZXJ5IHByZWNpc2UgY29udHJvbCBvdmVyCiAgICAgICAgICAgaG93IGN1c3RvbWl6YXRpb24gZmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvIGluZGl2aWR1YWwKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgVGhlcmUgYXJlIGZ1dHVyZSBleHBhbnNpb24gcGxhbnMgdGhhdCB3aWxsCiAgICAgICAgICAgYnVpbGQgdXBvbiB0aGlzIGNhcGFiaWxpdHkgYXMgd2VsbC4KCiAgICAgICAgICAgSXQncyBub3QgY2VydGFpbiB0aGF0ICVmZWF0dXJlIHdpbGwgZXZlciBiZSB1c2VkIGRpcmVjdGx5CiAgICAgICAgICAgYnkgU1dJRyB1c2Vycy4gIEluc3RlYWQsIGl0IG1heSBiZSBhIGxvdy1sZXZlbCBwcmltaXRpdmUKICAgICAgICAgICB0aGF0IGlzIHVzZWQgaW4gaGlnaC1sZXZlbCBtYWNybyBkZWZpbml0aW9ucy4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICB0byBzdXBwb3J0IHByb3BlcnRpZXMsIHlvdSBtaWdodCBkZWZpbmUgYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICVkZWZpbmUgJXByb3BlcnR5KG5hbWUsIHNldGYsIGdldGYpCiAgICAgICAgICAgJWZlYXR1cmUoInNldCIpIHNldGYgI25hbWU7CiAgICAgICAgICAgJWZlYXR1cmUoImdldCIpIGdldGYgI25hbWU7CiAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBXaGljaCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgJXByb3BlcnR5KHAsIGdldF9wLCBzZXRfcCk7CgogICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICBpbnQgIGdldF9wKCk7CiAgICAgICAgICAgICAgdm9pZCBzZXRfcChpbnQpOwogICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgCjExLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBUY2wgbW9kdWxlIGhhcyBiZWVuIGV4cGFuZGVkIHdpdGggc29tZSBuZXcgZmVhdHVyZXMgZm9yCiAgICAgICAgICAgbWFuYWdpbmcgb2JqZWN0IG93bmVyc2hpcC4gIEZvciBleGFtcGxlOgogICAgICAgICAKICAgICAgICAgICAgICAgIHNldCBjIFtDaXJjbGUgLWFyZ3MgMjBdCiAgICAgICAgICAgICAgICAkYyBhcmVhICAgICAgICAgICAgICMgSW52b2tlIGEgbWV0aG9kCiAgICAgICAgICAgICAgICAkYyAtZGlzb3duICAgICAgICAgICMgUmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgICRjIC1hY3F1aXJlICAgICAgICAgIyBBY3F1aXJlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAoKICAgICAgICAgICBJZiBUY2wgb3ducyB0aGUgb2JqZWN0LCBpdHMgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIHdoZW4gdGhlIAogICAgICAgICAgIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGNvbW1hbmQgaXMgZGVsZXRlZCBpbiBUY2wuICAKCiAgICAgICAgICAgVG8gc2ltcGxpZnkgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMsIHRoZSBmb2xsb3dpbmcgc3ludGF4CiAgICAgICAgICAgY2FuIGJlIHVzZWQ6CgogICAgICAgICAgICAgICAgJGMgLWRlbGV0ZSAgICAgICAgICMgRGVsZXRlIGFuIG9iamVjdAoKICAgICAgICAgICBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgbW9yZSBvYnNjdXJlIHZhcmlhbnQgb2YgCgogICAgICAgICAgICAgICAgcmVuYW1lICRjIHt9CgogICAgICAgICAgIFRoZXNlIGZlYXR1cmVzIGFsc28gYWRkIGZ1bmN0aW9uYWxpdHkgYXQgdGhlIEMgQVBJIGxldmVsLgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hbmFnZSBvd25lcnNoaXAgZnJvbSBDIGFuZAogICAgICAgICAgIGNhbiBiZSB1c2VkIGluIHR5cGVtYXBzLgoKICAgICAgICAgICAgICAgIFNXSUdfQWNxdWlyZSh2b2lkICpwdHIpOwogICAgICAgICAgICAgICAgU1dJR19EaXNvd24odm9pZCAqcHRyKTsKCiAgICAgICAgICAgQSBuZXcgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBpbnN0YW5jZXMgaXMgYWxzbyBhdmFpbGFibGU6CgogICAgICAgICAgICAgICAgVGNsX09iaiAqCiAgICAgICAgICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqKFRjbF9JbnRlcnAgKmludGVycCwgdm9pZCAqcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHlwZSwgaW50IG93bik7CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiBhIHR5cGVtYXAsIHRoaXMgY3JlYXRlcyBhIHBvaW50ZXIgb2JqZWN0IGFuZAogICAgICAgICAgIGFuIGludGVycHJldGVyIGNvbW1hbmQgdGhhdCBjYW4gYmUgdXNlZCB0byBpc3N1ZSBtZXRob2RzIGFuZAogICAgICAgICAgIGFjY2VzcyBhdHRyaWJ1dGVzIGFzIHNob3duIGFib3ZlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWxsIFB5dGhvbi1yZWxhdGVkICVwcmFnbWEgb3BlcmF0aW9ucyBoYXZlIGJlZW4gZWxpbWluYXRlZC4KICAgICAgICAgICBNb3N0IG9mIHRoZXNlIHdlcmUgd3JpdHRlbiBmb3Igb2xkZXIgU1dJRyB2ZXJzaW9ucyBpbiBvcmRlciB0bwogICAgICAgICAgIGNvbXBlbnNhdGUgZm9yIGxpbWl0YXRpb25zIGluIGVhcmxpZXIgcmVsZWFzZXMuICBJbiBhbiBlZmZvcnQKICAgICAgICAgICB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBjb2RlLWNsdXR0ZXIgYW5kIHBvdGVudGlhbCBmb3IgZXJyb3JzLAogICAgICAgICAgIGl0IGlzIGVhc2llciB0byBzaW1wbHkgZWxpbWluYXRlIHRoZSBwcmFnbWFzIGFuZCB0byBzdGFydCBvdmVyCiAgICAgICAgICAgKGlmIG5lZWRlZCkuICBUbyBiZSBob25lc3QsIEknbSBub3QgZXZlbiBzdXJlIHRoZSBwcmFnbWFzCiAgICAgICAgICAgd29ya2VkIGluIDEuMy45IGFuZCByZWNlbnQgcmVsZWFzZXMuCgogICAgICAgICAgIE5vdGU6IElmIHlvdSBuZWVkIHRvIGluc2VydCBjb2RlIGludG8gdGhlIHNoYWRvdyBjbGFzcyBmaWxlCiAgICAgICAgICAgY3JlYXRlZCBieSBTV0lHLCBzaW1wbHkgdXNlIHRoZSAlc2hhZG93IGRpcmVjdGl2ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVzaGFkb3cgJXsKICAgICAgICAgICAgICBkZWYgc29tZV9weXRob25fY29kZSgpOiAgICAgICAgIAogICAgICAgICAgICAgICAgICBwcmludCAiYmxhaCEiCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTd2VlcGluZyBjaGFuZ2VzIHRvIHRoZSB3YXkgaW4gd2hpY2ggdGhlIFB5dGhvbiBtb2R1bGUgaGFuZGxlcwogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLiAgIEluIGVhcmx5IGltcGxlbWVudGF0aW9ucywgc2hhZG93IGNsYXNzZXMgd2VyZQogICAgICAgICAgIG1lcmVseSBQeXRob24gd3JhcHBlcnMgYXJvdW5kIHR5cGVkIHBvaW50ZXIgb2JqZWN0cy4gSG93ZXZlciwgCiAgICAgICAgICAgc29tZSB1c2VycyBhY3R1YWxseSB3YW50ZWQgdG8gcmVjZWl2ZSB0aGUgc2hhZG93IGNsYXNzIG9iamVjdCBpbiBDLgogICAgICAgICAgIFRvIGFjY29tbW9kYXRlIHRoaXMsIHRoZSBkZXJlZmVyZW5jaW5nIG9mIHRoZSAidGhpcyIgcG9pbnRlciBpbgogICAgICAgICAgIGEgc2hhZG93IGNsYXNzIHdhcyBtb3ZlZCB0byBDIGFzIGRlc2NyaWJlZCBpbiBDSEFOR0VTIFs4LzgvOTldLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwcm9jZXNzIG9mIHJldHVybmluZyBwb2ludGVycyB0byBQeXRob24gd2FzIHN0aWxsCiAgICAgICAgICAgc29tZXdoYXQgcHJvYmxlbWF0aWMuICBTcGVjaWZpY2FsbHksIHNoYWRvdyBjbGFzc2VzIG5ldmVyIHdvcmtlZAogICAgICAgICAgIGluIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGVzZToKCiAgICAgICAgICAgICAtICAgVXNlIG9mIGFueSBraW5kIG9mIG91dHB1dCB0eXBlbWFwICgnb3V0JyBvciAnYXJnb3V0JykKICAgICAgICAgICAgIC0gICBHbG9iYWwgdmFyaWFibGVzIChicm9rZW4gYXMgZmFyIGFzIEkgY2FuIHRlbGwpLgoKICAgICAgICAgICBJbiB0aGUgcGFzdCwgc29tZSB1c2VycyBoYXZlIGRlYWx0IHdpdGggdGhpcyBieSBtYW51YWxseSB0cnlpbmcKICAgICAgICAgICB0byBjcmVhdGUgc2hhZG93IGNsYXNzIG9iamVjdHMgdGhlbXNlbHZlcyBmcm9tIEMvQysrLiAgSG93ZXZlciwKICAgICAgICAgICB0aGlzIHdhcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgQyB3cmFwcGVycyBkb24ndCByZWFsbHkga25vdyBob3cKICAgICAgICAgICB0byBnZXQgYWNjZXNzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBjbGFzcy4KCiAgICAgICAgICAgVGhlIFB5dGhvbiBtb2R1bGUgaGFzIG5vdyBiZWVuIG1vZGlmaWVkIHRvIGF1dG9tYXRpY2FsbHkgYXR0YWNoCiAgICAgICAgICAgc2hhZG93IGNsYXNzIG9iamVjdHMgdG8gcG9pbnRlcnMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCB0byAKICAgICAgICAgICBQeXRob24uICAgVGhpcyBwcm9jZXNzIG9jY3VycyBpbiB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqKCkKICAgICAgICAgICBzbyB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHVzZXJzLiAgICBBcyBhIHJlc3VsdCwKICAgICAgICAgICBzaGFkb3cgY2xhc3NlcyBhcmUgbm93IG1vcmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIHdpdGggdHlwZW1hcHMKICAgICAgICAgICBhbmQgb3RoZXIgZmVhdHVyZXMgb2YgU1dJRy4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGludHJvZHVjZSBhIG51bWJlciBvZiBpbmNvbXBhdGliaWxpdGllcy4gIFRoZQogICAgICAgICAgIFNXSUdfTmV3UG9pbnRlck9iaigpIG5vdyB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgIm93biIgdG8gCiAgICAgICAgICAgaW5kaWNhdGUgb2JqZWN0IG93bmVyc2hpcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHBvaW50ZXIKICAgICAgICAgICB0byBQeXRob24gdGhhdCBQeXRob24gc2hvdWxkIGRlc3Ryb3kuICAgSW4gYWRkaXRpb24sIG9sZGVyIGNvZGUKICAgICAgICAgICB0aGF0IHRyaWVzIHRvIG1hbnVhbGx5IGNvbnN0cnVjdCBzaGFkb3cgY2xhc3Mgb2JqZWN0cyBvciB3aGljaAogICAgICAgICAgIGV4cGVjdHMgYmFyZSBwb2ludGVycyBtYXkgYnJlYWstLS1zdWNoIHBvaW50ZXJzIG1heSBhbHJlYWR5IGJlCiAgICAgICAgICAgZW5jYXBzdWxhdGVkIGJ5IGEgc2hhZG93IGNsYXNzLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVpbnNlcnQgZGlyZWN0aXZlIHRvIGFjY2VwdCBzaW5nbGUgYnJhY2VzIHsgLi4uIH0uCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluc2VydCgiaGVhZGVyIikgewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJXsgLi4uICV9IGV4Y2VwdCB0aGF0IHRoZSBjb2RlIGluIHRoZQogICAgICAgICAgIGJyYWNlcyBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIHByZXByb2Nlc3Nvci4gICBUaGlzIGNhbiBiZSB1c2VmdWwKICAgICAgICAgICBpbiBjZXJ0YWluIGNvbnRleHRzIHN1Y2ggYXMgbG93LWxldmVsIGNvZGUgZ2VuZXJhdGlvbiBpbiAKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIG5vdyB0cmFuc2xhdGVkIGludG8gcHJlcHJvY2Vzc29yCiAgICAgICAgICAgc3ltYm9scy4gIEZvciBleGFtcGxlOgoJCiAgICAgICAgICAgICAgLi9zd2lnIC1weXRob24gLXNoYWRvdyAtbW9kdWxlIGJsYWggaW50ZXJmYWNlLmkKCiAgICAgICAgICAgQ3JlYXRlcyB0aGUgc3ltYm9sczoKCiAgICAgICAgICAgICAgU1dJR09QVF9QWVRIT04gMQogICAgICAgICAgICAgIFNXSUdPUFRfU0hBRE9XIDEKICAgICAgICAgICAgICBTV0lHT1BUX01PRFVMRSBibGFoCiAgICAgICAgICAgICAgCiAgICAgICAgICAgTW9kdWxlcyBjYW4gbG9vayBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbHRlciB0aGVpciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBpZiBuZWVkZWQuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIFBlcmw1IG1vZHVsZS4gIEEgbG90IG9mIGNvZGUgZ2VuZXJhdGlvbiBpcwogICAgICAgICAgIG5vdyBkcml2ZW4gYnkgdGFibGVzIGFuZCB0eXBlbWFwcy4gICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSAKICAgICAgICAgICBhbHNvIG1ha2VzIHVzZSBvZiB0YWJsZXMgdG8gaW5zdGFsbCBjb25zdGFudHMsIHZhcmlhYmxlcywgYW5kCiAgICAgICAgICAgZnVuY3Rpb25zIGluc3RlYWQgb2YgaW5saW5pbmcgYSBidW5jaCBvZiBwcm9jZWR1cmUgY2FsbHMuICBUaGUKICAgICAgICAgICBzZXBhcmF0ZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBnb25lLiAgIE1vc3QKICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24gaXMgY29udHJvbGxlZCB2aWEgdGhlIHBlcmw1LnN3ZyBmaWxlIGluIHRoZQogICAgICAgICAgIGxpYnJhcnkuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgCjExLzEzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlIEMrKyB0eXBlbmFtZSBrZXl3b3JkLiAgUHJpbWFyaWx5IHRoaXMKICAgICAgICAgICBpcyBhZGRlZCB0byBiZXR0ZXIgc3VwcG9ydCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkICBibGFoKEMmIHYpIHsKICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjppdGVyYXRvciBpID0gdi5iZWdpbigpOwogICAgICAgICAgICAgfQoKICAgICAgICAgICBOb3RlOiB0eXBlbmFtZSBpcyBzdXBwb3J0ZWQgaW4gdGhlIHBhcnNlciBpbiB0aGUgc2FtZSB3YXkgYXMgJ3N0cnVjdCcKICAgICAgICAgICBvciAnY2xhc3MnLiAgWW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2UgaXQgYW55d2hlcmUgZXhjZXB0IGluIHRlbXBsYXRlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGUgQVBJLiAgIE1vc3QgZnVuY3Rpb25zIG5vdwogICAgICAgICAgIHVzZSBhIGNvbW1vbiwgdmVyeSBzaW1wbGUsICBBUEkuICAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YKICAgICAgICAgICBpbnRlcmVzdGluZyBzZW1hbnRpYyBzaWRlLWVmZmVjdHMgb2YgaG93IGNvZGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkLgogICAgICAgICAgIERldGFpbHMgd2lsbCBiZSBmb3J0aGNvbWluZyBpbiBEb2MvTWFudWFsL0V4dGVuZGluZy5odG1sLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogTGFuZ3VhZ2UgbW9kdWxlcyB3cml0dGVuIGZvcgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgd2lsbCBubyBsb25nZXIgd29yaywKCjExLzEwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgdmVyeSBzdWJ0bGUgYnVnIGR1ZSB0byB1bm5hbWVkIGNsYXNzIHdyYXBwaW5nLiBGb3IgZXhhbXBsZSwgaWYKICAgICAgICAgICB5b3UgZGlkIHRoaXMKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgeCx5OwogICAgICAgICAgICAgIH0gZ2RQb2ludCwgKmdkUG9pbnRQdHI7CgogICAgICAgICAgICAgIHZvaWQgZm9vKGdkUG9pbnRQdHIgeCk7CgogICAgICAgICAgIFRoZW4gdGhlIGZvbyBmdW5jdGlvbiB3b3VsZCBnZXQgYSB0eXBlLWVycm9yLiAgIFRoZSBwcm9ibGVtIGhhcwogICAgICAgICAgIHRvIGRvIHdpdGggaW50ZXJuYWwgdHlwZWRlZiBoYW5kbGluZyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgdHlwZWRlZgogICAgICAgICAgIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgc3RydWN0IGFwcGVhciBsYXRlciBpbiB0aGUgcGFyc2UgdHJlZS4KICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZpbiBKb3Zhbm92aWMuCgoxMS8wOS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvICJvdXQiIHR5cGVtYXBzIChhbmQgcmVsYXRlZCB2YXJpYXRpb25zKS4gIFRoZSBuYW1lCiAgICAgICAgICAgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcCBpcyBub3cgdGhlIHJhdyBDIGlkZW50aWZpZXIgdGhhdAogICAgICAgICAgIGFwcGVhcnMgb24gYSBkZWNsYXJhdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vKCk7ICAgIC8vIHR5cGVtYXAgZ2V0cyBhcHBsaWVkCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgbmV2ZXIgcmVhbGx5IHNwZWNpZmllZCBob3cgdGhpcyB3YXMgc3VwcG9zZWQgdG8KICAgICAgICAgICB3b3JrLiAgSW4gU1dJRzEuMSwgeW91IGNvdWxkIHByb2JhYmx5IHdyaXRlIGEgdHlwZW1hcCBmb3IgdGhlCiAgICAgICAgICAgd3JhcHBlciBuYW1lIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBCbGFoX2ZvbyB7IC4uLiB9CgogICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgb2xkIGJlaGF2aW9yIGlzIG5vdyB3aXRoZHJhd24gYW5kIG5vdCBzdXBwb3J0ZWQuIAogICAgICAgICAgIEp1c3QgdXNlIHRoZSBtZW1iZXIgbmFtZSB3aXRob3V0IGFueSBzb3J0IG9mIHNwZWNpYWwgcHJlZml4LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBUY2wgbW9kdWxlIGluaXRpYWxpemF0aW9uOgoKICAgICAgICAgICAoMSkgU1dJRyBub3cgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29kZSBuZWVkZWQgdG8gd29yayB3aXRoCiAgICAgICAgICAgICAgICBUY2wgc3R1YnMuICBTaW1wbHkgY29tcGlsZSB3aXRoIC1EVVNFX1RDTF9TVFVCUy4KCiAgICAgICAgICAgKDIpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgY2FsbHMgVGNsX1BrZ1Byb3ZpZGUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgICAgYSBwYWNrYWdlIG5hbWUuICBUaGUgcGFja2FnZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lCiAgICAgICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gIFRoZSB2ZXJzaW9uIG51bWJlciBpcwogICAgICAgICAgICAgICBzZXQgdG8gIjAuMCIgYnkgZGVmYXVsdC4gIFRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIsIHVzZQogICAgICAgICAgICAgICBzd2lnIC1wa2d2ZXJzaW9uIDEuMiBpbnRlcmZhY2UuaS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgTW9kdWxlcyB0aGF0IHByb3ZpZGVkIHN0dWJzIGFuZCBUY2xfUGtnUHJvdmlkZSBvbiB0aGVpciBvd24gbWlnaHQKICAgICAgICAgICBicmVhay4gIFNpbXBseSByZW1vdmUgdGhhdCBjb2RlLgoKMTEvMDUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCBjb2RlIGdlbmVyYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBUY2wgbW9kdWxlLiAgQ29uc3RhbnRzCiAgICAgICAgICAgYXJlIG5vdyBzdG9yZWQgaW4gYSBsYXJnZSB0YWJsZSB0aGF0IGdldCBpbnN0YWxsZWQgYXQgbW9kdWxlIHN0YXJ0dXAuCiAgICAgICAgICAgVGhlcmUgYXJlIGFsc28gbm8gbG9uZ2VyIGFueSBzdGF0aWMgdmFyaWFibGVzIHNvIGl0IHNob3VsZCBnZW5lcmF0ZQogICAgICAgICAgIHNvbWV3aGF0IGxlc3MgY29kZS4KCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAiY29uc3QiIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byAiY29uc3RhbnQiIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzLiAgImNvbnN0IiBpcyBhIEMga2V5d29yZCB3aGljaCBtYWRlIHRoZSBoYW5kbGluZyBvZiB0aGUgdHlwZW1hcAogICAgICAgICAgIGRpcmVjdGl2ZSBzb21ld2hhdCBhd2t3YXJkIGluIHRoZSBwYXJzZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICAldHlwZW1hcCBkaXJlY3RpdmUgY2FuIG5vdyBhY2NlcHQgbmVhcmx5IGFyYml0cmFyeSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLHBhcnNlPSJpIixkb2M9ImludGVnZXIiKSBpbnQgIi4uLiI7CgogICAgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBrZXl3b3JkIHBhcmFtZXRlcnMgaXMgdG8gc3VwcGx5IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGhpbnRzIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbW9kdWxlLiAgIFRoZSBpbnRlcHJldGF0aW9uIG9mIHRoZQogICAgICAgICAgIHBhcmFtZXRlcnMgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IHNlbWFudGljIGNoYW5nZSB0byBpbnRlcm5hbCBjYWxsL3JldHVybiBieSB2YWx1ZSBoYW5kbGluZy4KICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBjYWxsLWJ5LXZhbHVlIHdhcyB0cmFuc2xhdGVkCiAgICAgICAgICAgaW50byBwb2ludGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciBhLCBWZWN0b3IgYik7CgogICAgICAgICAgIHR1cm5lZCBpbnRvIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoKmEsKmIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgdHJhbnNsYXRpb24gd2FzIG5vcm1hbGx5IHBlcmZvcm1lZCBieSB0aGUgU1dJRyBjb3JlLCBvdXRzaWRlCiAgICAgICAgICAgb2YgdGhlIGNvbnRyb2wgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEhvd2V2ZXIsIGEgc2lkZSBlZmZlY3QKICAgICAgICAgICBvZiB0aGlzIHdhcyBhIGxvdCBvZiBiaXphcnJlIHR5cGVtYXAgYmVoYXZpb3IuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgaWYgeW91IGRpZCBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFlvdSB3b3VsZCBmaW5kIHRoYXQgaW50MzIgd2FzIHRyYW5zZm9ybWVkIGludG8gYSBwb2ludGVyIGV2ZXJ5d2hlcmUhCiAgICAgICAgICAgKG5lZWRsZXNzIHRvIHNheSwgc3VjaCBiZWhhdmlvciBpcyB1bmV4cGVjdGVkIGFuZCBxdWl0ZSBhd2t3YXJkIHRvCiAgICAgICAgICAgZGVhbCB3aXRoKS4gIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgaWYgYSB0eXBlZGVmIHdhcyBhbHNvIHVzZWQsCiAgICAgICAgICAgdGhlIHBvaW50ZXIgYmVoYXZpb3Igc3VkZGVubHkgZGlzYXBwZWFyZWQuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgcG9pbnRlciB0cmFuc2Zvcm1hdGlvbiBpcyBub3cgcHVzaGVkIHRvIHRoZQogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuICAgVGhpcyBwcm9kdWNlcyB3cmFwcGVycyB0aGF0IGxvb2sgcm91Z2hseQogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcxID0gKmE7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcyID0gKmI7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUgdHlwZW1hcHMgZm9yCiAgICAgICAgICAgYXJiaXRyYXJ5IHVuZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRvIHRoaXMgKGFuZCBpdAogICAgICAgICAgIHdpbGwgd29yayByZWdhcmRsZXNzIHdoYXQgaW50MzIgaXMpOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgJDEgPSAoaW50MzIpIFB5SW50X0FzTG9uZygkaW5wdXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU1DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjYWxsL3JldHVybiBieSB2YWx1ZSBjb2RlIGdlbmVyYXRpb24gaW4KICAgICAgICAgICBzb21lIGxhbmd1YWdlIG1vZHVsZXMuCgoxMS8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHR5cGVtYXBzIHRvIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICB7IAogICAgICAgICAgICAgICAgICAgLi4uIGFuIG9iamVjdCAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICogewogICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICYgewogICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgZW51bSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgIC4uLiBhbiBlbnVtIHZhbHVlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKENMQVNTOjoqKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gcG9pbnRlciB0byBtZW1iZXIgLi4uCiAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgIFRoZXNlIHR5cGVzIGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgdHlwZXMgdGhhdCBkb24ndCBtYXRjaAogICAgICAgICAgIGFueXRoaW5nIGVsc2UuICBTZWUgQ0hBTkdFUyBsb2cgZW50cnkgZm9yIDgvMjcvMjAwMCBmb3IgdGhlCiAgICAgICAgICAgb2xkIGJlaGF2aW9yLiAgVGhlIHJvbGUgb2YgdGhlc2UgdHlwZXMgaXMgYWxzbyBkZXNjcmliZWQgaW4gCiAgICAgICAgICAgRG9jL01hbnVhbC9UeXBlbWFwcy5odG1sCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgCjEwLzI1LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIEd1aWxlIGFuZCBNenNjaGVtZSBtb2R1bGVzIHRvIHN1cHBvcnQKICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBGaXggdG8gaGFuZGxlIHBvaW50ZXJzIHRvIGFycmF5cy4KCjEwLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIERlZmluaW5nIGEgdHlwZW1hcCBydWxlIGZvciBlbnVtIFNXSUdFTlVNIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgIHRvIGRlZmluZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlbnVtIHZhcmlhYmxlcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJ1YnkgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgUnVieSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZnVuY3Rpb25zIHdpdGggYW4gYXJiaXRyYXJ5CiAgICAgICAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFByZXZpb3VzIHZlcnNpb25zIHdlcmUgbGltaXRlZCB0byAKICAgICAgICAgICB0byBmdW5jdGlvbnMgd2l0aCBvbmx5IDkgb3IgMTYgYXJndW1lbnRzIGRlcGVuZGluZyBvbgogICAgICAgICAgIHRoZSB1c2Ugb2YgZGVmYXVsdCBhcmd1bWVudHMuICAgTm90ZTogZnJvbSBzb21lIGluc3BlY3Rpb24KICAgICAgICAgICBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBzb3VyY2UsIHRoZSBuZXcgYXBwcm9hY2ggbWlnaHQgYmUKICAgICAgICAgICBhIGxpdHRsZSBmYXN0ZXIgYXMgd2VsbC4KCjEwLzE4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgdGVtcGxhdGVzLgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gPFMsVD47CgogICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBJcmluYSBLb3Rsb3ZhLgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMgYWRkZWQuICBUaGUgdHlwZW1hcHMKICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBzeW50YXggYmVsb3cuICAgV2l0aGluIGVhY2gKICAgICAgICAgICB0eXBlbWFwLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgJGFyZzsgIC8vIFRoZSBpbnB1dCBvYmplY3QgaW4gdGhlIHRhcmdldCBsYW5ndWFnZQogICAgICAgICAgICAgICAgICAkMTsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3IgZmlyc3QgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDI7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIHNlY29uZCBhcmd1bWVudAoKICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgdmFyaWFibGVzIHJlZmVyIHRvIGVpdGhlciBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMV90eXBlLCAkMV9sdHlwZSwgJDFfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ2MpCiAgICAgICAgICAgICAgICAgICQyX3R5cGUsICQyX2x0eXBlLCAkMl9iYXNldHlwZSwgZXRjLi4uICAoYXJndltdKQoKICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgZGltZW5zaW9uIG9mIGFyZ3YKICAgICAgICAgICAgICAgICAgJDJfZGltMAogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgQmFzaWNhbGx5IGFueSB2YXJpYWJsZSB0aGF0IHdhcyBhdmFpbGFibGUgaW4gbm9ybWFsIHR5cGVtYXBzCiAgICAgICAgICAgaXMgYXZhaWxhYmxlIGZvciBlaXRoZXIgYXJndW1lbnQgYnkgcHJlZmFjaW5nIHRoZSB2YXJpYWJsZQogICAgICAgICAgIG5hbWUgYnkgJyRuXycgd2hlcmUgbiBpcyB0aGUgYXJndW1lbnQgcG9zaXRpb24uCgogICAgICAgICAgIE5vdGVzOiAgCiAgICAgICAgICAgKDEpIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgc2luZ2xlCiAgICAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgICAgeW91IGNhbiBzcGxpdCBhIHN0cmluZyBpbnRvIGEgKGNoYXIgKiwgaW50KSBwYWlyIG9yCiAgICAgICAgICAgICAgIHNwbGl0IGEgbGlzdCBpbnRvIGEgKGludCwgY2hhciBbXSkgcGFpci4gIEl0IGlzIG5vdAogICAgICAgICAgICAgICBwb3NzaWJsZSB0byBtYXAgbXVsdGlwbGUgb2JqZWN0cyB0byBtdWx0aXBsZSBhcmd1bWVudHMuCgogICAgICAgICAgICgyKSBUbyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgU1dJRyB2ZXJzaW9ucywgdGhlCiAgICAgICAgICAgICAgIHZhcmlhYmxlcyBzdWNoIGFzICR0YXJnZXQgYW5kICR0eXBlIGFyZSBwcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgIGFyZSBtYXBwZWQgb250byB0aGUgZmlyc3QgYXJndW1lbnQgb25seS4KCiAgICAgICAgICAgKDMpIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUuCiAgICAgICAgICAgICAgIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBhcmUgYW4gZXh0ZW5zaW9uIHRvIHR5cGVtYXAgaGFuZGxpbmcuCiAgICAgICAgICAgICAgIFNpbmdsZSB2YWx1ZWQgdHlwZW1hcHMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgdXN1YWwKICAgICAgICAgICAgICAgd2F5LgoKICAgICAgICAgICBUaGUgb2xkICRzb3VyY2UgYW5kICR0YXJnZXQgdmFyaWFibGVzIGFyZSBvZmZpY2lhbGx5CiAgICAgICAgICAgZGVwcmVjYXRlZC4gIElucHV0IHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoCiAgICAgICAgICAgJGFyZyQgYW5kIG91dHB1dCB2YWx1ZXMgYXJlIHJlZmVyZW5jZSB0aHJvdWdoICRyZXN1bHQkLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzLiAgVGhlIHN5bnRheAogICAgICAgICAgIGlzIGEgbGl0dGxlIGZ1bmt5LCBidXQgaGVyZSBnb2VzOgoKICAgICAgICAgICAgICAvLyBEZWZpbmUgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIE11bHRpdmFsdWVkIHR5cGVtYXAgd2l0aCBsb2NhbHMKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgLy8gQ29weSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpID0gKGludCBhcmdjLCBjaGFyICphcmd2W10pOwoKICAgICAgICAgICAgICAvLyBBcHBseSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAlYXBwbHkgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpIH07CgogICAgICAgICAgIE5vdGU6IHRoaXMgZXh0cmEgcGFyc2luZyBzdXBwb3J0IGlzIGFkZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uLgogICAgICAgICAgIE5vIGxhbmd1YWdlIG1vZHVsZXMgY3VycmVudGx5IHN1cHBvcnQgbXVsdGktdmFsdWVkIHR5cGVtYXBzLgoKMTAvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWF0Y2hpbmcgY29kZSB0byBkaXNjYXJkIHF1YWxpZmllcnMgd2hlbgogICAgICAgICAgIGNoZWNraW5nIGZvciBhIG1hdGNoLiAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgY2hhciAqeCk7CgogICAgICAgICAgIFRoZSB0eXBlbWFwIGNoZWNrZXIgY2hlY2tzIGZvciBhIG1hdGNoIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CgogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIElmIHR5cGVkZWYncyBhcmUgaW52b2x2ZWQsIHF1YWxpZmllciBzdHJpcHBpbmcgb2NjdXJzIGJlZm9yZQogICAgICAgICAgIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFNvIGlmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgKnN0cmluZzsKICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBzdHJpbmcgeCk7CgogICAgICAgICAgIHR5cGVtYXAgY2hlY2tpbmcgd291bGQgYmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgeAogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nCiAgICAgICAgICAgICAgICBzdHJpbmcgeAogICAgICAgICAgICAgICAgc3RyaW5nCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXaXRob3V0IHF1YWxpZmllciBzdHJpcHBpbmcsIG9uZSBoYXMgdG8gd3JpdGUKICAgICAgICAgICBzZXBlcmF0ZSB0eXBlbWFwcyBmb3IgYWxsIHZhcmlhdGlvbnMgb2YgY29uc3QgYW5kIHZvbGF0aWxlICh3aGljaAogICAgICAgICAgIGlzIGEgcGFpbikuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVHlwZW1hcHMgbWlnaHQgYmUgYXBwbGllZCBpbgogICAgICAgICAgIHBsYWNlcyB3aGVyZSB0aGV5IHdlcmVuJ3QgYmVmb3JlLgoKCjEwLzkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IGRpc2FtYmlndWF0ZQogICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IG9ubHkgdmFyeSBpbiBjb25zdG5lc3MuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIGhhbmRsZSB0aGlzLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgbm9ybWFsbHkuCiAgICAgICAgICAgCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaF9jb25zdCkgYmxhaCgpIGNvbnN0OwoKICAgICAgICAgICBJbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSwgbWV0aG9kIGNhbGxzIGxpa2UgdGhpcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgKG9iaiktPmJsYWgoKSAgICAgICAgICAgICAgIC8vIE5vbi1jb25zdCB2ZXJzaW9uCiAgICAgICAgICAgICAgICgoRm9vIGNvbnN0ICopb2JqKS0+YmxhaCgpICAvLyBjb25zdCB2ZXJzaW9uCgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZvcmNlIHRoZSByaWdodCBtZXRob2QgdG8gYmUgaW52b2tlZC4KICAgICAgICAgICBBZG1pdHRlZGx5LCB0aGlzIGlzIHByb2JhYmx5IG9ic2N1cmUsIGJ1dCB3ZSBtaWdodAogICAgICAgICAgIGFzIHdlbGwgZ2V0IGl0IHJpZ2h0LgoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciBub3cgaWdub3JlcyAnXHInIGluIHRoZSBpbnB1dC4KICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggdGhlIGZvbGxvd2luZyBidWc6CiAgICAgICAgICAgWyAjNDY4NDE2IF0gU1dJRyB0aGlua3MgbWFjcm8gZGVmcyBhcmUgZGVjbGFyYXRpb25zPwoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgfHwsICYmLCBhbmQgISBpbiBjb25zdGFudHMuICBUaGlzCiAgICAgICAgICAgZml4ZXMgU0YgWyAjNDY4OTg4IF0gTG9naWNhbCBvcHMgYnJlYWsgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIEhvd2V2ZXIsIGF0IHRoaXMgdGltZSwgY29uc3RhbnRzIHVzaW5nIHRoZXNlIG9wZXJhdG9ycwogICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkICh0aGUgcGFyc2VyIHdpbGwgaXNzdWUgYSB3YXJuaW5nKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIC1zaG93X3RlbXBsYXRlcyBjb21tYW5kIGxpbmUgb3B0aW9uLiAgVGhpcyBtYWtlcwogICAgICAgICAgIFNXSUcgZGlzcGxheSB0aGUgY29kZSBpdCBhY3R1YWxseSBwYXJzZXMgdG8gZ2VuZXJhdGUKICAgICAgICAgICB0ZW1wbGF0ZSB3cmFwcGVycy4gIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gc2VtYW50aWNzIG9mICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBXaGVuCiAgICAgICAgICAgdXNpbmcgJXRlbXBsYXRlLCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkCiAgICAgICAgICAgYXMgdHlwZXMgYnkgZGVmYXVsdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgIFRvIHNwZWNpZnkgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzICpub3QqIGEgdHlwZSwgeW91CiAgICAgICAgICAgbmVlZCB0byB1c2UgZGVmYXVsdC12YWx1ZSBzeW50YXguIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQsaW50PTUwPjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3RvcjxpbnQsc2l6ZT0xMDA+OwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0dGVyLS1vbmx5CiAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgKGUuZy4sIDUwLCAxMDApIGlzIHVzZWQgZHVyaW5nCiAgICAgICAgICAgZXhwYW5zaW9uLiAgVGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIEMrKywgYnV0IEkgY291bGRuJ3QKICAgICAgICAgICBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBkbyBpdCBpbiB0aGUgcGFyc2VyLiAgTWlnaHQKICAgICAgICAgICBpbXBsZW1lbnQgYW4gYWx0ZXJuYXRpdmUgbGF0ZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFqb3IgY2hhbmdlcyB0byB0ZW1wbGF0ZSBoYW5kbGluZyBpbiBvcmRlciB0byBwcm92aWRlCiAgICAgICAgICAgYmV0dGVyIGludGVncmF0aW9uIHdpdGggdGhlIEMrKyB0eXBlLXN5c3RlbS4gVGhlIG1haW4KICAgICAgICAgICBwcm9ibGVtIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgIFN1cHBvc2UgeW91IGhhdmUgYSB0ZW1wbGF0ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgYmxhaChjb25zdCBUIHgpIHsgc3R1ZmYgfTsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE5vdyBzdXBwb3NlLCB0aGF0IHlvdSBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb24gYQogICAgICAgICAgIHR5cGUgbGlrZSB0aGlzIGluIFNXSUc6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPGludCAqPjsKCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzICpzdXBwb3NlZCogdG8gZ2VuZXJhdGUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgSG93ZXZlciwgaW4gU1dJRy0xLjMuOSwgdGhlIHRlbXBsYXRlIHN1YnN0aXR1dGlvbiBnZXRzIGl0IHdyb25nCiAgICAgICAgICAgYW5kIHByb2R1Y2VzCgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBpbnQgKngpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgKG5vdGljZSB0aGUgYmFkIHBsYWNlbWVudCBvZiB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIpLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIFNXSUcgcGFyc2VyIG5vdyBnZW5lcmF0ZXMgaW1wbGljaXQgdHlwZWRlZnMKICAgICAgICAgICBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMgdGhhdCBwcm9kdWNlcyBjb2RlIHJvdWdobHkKICAgICAgICAgICBlcXVpdmFsZW50IHRvIGRvaW5nIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpfX3N3aWd0bXBsMTsKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxfX3N3aWd0bXBsMT47CgogICAgICAgICAgIHdoaWNoIGdlbmVyYXRlcyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgU2luY2UgdGhpcyBpcyBjb3JyZWN0IGluIGJvdGggQysrIGFuZCBTV0lHLCBpdCBwcm92aWRlcyB0aGUgcmlnaHQKICAgICAgICAgICBzZW1hbnRpY3MgYW5kIGFsbG93cyBldmVyeXRoaW5nIHRvIGNvbXBpbGUgcHJvcGVybHkuICBIb3dldmVyLAogICAgICAgICAgIHRvIGNsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgY29kZSBhIGxpdHRsZSBiaXQsIHRoZSBwYXJzZXIga2VlcHMKICAgICAgICAgICB0cmFjayBvZiB0aGUgdGVtcGxhdGUgdHlwZXMgYW5kIHBlcmZvcm1zIGJhY2stc3Vic3RpdHV0aW9uIHRvCiAgICAgICAgICAgdGhlIG9yaWdpbmFsIHR5cGUgd2hlbiBidWlsZGluZyB0aGUgcGFyc2UgdHJlZS4gIFRodXMsIGV2ZW4KICAgICAgICAgICB0aG91Z2ggdGhlIGltcGxpY2l0IHR5cGVkZWYgaXMgdXNlZCBpbiB0aGUgaW5wdXQgYW5kIG1heSBhcHBlYXIKICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZSAoZm9yIHByb3BlciBjb21waWxhdGlvbiksIHRoZSBwYXJzZQogICAgICAgICAgIHRyZWUgd2lsbCBoaWRlIGEgbG90IG9mIHRoZXNlIGRldGFpbHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIHdpbGwgbG9vayBsaWtlIGl0IHdhcyBkZWNsYXJlZCBhcyBmb2xsb3dzICh3aGljaCBpcyB3aGF0CiAgICAgICAgICAgeW91IHdhbnQpOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH0KCiAgICAgICAgICAgVGhlIG9ubHkgcGxhY2UgeW91IGFyZSBsaWtlbHkgdG8gbm90aWNlIHRoZSB0eXBlZGVmIGhhY2sKICAgICAgICAgICBpcyBpbiBib2RpZXMgb2YgdGVtcGxhdGUgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIGRpZCB0aGlzLAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBibGFoIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgewogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBUICB0ZW1wdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgeW91IHdpbGwgZmluZCB0aGF0ICdUIHRlbXB2YWx1ZScgZ290IGV4cGFuZGVkIGludG8gc29tZQogICAgICAgICAgIHN0cmFuZ2UgdHlwZWRlZiB0eXBlLiAgVGhpcyAqc3RpbGwqIGNvbXBpbGVzIGNvcnJlY3RseSAKICAgICAgICAgICBzbyBpdCdzIG5vdCBhIGJpZyBkZWFsIChvdGhlciB0aGFuIGxvb2tpbmcga2luZCBvZiB1Z2x5CiAgICAgICAgICAgaW4gdGhlIHdyYXBwZXIgZmlsZSkuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBzb21lIGluaGVyaXRhbmNlIHByb2JsZW1zIGluIFRjbCBPYmplY3QgaW50ZXJmYWNlLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGNsIG1vZHVsZSBoYXMgY2hhbmdlZCB0byB1c2UgYnl0ZS1iYWNrZWQgcG9pbnRlciBzdHJpbmdzLiAgVGhpcwogICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBIb3dldmVyLAogICAgICAgICAgIHRoZSBvcmRlciBpbiB3aGljaCBkaWdpdHMgYXBwZWFyIGluIHBvaW50ZXIgdmFsdWVzIG5vIGxvbmdlcgogICAgICAgICAgIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBhY3R1YWwgbnVtZXJpY2FsIHZhbHVlIG9mIGEKICAgICAgICAgICBwb2ludGVyIChvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCBwYWlycyBvZiBkaWdpdHMgYXBwZWFyCiAgICAgICAgICAgaW4gcmV2ZXJzZSBvcmRlcikuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQZXJsNSBtb2R1bGUgaXMgbm93IGRyaXZlbiBieSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAncGVybDUuc3dnJwogICAgICAgICAgIGluIHRoZSBTV0lHIGxpYnJhcnkuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcGVybDUgbW9kdWxlIG5vIGxvbmdlciB0cmllcyB0byBhcHBseSB0aGUgIm91dCIgdHlwZW1hcAogICAgICAgICAgIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBtYWdpYyB2YXJpYWJsZXMuICBJJ20gc3VycHJpc2VkIHRoYXQKICAgICAgICAgICB0aGlzIGV2ZXIgd29ya2VkIGF0IGFsbCAoc2luY2UgYWxsIG9mIHRoZSBjb2RlIHRoYXQgd2FzIHRoZXJlCiAgICAgICAgICAgd2FzIHdyb25nIGFueXdheXMpLiAgIFVzZSB0aGUgInZhcm91dCIgdHlwZW1hcCB0byBoYW5kbGUKICAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgcmVsYXRlZCB0byBjaGFyYWN0ZXIgYXJyYXkgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgaXMgbm9ybWFsbHkgc3VwcG9zZWQgdG8gcmV0dXJuIGEgc3RyaW5nLCBidXQgdGhpcyB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjkuICAgVGhlIHJlYXNvbiBpdCB3YXMgYnJva2VuIHdhcyBhY3R1YWxseQogICAgICAgICAgIGR1ZSB0byBhIHN1YnRsZSBuZXcgZmVhdHVyZSBvZiB0eXBlbWFwcy4gIFdoZW4gYSBkYXRhIG1lbWJlcgogICAgICAgICAgIGlzIHNldCB0byBhbiBhcnJheSBsaWtlIHRoaXMsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVsYXRlZAogICAgICAgICAgIGFjY2Vzc29yIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IHNldCB0byBhbiBhcnJheS4gIFRoaXMgbWVhbnMKICAgICAgICAgICB0aGF0IHlvdSBjYW4gbm93IHdyaXRlIHR5cGVtYXBzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgJHRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCRzb3VyY2UsJGRpbTApOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZnVuY3QKICAgICAgICAgICBtZW1iZXJvdXQgdHlwZW1hcCBpbiBhIG1vcmUgZWxlZ2FudCBtYW5uZXIuCgo5LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBvZiBxdWFsaWZpZWQgQysrIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIChpKSBUaGUgU1dJRyBwYXJzZXIgd2FzIGV4dGVuZGVkIHNsaWdodGx5IHRvIGFsbG93ICd2b2xhdGlsZScKICAgICAgICAgICBhbmQgY29tYmluYXRpb25zIG9mICdjb25zdCcgYW5kICd2b2xhdGlsZScgdG8gYmUgdXNlZC4gIFRoaXMKICAgICAgICAgICBpcyBwcm9iYWJseSByYXJlLCBidXQgdGVjaG5pY2FsbHkgbGVnYWwuICBPbmx5IGFkZGVkIGZvcgogICAgICAgICAgIGNvbXBsZXRlbmVzcy4KCiAgICAgICAgICAgKGlpKSBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkaW5nLCBxdWFsaWZpZWQgYW5kIG5vbi1xdWFsaWZpZWQKICAgICAgICAgICBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudC4gIFRodXMsIHdoZW4gYSBjbGFzcyBoYXMgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKCiAgICAgICAgICAgVHdvIGRpc3RpbmN0IG1ldGhvZHMgYXJlIGRlY2xhcmVkLiAgVG8gZGVhbCB3aXRoIHRoaXMsICVyZW5hbWUKICAgICAgICAgICBhbmQgc2ltaWxhciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBleHRlbmRlZCB0byByZWNvZ25pemUgY29uc3QuCiAgICAgICAgICAgVGh1cywgb25lIGNhbiBkaXNhbWJpZ3VhdGUgdGhlIHR3byBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vY29uc3QpIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIG9yIHNpbXBseSBpZ25vcmUgdGhlIGNvbnN0IHZhcmlhbnQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgTm90ZTogU1dJRyBjdXJyZW50bHkgaGFzIG5vIHdheSB0byBhY3R1YWxseSBpbnZva2UgdGhlIGNvbnN0CiAgICAgICAgICAgbWVtYmVyIHNpbmNlIHRoZSAnY29uc3QnIGlzIGRpc2NhcmRlZCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlcnMKICAgICAgICAgICBmb3Igb2JqZWN0cy4gIAoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTmV3IGRpcmVjdGl2ZS4gJW5hbWV3YXJuIGNhbiBiZSB1c2VkIHRvIGlzc3VlIHdhcm5pbmcKICAgICAgICAgICBtZXNzYWdlcyBmb3IgY2VydGFpbiBkZWNsYXJhdGlvbiBuYW1lcy4gICBUaGUgbmFtZQogICAgICAgICAgIG1hdGNoaW5nIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuCiAgICAgICAgICAgVGhlIGludGVudCBvZiB0aGlzIGRpcmVjdGl2ZSBpcyB0byBpc3N1ZSB3YXJuaW5ncyBmb3IKICAgICAgICAgICBwb3NzaWJsZSBuYW1lc3BhY2UgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVuYW1ld2FybigicHJpbnQgaXMgYSBweXRob24ga2V5d29yZCIpIHByaW50OwoKICAgICAgICAgICBUaGUgbmFtZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgcGVyZm9ybWVkIGFmdGVyIGEgbmFtZQogICAgICAgICAgIGhhcyBiZWVuIHJlc29sdmVkIHVzaW5nICVyZW5hbWUuICBUaGVyZWZvcmUsIGEKICAgICAgICAgICBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgd2lsbCBub3QgZ2VuZXJhdGUgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCJQcmludCIpIHByaW50OwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsgICAgLyogTm8gd2FybmluZyBnZW5lcmF0ZWQgKi8KCiAgICAgICAgICAgU2luY2UgdGhlIHdhcm5pbmcgbWVjaGFuaXNtIGZvbGxvd3MgJXJlbmFtZSBzZW1hbnRpY3MsIGl0IGlzCiAgICAgICAgICAgYWxzbyB0byBpc3N1ZSB3YXJuaW5ncyBmb3Igc3BlY2lmaWMgY2xhc3NlcyBvciBqdXN0IGZvcgogICAgICAgICAgIGNlcnRhaW4gbWVtYmVyIGZ1bmN0aW9uIG5hbWVzLgoKICAgICAgICAgICAoRGF2ZSAtIEkndmUgYmVlbiB0aGlua2luZyBhYm91dCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgdGhpcwogICAgICAgICAgIGZvciBxdWl0ZSBzb21lIHRpbWUuICBKdXN0IG5ldmVyIGdvdCBhcm91bmQgdG8gaXQpCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIEVuaGFuY2VkIHRoZSAlaWdub3JlIGRpcmVjdGl2ZSBzbyB0aGF0IHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICBjYW4gYmUgaXNzdWVkIHRvIHVzZXJzLiAgIFRoaXMgaXMgZG9uZSB1c2luZyAlaWdub3Jld2FybgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlaWdub3Jld2Fybigib3BlcmF0b3IgbmV3IGlnbm9yZWQiKSBvcGVyYXRvciBuZXc7CgogICAgICAgICAgIFRoZSBuYW1lcyBhbmQgc2VtYW50aWNzIG9mICVpZ25vcmV3YXJuIGlzIGV4YWN0bHkgdGhlIAogICAgICAgICAgIHNhbWUgYXMgJWlnbm9yZS4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgIGlzIGZvciBtb2R1bGUgd3JpdGVycyB3aG8gd2FudCB0byBpZ25vcmUgY2VydGFpbiB0eXBlcwogICAgICAgICAgIG9mIGRlY2xhcmF0aW9ucywgYnV0IHdobyBhbHNvIHdhbnQgdG8gYWxlcnQgdXNlcnMgYWJvdXQgaXQuCiAgICAgICAgICAgQSB1c2VyIG1pZ2h0IGFsc28gdXNlIHRoaXMgZm9yIGRlYnVnZ2luZyAoc2luY2UgbWVzc2FnZXMKICAgICAgICAgICB3aWxsIGFwcGVhciB3aGVuZXZlciBhbiBpZ25vcmVkIGRlY2xhcmF0aW9uIGFwcGVhcnMpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMjYvMjAwMTogYmVhemxleQogICAgICAgICAgIFN1cGVyLWV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycy4gCiAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBhIGZldyBkaWZmZXJlbnQgcGFydHMuCgogICAgICAgICAgIChpKSBPcGVyYXRvciBuYW1lcyBzdWNoIGFzICdvcGVyYXRvcisnIGFyZSBub3cgYWxsb3dlZAogICAgICAgICAgIGFzIHZhbGlkIGRlY2xhcmF0b3IgbmFtZXMuICBUaHVzIHRoZSAnb3BlcmF0b3InIHN5bnRheAogICAgICAgICAgIGNhbiBhcHBlYXIgKmFueXBsYWNlKiBhIG5vcm1hbCBkZWNsYXJhdG9yIG5hbWUgd2FzIHVzZWQKICAgICAgICAgICBiZWZvcmUuICBPbiB0aGUgc3VyZmFjZSwgdGhpcyBtZWFucyB0aGF0IG9wZXJhdG9ycyBjYW4KICAgICAgICAgICBiZSBwYXJzZWQganVzdCBsaWtlIG5vcm1hbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuIAogICAgICAgICAgIEhvd2V2ZXIsIGl0IGFsc28gbWVhbnMgdGhhdCBvcGVyYXRvciBuYW1lcyBjYW4gYmUgdXNlZAogICAgICAgICAgIGluIG1hbnkgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXJlbmFtZShfX2FkZF9fKSBDb21wbGV4OjpvcGVyYXRvcisoY29uc3QgQ29tcGxleCAmKTsKCiAgICAgICAgICAgKGlpKSBPcGVyYXRvcnMgYXJlIHdyYXBwZWQgKmV4YWN0bHkqIGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBtZXRob2RzLiAgSW50ZXJuYWxseSwgdGhlIG9wZXJhdG9yIG5hbWUgaXMgdXNlZCAKICAgICAgICAgICBkaXJlY3RseSBtZWFuaW5nIHRoYXQgdGhlIHdyYXBwZXIgY29kZSBtaWdodCBjb250YWluCiAgICAgICAgICAgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYXJnMC0+b3BlcmF0b3IqKChDb21wbGV4IGNvbnN0ICYpKmFyZzEpOwoKICAgICAgICAgICBUaGlzIGFsbCBzZWVtcyB0byBwYXJzZSBhbmQgY29tcGlsZSBjb3JyZWN0bHkgKGF0IGxlYXN0CiAgICAgICAgICAgb24gbXkgbWFjaGluZSkuCgogICAgICAgICAgIChpaWkpIFNXSUcgd2lsbCBubyBsb25nZXIgd3JhcCBhIGRlY2xhcmF0aW9uIGlmIGl0cyBzeW1ib2wKICAgICAgICAgICB0YWJsZSBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzLiAgSWYKICAgICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlcnMgYXJlIGRldGVjdGVkLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3IKICAgICAgICAgICBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgIFdhcm5pbmcuIENhbid0IHdyYXAgb3BlcmF0b3IqIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4KCiAgICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSAlcmVuYW1lIG9yICVuYW1lIHRvIGJpbmQKICAgICAgICAgICB0aGUgb3BlcmF0b3IgdG8gYSBuaWNlIG5hbWUgbGlrZSAiYWRkIiBvciBzb21ldGhpbmcuIE5vdGU6CiAgICAgICAgICAgdGhlIGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0CiAgICAgICAgICAgbGFuZ3VhZ2UuCgogICAgICAgICAgIFRoZXJlIGFyZSBjZXJ0YWluIGlzc3VlcyB3aXRoIGZyaWVuZCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycy4KICAgICAgICAgICBTb21ldGltZXMsIGZyaWVuZHMgYXJlIHVzZWQgdG8gZGVmaW5lIG1peGVkIG9wZXJhdG9ycyBzdWNoCiAgICAgICAgICAgYXMgYWRkaW5nIGEgQ29tcGxleCBhbmQgYSBkb3VibGUgdG9nZXRoZXIuICBDdXJyZW50bHksIFNXSUcKICAgICAgICAgICBpZ25vcmVzIGFsbCBmcmllbmQgZGVjbGFyYXRpb25zIGluIGEgY2xhc3MuICBBIGdsb2JhbCBvcGVyYXRvcgogICAgICAgICAgIGRlY2xhcmF0aW9uIGNhbiBwcm9iYWJseSBiZSBtYWRlIHRvIHdvcmssIGJ1dCB5b3UnbGwgaGF2ZSB0bwogICAgICAgICAgIHJlbmFtZSBpdCBhbmQgaXQgcHJvYmFibHkgd29uJ3Qgd29yayB2ZXJ5IGNsZWFubHkgaW4gdGhlCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHNpbmNlIGl0J3Mgbm90IGEgY2xhc3MgbWVtYmVyLgoKICAgICAgICAgICBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gaGFuZGxlIG9wZXJhdG9yIHNwZWNpZmljYXRpb25zIAogICAgICAgICAgIHNvbWV0aW1lcyB1c2VkIGZvciBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgU3RyaW5nIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyKigpOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH07CgogICAgICAgICAgICh0aGlzIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5IGFuZCBnZW5lcmF0ZXMgYSBzeW50YXggZXJyb3IpLgoKICAgICAgICAgICBBbHNvOiBvcGVyYXRvcnMgbm8gbG9uZ2VyIHNob3cgdXAgYXMgc2VwYXJhdGUgcGFyc2UtdHJlZQogICAgICAgICAgIG5vZGVzIChpbnN0ZWFkIHRoZXkgYXJlIG5vcm1hbCAnY2RlY2wnIG5vZGVzKS4gIEkgbWF5CiAgICAgICAgICAgc2VwYXJhdGUgdGhlbSBhcyBhIHNwZWNpYWwgY2FzZSBsYXRlci4KCiAgICAgICAgICAgU2VlIEV4YW1wbGVzL3B5dGhvbi9vcGVyYXRvciBmb3IgYW4gZXhhbXBsZS4KCiAgICAgICAgICAgKioqIFNVUEVSLUVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKClZlcnNpb24gMS4zLjkgKFNlcHRlbWJlciAyNSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZSBkZWNsYXJhdGlvbnMgbGlrZSAKICAgICAgICAgICAnY2hhciAqKiBjb25zdCcuICBTV0lHIHBhcnNlZCB0aGlzIGNvcnJlY3RseSwgYnV0IHRoZQogICAgICAgICAgIGludGVybmFsIHR5cGUgd2FzIHJlcHJlc2VudGVkIGluY29ycmVjdGx5ICh0aGUgcG9pbnRlcnMKICAgICAgICAgICBhbmQgcXVhbGlmaWVycyB3ZXJlIGluIHRoZSB3cm9uZyBvcmRlcikuCgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBXaXRoZHJldyBleHBlcmltZW50YWwgZmVhdHVyZSAobm90ZWQgYmVsb3cpIHRoYXQgd2FzCiAgICAgICAgICAgY2F1c2luZyBzZXJpb3VzIHBhcnNpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDEuMy44IChTZXB0ZW1iZXIgMjMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIGltcHJvdmVkIGRpc3R1dGlscyBzZXR1cC5weSBmaWxlIGluIHRoZSBUb29scyAKICAgICAgICAgICBkaXJlY3RvcnkgKGxvb2sgZm9yIHRoZSBzZXR1cC5weS50bXBsIGZpbGUpLiAgQ29udHJpYnV0ZWQgYnkKICAgICAgICAgICBUb255IFNld2FyZC4KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIHR3byBuZXcgUlBNIHNwZWMgZmlsZXMgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4gQ29udHJpYnV0ZWQKICAgICAgICAgICBieSBUb255IFNld2FyZCBhbmQgVXdlIFN0ZWlubWFubi4KICAKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MzYzNSBdIFBlcmw1LnN3ZyBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBDKysKCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIFR3byBuZXcgZGlyZWN0aXZlcyBjb250cm9sIHRoZSBjcmVhdGlvbiBvZiBkZWZhdWx0CiAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yczoKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0CiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQKCiAgICAgICAgICAgVGhlc2UgcmVwbGFjZSAlcHJhZ21hIG5vZGVmYXVsdCBhbmQgJXByYWdtYSBtYWtlZGVmYXVsdC4KICAgICAgICAgICAob2xkIGNvZGUgd2lsbCBzdGlsbCB3b3JrLCBidXQgZG9jdW1lbnRhdGlvbiB3aWxsIG9ubHkKICAgICAgICAgICBkZXNjcmliZSB0aGUgbmV3IGRpcmVjdGl2ZXMpLgoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MjM1NCBdICVpbXBvcnQgYnJva2VuIGluIDEuMy43LgoKOS8yMC8yMDAxOiBiZWF6bGV5CgogICAgICAgICAgIFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgb3V0LW9mLWNsYXNzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3IgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjpGb28oKSA6CiAgICAgICAgICAgICAgICAgICAgQmFyKCJmb28iKQogICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICB9IAoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6fkZvbygpIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgSmFzb24gU3Rld2FydC4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIGlnbm9yZSBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBWLCBsb25nIFM+IGNsYXNzIE1hcEl0ZXI7CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBhbiBlbWFpbCBleGFtcGxlIGZyb20gSXJpbmEgS290bG92YS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB1bmRlY2xhcmVkIHRjbF9yZXN1bHQgdmFyaWFibGUgaW4gCiAgICAgICAgICAgdGhlICJvdXQiIHR5cGVtYXAgZm9yIFRjbC4gIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBBY3RpdmVQZXJsLiAgCiAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2luZyBvZiBDKysgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIEZvbygpIDogQmFyKC4uLikgey4uLn0KICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIG5vdyBkaXNjYXJkcyB0aGUgY29udGVudHMgb2YgdGhlICguLi4pIHJlZ2FyZGxlc3Mgb2YgCiAgICAgICAgICAgd2hhdCBtaWdodCBlbmNsb3NlZCAoZXZlbiBpZiBzeW50YWN0aWNhbGx5IHdyb25nKS4gIFNXSUcKICAgICAgICAgICBkb2Vzbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlcmUgaXMgbm8gcmVhc29uIHRvCiAgICAgICAgICAgbmVlZGxlc3MgYWRkIHN5bnRheCBydWxlcyB0byBoYW5kbGUgYWxsIG9mIHRoZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgaGVyZS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0eXBlbWFwcyBmb3Igc3RydWN0dXJlIG1lbWJlcnMuICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICBpbnQgKmJhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgbWVtYmVyIG5hbWUgJ2JhcicgaXMgbm93IHVzZWQgaW4gYW55IGFjY2Vzc29yIGZ1bmN0aW9ucy4KICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgImluIiB0eXBlbWFwIHRvIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyB0eXBlbWFwCgogICAgICAgICAgICAgICAldHlwZW1hcChweXRob24saW4pIGludCAqYmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG5vdyBtYXRjaGVzIFZlY3Rvcjo6YmFyLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyB3aWxsIGFsc28KICAgICAgICAgICBtYXRjaCBhbnkgZnVuY3Rpb24gd2l0aCBhbiBhcmd1bWVudCBvZiAiaW50ICpiYXIiIChzbyB5b3Ugc2hvdWxkCiAgICAgICAgICAgYmUgY2FyZWZ1bCkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFLiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI2NDIgc2V0dGluZyBzdHJpbmcgdmFsdWVzIGluIHN0cnVjdHVyZXMKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyMzk4IHByb2JsZW0gd2l0aCBuZXN0ZWQgdGVtcGxhdGVzLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjE2MjYgcHJvYmxlbSB3aXRoIGZvcm1hdHRpbmcgYW5kIEMrKyBjb21tZW50cy4KICAgICAgICAgICAgCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyODQ1IFdyb25nIG93bmVyc2hpcCBvZiByZXR1cm5lZCBvYmplY3RzLgogICAgICAgICAgIAo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ1OTM2Ny4gIERlZmF1bHQgY29uc3RydWN0b3JzIGZvciBjbGFzc2VzCiAgICAgICAgICAgd2l0aCBwdXJlIHZpcnR1YWwgbWV0aG9kcy4KCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgY2xhc3Mgc2NvcGUuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBlbnVtIGJhciB7IEZPTywgQkFSIH07CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXIgYiA9IEZPTyk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFNXSUcgbm93IGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBkZWZhdWx0IHZhbHVlIG9mICJGb286OkZPTyIgZm9yCiAgICAgICAgICAgdGhlIGJsYWgoKSBtZXRob2QgYWJvdmUuICBUaGlzIHVzZWQgdG8gd29yayBpbiAxLjEsIGJ1dCB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjcuICAgQnVnIHJlcG9ydGVkIGJ5IE1pa2UgUm9tYmVyZy4KClZlcnNpb24gMS4zLjcgIChTZXB0ZW1iZXIgMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3BlY2lhbCAlaWdub3JlIGRpcmVjdGl2ZSB0byBpZ25vcmUgZGVjbGFyYXRpb25zLiAgVGhpcwogICAgICAgICAgIGZlYXR1cmUgd29ya3MgZXhhY3RseSBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlICBmb287ICAgICAgICAvLyBJZ25vcmUgYWxsIGRlY2xhcmF0aW9ucyBmb28KICAgICAgICAgICAgICVpZ25vcmUgIDo6Zm9vOyAgICAgIC8vIE9ubHkgaWdub3JlIGZvbyBpbiBnbG9iYWwgc2NvcGUKICAgICAgICAgICAgICVpZ25vcmUgIFNwYW06OmZvbzsgIC8vIE9ubHkgaWdub3JlIGluIGNsYXNzIFNwYW0KICAgICAgICAgICAgICVpZ25vcmUgICo6OmZvbzsgICAgIC8vIElnbm9yZSBpbiBhbGwgY2xhc3NlcwoKICAgICAgICAgICAlaWdub3JlIGNhbiBhbHNvIGJlIHBhcmFtZXRlcml6ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSA6OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSBTcGFtOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgKjo6Zm9vKGludCk7CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCgo5LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBzaGFkb3djb2RlIHByYWdtYSBtb2RpZmllZCBzbyB0aGF0IHRoZSBjb2RlIHRoYXQgaXMgb3V0cHV0IAogICAgICAgICAgIGluIHRoZSBzaGFkb3cgZmlsZSBpcyBwbGFjZWQgcmVsYXRpdmUgdG8gd2hlcmUgaXQgaXMgcGxhY2VkIGluIHRoZSAKICAgICAgICAgICBjL2MrKyBjb2RlLiBUaGlzIGFsbG93cyBzdXBwb3J0IGZvciBKYXZhRG9jIGZ1bmN0aW9uIGNvbW1lbnRzLiAKCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFBhdGNoIFsgIzQ0Nzc5MSBdIEZpeCBmb3IgcHl0aG9uIC1pbnRlcmZhY2Ugb3B0aW9uLgogICAgICAgICAgIFN1Ym1pdHRlZCBieSBUYXJuIFdlaXNuZXIgQnVydG9uLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzCiAgICAgICAgICAgZm9yIGEgY2xhc3MgaWYgaXQgb25seSBkZWZpbmVzIGEgcHJpdmF0ZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICAgICAgICBvciBkZXN0cnVjdG9yIG9yIGlmIGFueSBvbmUgb2YgaXRzIGJhc2UgY2xhc3NlcyBvbmx5IGhhcwogICAgICAgICAgIHByaXZhdGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLiAgVGhpcyB3YXMgcmVwb3J0ZWQgaW4KICAgICAgICAgICBTRiBQYXRjaCBbICM0NDQyODEgXSBub25wdWJsaWMvZGVmYXVsdC9pbmhlcmV0ZWQgY3Rvci9kdG9yCiAgICAgICAgICAgYnkgTWFyY2VsbyBNYXR1cy4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIFBlcmw1IG1vZHVsZSB0aGF0IGFsbG93cyBjb25zdGFudHMgdG8gYmUKICAgICAgICAgICB3cmFwcGVkIGFzIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGxlYWRpbmcgJC4KICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCB1c2luZyB0aGUgLWNvbnN0IG9wdGlvbi4KICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBSaWNoIFdhbGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlICd2b2xhdGlsZScgdHlwZSBxdWFsaWZpZXIuCiAgICAgICAgICAgdm9sYXRpbGUgZG9lc24ndCBtZWFuIGFueXRoaW5nIHRvIFNXSUcsIGJ1dCBpdCBpcwogICAgICAgICAgIG5lZWRlZCB0byBwcm9wZXJseSBnZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBkZWNsYXJhdGlvbnMKICAgICAgICAgICB0aGF0IHVzZSBpdC4gIEl0J3MgYWxzbyBiZWVuIGFkZGVkIHRvIG1ha2UgdGhlIFNXSUcgdHlwZQogICAgICAgICAgIHN5c3RlbSBtb3JlIGNvbXBsZXRlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgJXJlbmFtZSBkaXJlY3RpdmUuICAqKiogVGhpcwogICAgICAgICAgIG5ldyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIGdyZWF0bHkgc2ltcGxpZnkgdGhlIHRhc2sgb2YKICAgICAgICAgICByZXNvbHZpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICoqKgogICAgICAgICAgIAogICAgICAgICAgIEluIHByaW9yIHZlcnNpb25zIG9mIFNXSUcsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSB3YXMKICAgICAgICAgICB1c2VkIHRvIGNvbnNpc3RlbnRseSBhcHBseSBhbiBpZGVudGlmaWVyIHJlbmFtaW5nLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgaWYgeW91IHNhaWQgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lIGZvbyBiYXI7CgogICAgICAgICAgIEV2ZXJ5IG9jY3VycmVuY2Ugb2YgJ2Zvbycgd291bGQgYmUgcmVuYW1lZCB0byAnYmFyJy4gCiAgICAgICAgICAgQWx0aG91Z2ggdGhpcyB3b3JrcyBmaW5lIGZvciByZXNvbHZpbmcgYSBjb25mbGljdCB3aXRoIGEKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZCwgaXQgaXMgdXNlbGVzcyBmb3IKICAgICAgICAgICBmb3IgZGVhbGluZyB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcy4gICAgVGhpcyBpcyBiZWNhdXNlCiAgICAgICAgICAgYWxsIG1ldGhvZHMgYXJlIHNpbXBseSByZW5hbWVkIHRvIHRoZSBzYW1lIHRoaW5nIAogICAgICAgICAgIChnZW5lcmF0aW5nIHRoZSBzYW1lIGNvbmZsaWN0IGFzIGJlZm9yZSkuCgogICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIG9ubHkgd2F5IHRvIGRlYWwgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMKICAgICAgICAgICB3YXMgdG8gZ28gdGhyb3VnaCBhbmQgaW5kaXZpZHVhbGx5IHJlbmFtZSB0aGVtIGFsbCB1c2luZwogICAgICAgICAgICVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHlvdSBoYWQgdG8gZG8gdGhpcyBmb3IgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzIHRvby4KCiAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5LCB0aGlzIG1ha2VzIGl0IGV4dHJlbWVseSBoYXJkIHRvIHJlc29sdmUKICAgICAgICAgICBvdmVybG9hZGluZyB3aXRob3V0IGEgbG90IG9mIHdvcmsgYW5kIG1ha2VzIGl0IGFsbW9zdAogICAgICAgICAgIGltcG9zc2libGUgdG8gdXNlIFNXSUcgb24gcmF3IEMrKyAuaCBmaWxlcy4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsICVyZW5hbWUgbm93IGFjY2VwdHMgcGFyYW1ldGVyIGRlY2xhcmF0b3JzLgogICAgICAgICAgIFRoZSBzeW50YXggaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiByZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyKGludCknCiAgICAgICAgICAgdG8gJ2Jhcl9pJywgbGVhdmluZyBhbnkgb3RoZXIgb2NjdXJyZW5jZSBvZiAnYmFyJyBhbG9uZS4KCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKCiAgICAgICAgICAgVXNpbmcgdGhpcyBmZWF0dXJlLCB5b3UgY2FuIG5vdyBzZWxlY3RpdmVseSByZW5hbWUgCiAgICAgICAgICAgY2VydGFpbiBkZWNsYXJhdGlvbnMgaW4gYWR2YW5jZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShiYXJfZCkgYmFyKGRvdWJsZSk7CgogICAgICAgICAgICAgLy8gSW5jbHVkZSByYXcgQysrIGhlYWRlciAgICAKICAgICAgICAgICAgICVpbmNsdWRlICJoZWFkZXIuaCIKCiAgICAgICAgICAgV2hlbiAlcmVuYW1lIGlzIHVzZWQgaW4gdGhpcyBtYW5uZXIsIGFsbCBvY2N1cnJlbmNlIG9mIGJhcihpbnQpCiAgICAgICAgICAgYXJlIHJlbmFtZWQgd2hlcmV2ZXIgdGhleSBtaWdodCBvY2N1ci4gIE1vcmUgY29udHJvbCBpcyBvYnRhaW5lZAogICAgICAgICAgIHRocm91Z2ggZXhwbGljaXQgcXVhbGlmaWNhdGlvbi4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIDo6YmFyKGludCk7CgogICAgICAgICAgIG9ubHkgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAgICAgIFRoZSBkZWNsYXJhdGlvbiwKICAgICAKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBGb286OmJhcihpbnQpOwoKICAgICAgICAgICBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIGEgY2xhc3MgRm9vLgogICAgICAgICAgIFRoaXMgbGF0dGVyIGZvcm0gYWxzbyBzdXBwb3J0cyBpbmhlcml0YW5jZS4gIFRoZXJlZm9yZSwgaWYgeW91CiAgICAgICAgICAgaGFkIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBTcGFtOjpiYXIoaW50KSBtZXRob2Qgd291bGQgYWxzbyBiZSByZW5hbWVkIChzaW5jZSBTcGFtIAogICAgICAgICAgIGlzIGEgc3ViY2xhc3Mgb2YgRm9vKS4gICBUaGlzIGxhdHRlciBmZWF0dXJlIG1ha2VzIGl0IGVhc3kKICAgICAgICAgICBmb3IgU1dJRyB0byBhcHBseSBhIGNvbnNpc3RlbnQgcmVuYW1pbmcgYWNyb3NzIGFuIGVudGlyZQogICAgICAgICAgIGNsYXNzIGhpZXJhcmNoeSBzaW1wbHkgYnkgc3BlY2lmeWluZyByZW5hbWluZyBydWxlcyBmb3IKICAgICAgICAgICB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgQSBjbGFzcyB3aWxkY2FyZCBvZiAqIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHJlbmFtaW5nCiAgICAgICAgICAgYWxsIG1hdGNoaW5nIG1lbWJlcnMgb2YgYWxsIGNsYXNzZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgKjo6YmFyKGludCk7CgogICAgICAgICAgIHdpbGwgcmVuYW1lIGFsbCBtZW1iZXJzIGJhcihpbnQpIHRoYXQgYXJlIGRlZmluZWQgaW4gY2xhc3Nlcy4KICAgICAgICAgICBJdCB3aWxsIG5vdCByZW5hbWVkIGRlZmluaXRpb25zIG9mIGJhcihpbnQpIGluIHRoZSBnbG9iYWwKICAgICAgICAgICBzY29wZS4KCiAgICAgICAgICAgVGhlIG9sZCB1c2Ugb2YgJXJlbmFtZSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBpcyBzb21ld2hhdAogICAgICAgICAgIGVuaGFuY2VkLiAgCgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBiYXI7ICAgICAgLy8gUmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcicuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIDo6YmFyOyAgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGdsb2JhbCBzY29wZSBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSAqOjpiYXI7ICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBjbGFzc2VzIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIEZvbzo6YmFyOyAvLyBSZW5hbWUgYWxsICdiYXInIGRlZmluZWQgaW4gY2xhc3MgRm9vLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkYXRhLW1lbWJlciB0byBtZW1iZXItZnVuY3Rpb24gCiAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOb3cgc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYWNjZXNzIHggYW5kIHkgCiAgICAgICAgICAgdGhyb3VnaCBhIG1lbWJlciBmdW5jdGlvbiBpbnRlcmZhY2UgaW5zdGVhZCAKICAgICAgICAgICBvZiB0aGUgdXN1YWwgU1dJRyBiZWhhdmlvci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGYuc2V0X3goMy40KSAgICAgICMgaW5zdGVhZCBvZiBmLnggPSAzLjQKICAgICAgICAgICAgICB4ID0gZi5nZXRfeCgpICAgICAjIGluc3RlYWQgb2YgeCA9IGYueAoKICAgICAgICAgICBUbyBkbyB0aGlzLCBzaW1wbHkgdXNlIHRoZSBuZXcgJWF0dHJpYnV0ZWZ1bmMKICAgICAgICAgICBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0XyVzLHNldF8lcykKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJW5vYXR0cmlidXRlZnVuYwoKICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvICVhdHRyaWJ1dGVmdW5jIGFyZSBDLXN0eWxlIHByaW50ZgogICAgICAgICAgIGZvcm1hdCBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHRoZSBuYW1pbmcgY29udmVudGlvbgogICAgICAgICAgIHRvIHVzZS4gICVzIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBuYW1lIG9mIHRoZQogICAgICAgICAgIGRhdGEgbWVtYmVyLiBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHByaW50ZgogICAgICAgICAgIGV4dGVuc2lvbnMgdGhhdCBtaWdodCBoZWxwLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIHdhbnRlZCB0byB0aXRsZSBjYXNlIGFsbCBvZiB0aGUgYXR0cmlidXRlcywgeW91CiAgICAgICAgICAgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0JSh0aXRsZSlzLHNldCUodGl0bGUpcyk7CgogICAgICAgICAgIFRoaXMgd2lsbCB0dXJuIGFuIGF0dHJpYnV0ZSAnYmFyJyB0byAnZ2V0QmFyKCknIGFuZCAnc2V0QmFyKCknLgoKICAgICAgICAgICAoc29tZW9uZSByZXF1ZXN0ZWQgdGhpcyBsb25nIGFnbywgYnV0IEkgZmluYWxseSBmaWd1cmVkCiAgICAgICAgICAgaG93IHRvIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXIpLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGlmIG5vbmUgYXJlIGRlZmluZWQuICBUaGlzIHVzZWQgdG8gYmUKICAgICAgICAgICBlbmFibGVkIHdpdGggYSBjb21tYW5kIGxpbmUgc3dpdGNoIC1tYWtlX2RlZmF1bHQsIGJ1dAogICAgICAgICAgIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UgZnVuY3Rpb25zIGFueXdheXMuICBUbyB0dXJuCiAgICAgICAgICAgb2ZmIHRoaXMgYmVoYXZpb3IgdXNlIHRoZSAtbm9fZGVmYXVsdCBvcHRpb24gb3IgaW5jbHVkZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKIAogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdDsKICAKICAgICAgICAgICBUaGlzIG1heSBicmVhayBjZXJ0YWluIGludGVyZmFjZXMgdGhhdCBkZWZpbmVkIHRoZWlyCiAgICAgICAgICAgb3duIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyB1c2luZyB0aGUgc2FtZSBuYW1pbmcKICAgICAgICAgICBjb252ZW50aW9uIGFzIFNXSUcuICBJZiBzbywgeW91IHdpbGwgZ2V0IGR1cGxpY2F0ZQogICAgICAgICAgIHN5bWJvbHMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlciBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgSXRlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKEZJUlNUS0VZLCBORVhUS0VZKS4gIEFsc28sIGF0dHJpYnV0ZQogICAgICAgICAgIGFjY2VzcyBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJlbHkgb24gaW5oZXJpdGFuY2UgaW4gb3JkZXIKICAgICAgICAgICB0byBwcm92aWRlIGJldHRlciBiZWhhdmlvciBhY3Jvc3MgbW9kdWxlcy4gIAoKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVmFyaW91cyBvYnNjdXJlIGltcHJvdmVtZW50cyB0byB0aGUgdHlwZSBzeXN0ZW0gYW5kIGNsYXNzZXMuCiAgICAgICAgICAgU3RyYW5nZSBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzIGFyZSBub3cgd3JhcHBlZCBjb3JyZWN0bHkKICAgICAgICAgICAoaS5lLiwgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgZG9lc24ndCBjYXVzZSB0aGUgQysrCiAgICAgICAgICAgIGNvbXBpbGVyIHRvIGRpZSB3aXRoIGEgdHlwZSBlcnJvcikuCgogICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgUmVhbDsKICAgICAgICAgICAgICAgICBSZWFsIGZvbyhSZWFsICgqb3ApKFJlYWwsUmVhbCksIFJlYWwgeCwgUmVhbCB5KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgSW5oZXJpdGFuY2Ugb2YgdHlwZXMgaXMgYWxzbyBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgICAKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBjbGFzcyB3cmFwcGVycy4gICBXaGVuIFNXSUcgc2VlcyB0d28gY2xhc3NlcyBsaWtlIHRoaXMsCiAKICAgICAgICAgICBjbGFzcyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgY2xhc3MgWSA6IHB1YmxpYyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGJhcigpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgaXQgbm93IG9ubHkgZ2VuZXJhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9uczoKIAogICAgICAgICAgICAgWF9mb28oWCAqeCkgeyB4LT5mb28oKTsgfQogICAgICAgICAgICAgWV9iYXIoWSAqeSkgeyB5LT5iYXIoKTsgfQogCiAgICAgICAgICAgVW5saWtlIFNXSUcxLjE1LCB0aGUgZm9vKCkgbWV0aG9kIGRvZXMgKm5vdCogcHJvcGFnYXRlIHRvIGEgd3JhcHBlcgogICAgICAgICAgIGZ1bmN0aW9uIFlfZm9vKCkuIEluc3RlYWQsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCBYX2ZvbygpIG11c3QgYmUKICAgICAgICAgICB1c2VkLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBtb2R1bGVzIHRoYXQgdXNlIHNoYWRvdyBjbGFzc2VzLCBidXQKICAgICAgICAgICBpdCBtaWdodCBicmVhayBtb2R1bGVzIHRoYXQgZGlyZWN0bHkgdXNlIHRoZSBsb3ctbGV2ZWwgQyB3cmFwcGVycy4KICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIGZvciBhIG51bWJlciBvZiByZWFzb25zOgoKICAgICAgICAgICAgICAgLSAgSXQgZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTV0lHLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIHdpdGggYW50aWNpcGF0ZWQgZnV0dXJlIGNoYW5nZXMgc3VjaCBhcyBvdmVybG9hZGVkIG1ldGhvZHMuCgogICAgICAgICAgICAgICAtICBJdCByZXN1bHRzIGluIHN1YnN0YW50aWFsbHkgbGVzcyB3cmFwcGVyIGNvZGUtLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgZm9yIGJpZyBDKysgY2xhc3MgaGllcmFyY2hpZXMgKGluaGVyaXRlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgICAgYXJlIG5vIGxvbmdlciBjb3BpZWQgaW50byBldmVyeSBzaW5nbGUgZGVyaXZlZCBjbGFzcykuCgogICAgICAgICAgICAgICAtICBJdCBhbGxvd3MgZm9yIGJldHRlciBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgKGNvZGUgaXNuJ3QgcmVwbGljYXRlZCBpbgogICAgICAgICAgICAgICAgICBldmVyeSBzaW5nbGUgbW9kdWxlKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFByb3ZpZGVkIHNvbWUgV2luZG93cyBkb2N1bWVudGF0aW9uIGluIHRoZSBXaW4gZGlyZWN0b3J5IGFuZCBzb21lCiAgICAgICAgICAgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzIGZvciBydW5uaW5nIGV4YW1wbGVzIG9uIFdpbmRvd3MuCgo4LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHJlbmFtZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcHJvcGVybHk7CgkgICB0aGFua3MgdG8gTWFyYyBab256b24gPE1hcmMuWm9uem9uQHVuaXYtcmVubmVzMS5mcj4gZm9yIHRoZQoJICAgcGF0Y2guICBTZWUgdGhlIG5ldyB0ZXN0IGNhc2UgbmFtZV9jeHguCgo4LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtUY2xdIFJlbW92ZWQgbG90cyBvZiB3YXJuaW5ncyBpc3N1ZWQgYnkgdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLCB3aGljaCB3ZXJlIGNhdXNlZCBieSBtaXhpbmcgZnVuY3Rpb24gcG9pbnRlcnMKCSAgIG9mIGRpZmZlcmVudCBsaW5rYWdlcyAoQysrL0MpLiAKCjgvMjMvMjAwMTogbWtvZXBwZQoJICAgSW1wcm92ZWQgdGhlIE16U2NoZW1lIG1vZHVsZSBieSBwb3J0aW5nIEd1aWxlJ3MgcG9pbnRlcgoJICAgdHlwZSBjaGVja2luZyBzeXN0ZW0gYW5kIG1ha2luZyB0eXBlIGRpc3BhdGNoCgkgICB0eXBlbWFwLWRyaXZlbi4gCgo4LzIyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbnRpcmVseSBuZXcgc3ltYm9sIHRhYmxlIHByb2Nlc3NpbmcuICAgU1dJRyBzaG91bGQgYmUgYWJsZSB0bwogICAgICAgICAgIHJlcG9ydCBtdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICBBbHNvLCB0aGUgbmV3IHN5bWJvbCB0YWJsZSBhbGxvd3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zCiAgICAgICAgICAgKGFsdGhvdWdoIG92ZXJsb2FkaW5nIGlzbid0IHF1aXRlIHN1cHBvcnRlZCBpbiB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzIHlldCkuCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdICVuZXcgc3VwcG9ydCBhZGRlZC4KICAgICAgICAgICAqIFtKYXZhXSBQYWNrYWdlIEpOSSBuYW1lIHJlZml4ZWQhCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQeXRob24gbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgcG9pbnRlcnMgdG8gQysrIG1lbWJlcnMuICBUaGlzCiAgICAgICAgICAgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgIAo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBsaW1pdGVkIHBhcnNpbmcgYW5kIGZ1bGwgdHlwZS1zeXN0ZW0gc3VwcG9ydCBmb3IgcG9pbnRlcnMgdG8KICAgICAgICAgICBtZW1iZXJzLiBOb25lIG9mIFNXSUcncyBsYW5ndWFnZSBtb2R1bGVzIHJlYWxseSBrbm93IGhvdyB0byBkZWFsIHdpdGgKICAgICAgICAgICB0aGlzIHNvIHRoaXMgaXMgcmVhbGx5IG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcyBhbmQgZnV0dXJlCiAgICAgICAgICAgZXhwYW5zaW9uLiAgTm90ZTogU1dJRyBkb2VzIG5vdCBzdXBwb3J0IHBvaW50ZXJzIHRvIG1lbWJlcnMgd2hpY2ggCiAgICAgICAgICAgYXJlIHRoZW1zZWx2ZXMgcG9pbnRlcnMgdG8gbWVtYmVycywgcmVmZXJlbmNlcyB0byBwb2ludGVycyB0byBtZW1iZXJzLAogICAgICAgICAgIG9yIG90aGVyIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBpcyBtdWNoIGJldHRlciBhdCBwYXJzaW5nIGNlcnRhaW4gQysrIGRlY2xhcmF0aW9ucy4gT3BlcmF0b3JzIGFuZAogICAgICAgICAgIGZyaWVuZHMgZ2VuZXJhbGx5IGRvbid0IGNhdXNlIGFueW1vcmUgc3ludGF4IGVycm9ycy4gIEhvd2V2ZXIsIG5laXRoZXIKICAgICAgICAgICBhcmUgcmVhbGx5IHN1cHBvcnRlZC4KCjgvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkICpoaWdobHkqIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBvZiBDKysKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuICBTaW5jZSBDKysgdGVtcGxhdGVzIGFyZSBlc3NlbnRpYWxseQogICAgICAgICAgIGdsb3JpZmllZCBtYWNyb3MgYW5kIFNXSUcgaGFzIGEgZnVsbHkgb3BlcmF0aW9uYWwgQyAKICAgICAgICAgICBwcmVwcm9jZXNzb3Igd2l0aCBtYWNybyBzdXBwb3J0LCB0aGUgcGFyc2VyIG5vdyBjb252ZXJ0cwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB0byBtYWNyb3MuICBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbgogICAgICAgICAgIHRlbXBsYXRlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gVCBtYXgoVCBhLCBUIGIpOwoKICAgICAgICAgICBpcyBpbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX21heChfX25hbWUsVCkKICAgICAgICAgICAgICAgJW5hbWUoX19uYW1lKSBUIG1heChUIGEsIFQgYik7CiAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgYSB2ZXJzaW9uIG9mIHRoZSB0ZW1wbGF0ZSwgYSBzcGVjaWFsICV0ZW1wbGF0ZSBkZWNsYXJhdGlvbgogICAgICAgICAgIGlzIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgIAogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsKCiAgICAgICAgICAgVGhlIHBhcmFtZXRlciB0byB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHByb3BlciBDIGlkZW50aWZpZXIgdGhhdCdzCiAgICAgICAgICAgdXNlZCB0byB1bmlxdWVseSBuYW1lIHRoZSByZXN1bHRpbmcgaW5zdGFudGlhdGlvbi4gICBXaGVuIHVzZWQsIHRoZQogICAgICAgICAgIHRoZSBleHBhbmRlZCBtYWNybyBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVuYW1lKG1heGludCkgaW50IG1heChpbnQgYSwgaW50IGIpOwogICAgICAgICAgICAgICVuYW1lKG1heGRvdWJsZSkgZG91YmxlIG1heChkb3VibGUgYSwgZG91YmxlIGIpOwoKICAgICAgICAgICBBIHNpbWlsYXIgdGVjaG5pcXVlIGlzIHVzZWQgZm9yIHRlbXBsYXRlIGNsYXNzZXMuICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2ZWN0b3IoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBHZXRzIGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfdmVjdG9yKF9fbmFtZSwgVCkKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPFQ+IF9fbmFtZTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIF9fbmFtZSB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIF9fbmFtZShpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBfX25hbWUgdmVjdG9yPFQ+OwogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgQW4gYSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIGlzIGNyZWF0ZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXk6CgogICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlYykgdmVjdG9yPGludD47CgogICAgICAgICAgIFRoZSByZXN1bHRpbmcgY29kZSBwYXJzZWQgYnkgU1dJRyBpcyB0aGVuOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgaW50dmVjIHsKICAgICAgICAgICAgICAgICAgaW50ICpkYXRhOwogICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnR2ZWMoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgIGludCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIGludHZlYyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgTm90ZTogdGhlIGxhc3QgdHlwZWRlZiBpcyBub24tc3RhbmRhcmQgQyBhbmQgaXMgdXNlZCBieSBTV0lHIHRvIHByb3ZpZGUKICAgICAgICAgICBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBuYW1lICJpbnR2ZWMiIGFuZCB0aGUgdGVtcGxhdGUgdHlwZSAKICAgICAgICAgICAidmVjdG9yPGludD4iLgoKICAgICAgICAgICBDQVVUSU9OOiAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgdGhlIGZpcnN0IHRpbWUgU1dJRyBoYXMKICAgICAgICAgICBzdXBwb3J0ZWQgQysrIHRlbXBsYXRlcy4gICBFcnJvciByZXBvcnRpbmcgaXMgZXNzZW50aWFsIG5vbi1leGlzdGVudC4KICAgICAgICAgICBJdCB3aWxsIHByb2JhYmx5IGJyZWFrIGluIGNlcnRhaW4gY2FzZXMuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioqCgo4LzE1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gd3JhcHBpbmcgb2YgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiAgQXJyYXlzCiAgICAgICAgICAgYXJlIG5vdyBwcm9wZXJseSBtYXBwZWQgdG8gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCiAgICAgICAgICAgb25lIGxlc3MgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IFsxMF07ICAgICAgICAgICAgICAtLT4gIGludCAqCiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF07ICAgICAgICAgIC0tPiAgaW50ICgqKVsyMF07CiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF1bMzBdOyAgICAgIC0tPiAgaW50ICgqKVsyMF1bMzBdOwoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2VydGFpbiBTV0lHIGV4dGVuc2lvbnMgYmVjYXVzZQogICAgICAgICAgIG9sZGVyIHZlcnNpb25zIHNpbXBseSBtYXBwZWQgYWxsIGFycmF5cyBpbnRvIGEgc2luZ2xlCiAgICAgICAgICAgcG9pbnRlciBzdWNoIGFzICJpbnQgKiIuICAgQWx0aG91Z2ggcG9zc2libHkgdW51c3VhbCwgCiAgICAgICAgICAgdGhlIG5ldyB2ZXJzaW9uIGlzIGNvcnJlY3QgaW4gdGVybXMgb2YgdGhlIEMgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSBBcnJheSBzZXR0ZXJzIGdlbmVyYXRlZCBmb3Igc3RydWN0L2NsYXNzIGFycmF5IG1lbWJlcnMuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYW55IGltcHJvdmVtZW50cyB0byBUY2wvUGVybC9QeXRob24gbW9kdWxlcyB0byBiZXR0ZXIKICAgICAgICAgICB3b3JrIHdpdGggbXVsdGlwbGUgaW50ZXJmYWNlIGZpbGVzIGFuZCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgYmVoYXZpb3Igb2YgJWltcG9ydCBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBwb2xsdXRlcyB0aGUgbW9kdWxlIG5hbWVzcGFjZSBieSB1c2luZwogICAgICAgICAgICdmcm9tIG1vZHVsZSBpbXBvcnQgKicgdG8gcmVmZXIgdG8gdGhlIG90aGVyIG1vZHVsZS4gCiAgICAgICAgICAgSW5zdGVhZCwgaXQgZG9lcyBhIHByb3BlciAnaW1wb3J0IG1vZHVsZScuICAgQWxzbywgU1dJRwogICAgICAgICAgIG1heSB3b3JrIGEgbG90IGJldHRlciB3aGVuIGltcG9ydGluZyBtb2R1bGVzIHRoYXQgaW5jbHVkZQogICAgICAgICAgIHJlZmVyZW5jZXMgdG8gb3RoZXIgaW1wb3J0ZWQgbW9kdWxlcy4KCjgvMTMvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgbmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbGl6aW5nIHRob3NlIG9mIHRoZQoJICAgR3VpbGUtc3BlY2lmaWMgNS8yNy8yMDAxIGNoYW5nZXM6IAoJICAgKiAkZGVzY3JpcHRvciBpcyB0aGUgc2FtZSBhcyBTV0lHVFlQRSRtYW5nbGUsIGJ1dCBhbHNvCgkgICAgIGVuc3VyZXMgdGhhdCB0aGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoaXMgbmFtZSBnZXRzCgkgICAgIGRlZmluZWQuCgkgICAqICQqdHlwZSwgJCpsdHlwZSwgJCptYW5nbGUsICQqZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgc3RhciwgYnV0IHRoZXkgUkVNT1ZFIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyBmcm9tIHRoZSB0eXBlLiAoVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBwb2ludGVyIAoJICAgICB0eXBlcy4pCgkgICAqICQmdHlwZSwgJCZsdHlwZSwgJCZtYW5nbGUsICQmZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgYW1wZXJzYW5kLCBidXQgdGhleSBBREQgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIHRvIHRoZSB0eXBlLgoJICAgVGhlIEd1aWxlLXNwZWNpZmljIHN1YnN0aXR1dGlvbiAkYmFzZWRlc2NyaXB0b3Igd2FzIHJlbW92ZWQKCSAgIGJlY2F1c2UgaXQgd2FzIHVzZWxlc3MuCgo4LzEyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJWV4dGVybiBkaXJlY3RpdmUgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIHdpdGhkcmF3bi4gIFRoZQogICAgICAgICAgIHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUgd2FzIHRvIGltcG9ydCBzZWxlY3RlZCBkZWZpbml0aW9ucwogICAgICAgICAgIGZyb20gb3RoZXIgaW50ZXJmYWNlIGZpbGVzIGFuZCBoZWFkZXJzLiAgSG93ZXZlciwgdGhlIHNhbWUKICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggJWltcG9ydC4gICBUaGlzCiAgICAgICAgICAgbGVhdmVzIFNXSUcgd2l0aCB0d28gZmlsZSBpbmNsdXNpb24gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgZmlsZW5hbWUgICAgIC0gSW5zZXJ0cyBpbnRvIGN1cnJlbnQgaW50ZXJmYWNlCiAgICAgICAgICAgICAgJWltcG9ydCBmaWxlbmFtZSAgICAgIC0gSW1wb3J0IHR5cGVzIGFuZCBjbGFzc2VzIGZyb20gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBtb2R1bGUKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzA5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBuZXcgc3VwcG9ydCBmb3Igd3JhcHBpbmcgQy9DKysgY2FsbGJhY2sgZnVuY3Rpb25zLiAKICAgICAgICAgICBBIGNvbW1vbiBwcm9ibGVtIHdpdGggc29tZSBDIGxpYnJhcmllcyBpcyB0aGF0IG1hbnkKICAgICAgICAgICBmdW5jdGlvbnMgdGFrZSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBpbnQgKCpvcCkoaW50LGludCksIC4uLik7CgogICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHRoZSBvbmx5IHdheSB0byBjYWxsIHN1Y2ggYSBmdW5jdGlvbiBpcyB0bwogICAgICAgICAgIHBhc3MgaXQgYSBmdW5jdGlvbiBwb2ludGVyIG9mIHNvbWUgY29tcGF0aWJsZSB0eXBlLiAgSW4KICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgaGFkIHRvIHNvbHZlIHRoaXMgcHJvYmxlbQogICAgICAgICAgIHdpdGggc29tZSByZWFsbHkgZ3Jvc3MgaGFja3MuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGFzIGEgY2FsbGJhY2ssCgogICAgICAgICAgICAgICBpbnQgZm9vKGludCwgaW50KTsKCiAgICAgICAgICAgeW91IGhhZCB0byBpbnN0YWxsIGEgcG9pbnRlciB0byBpdCBhcyBhIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgCgogICAgICAgICAgICAgICBjb25zdCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciBpZiB5b3UgaGFkIGEgcmVhbGx5IG9sZCBTV0lHIHZlcnNpb246CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAoKk9QX0ZVTkMpKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBPUF9GVU5DLCAuLi4pOwogICAgICAgICAgICAgICBjb25zdCBPUF9GVU5DIEZPTyA9IGZvbzsKCiAgICAgICAgICAgCiAgICAgICAgICAgTm93LCB5b3UgY2FuIGRvIG9uZSBvZiB0d28gdGhpbmdzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCBmb28oaW50LGludCk7CgogICAgICAgICAgIFRoaXMgY3JlYXRlcyBhIGNvbnN0YW50ICdmb28nIG9mIHR5cGUgaW50ICgqKShpbnQsaW50KS4KICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbnMgYXJlIGluc3RhbGxlZCBhcyBjb25zdGFudHMgd2hlcmUKICAgICAgICAgICB0aGUgbmFtZSBpcyBkZWZpbmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGdpdmVuIHRvICVjYWxsYmFjaygpLgogICAgICAgICAgIElmIHRoZSBuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZGlmZmVyIGZyb20gdGhlCiAgICAgICAgICAgYWN0dWFsIGZ1bmN0aW9uIG5hbWUsIGJvdGggYSBmdW5jdGlvbiB3cmFwcGVyIGFuZCBhIGNhbGxiYWNrIAogICAgICAgICAgIGNvbnN0YW50IGFyZSBjcmVhdGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiUodXBwZXIpcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKICAgICAgICAgICAKICAgICAgICAgICBDcmVhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9ucyAnZm9vJywgJ2JhcicgYW5kIGFkZGl0aW9uYWxseQogICAgICAgICAgIGNyZWF0ZXMgdHdvIGNhbGxiYWNrIGNvbnN0YW50cyAnRk9PJywgJ0JBUicuCgogICAgICAgICAgIE5vdGU6IFNXSUcgc3RpbGwgZG9lcyBub3QgcHJvdmlkZSBhdXRvbWF0aWMgc3VwcG9ydCBmb3IgCiAgICAgICAgICAgd3JpdGluZyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogc3RydWN0IG5lc3RpbmcgZml4ZXMgYXMgcGVyIFNGIGJ1ZyAjNDQ3NDg4LgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVuYW1lIGRpcmVjdGl2ZSBub3cgYXBwbGllcyB0byBjb25zdGFudHMgY3JlYXRlZCB3aXRoCiAgICAgICAgICAgI2RlZmluZSBhbmQgJWNvbnN0YW50LiAgSG93ZXZlciwgbW9zdCBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgd2VyZSBuZXZlciB3cml0dGVuIHRvIHN1cHBvcnQgdGhpcyBhbmQgd2lsbCBoYXZlIHRvIGJlCiAgICAgICAgICAgbW9kaWZpZWQgdG8gbWFrZSBpdCB3b3JrLiAgVGNsLCBQeXRob24sIGFuZCBQZXJsIG1vZHVsZXMKICAgICAgICAgICBhcmUgd29ya2luZyBub3cuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBjaGFuZ2VzIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiBDIGRlY2xhcmF0aW9uIHBhcnNpbmcuCiAgICAgICAgICAgQWx0aG91Z2ggU1dJRyBpcyBzdGlsbCBub3QgYSBmdWxsIEMgcGFyc2VyLCBpdHMgYWJpbGl0eQogICAgICAgICAgIHRvIGhhbmRsZSBjb21wbGV4IGRhdGF0eXBlcyBpbmNsdWRpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIGFycmF5cyBoYXMgYmVlbiB2YXN0bHkgaW1wcm92ZWQuICAKCjgvMDMvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBEaXN0cmlidXRpb24gZml4ZXM6IGF1dG9jb25mIG5vIGxvbmdlciBuZWVkZWQgdG8gaW5zdGFsbCBTV0lHLgoKOC8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCB0d28gdW5kb2N1bWVudGVkIHBhcnNpbmcgZmVhdHVyZXMuICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgIHN1cHBvcnRzIG91dC1vZi1jbGFzcyBzdGF0aWMgZnVuY3Rpb24gb3IgdmFyaWFibGUKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IEZvbzo6YmFyOwoKICAgICAgICAgICBUaGlzIGZlYXR1cmUgbWF5IHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IGRlbWFuZC4gCiAgICAgICAgICAgSG93ZXZlciwgc2luY2UgU1dJRyBpcyBtb3N0IG9mdGVuIHVzZWQgd2l0aCBoZWFkZXIgZmlsZXMsCiAgICAgICAgICAgaXQgaXMgbW9yZSBsaWtlbHkgZm9yIHRoZXNlIGRlZmluaXRpb25zIHRvIGJlIGluY2x1ZGVkCiAgICAgICAgICAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBDbGVhbnVwIG9mIHRoZSBHSUZQbG90IGV4YW1wbGVzLiBVcGdyYWRlZCBKYXZhIEdJRlBsb3QgZXhhbXBsZS4KCjgvMDEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBFZmZpY2llbmN5IGNoYW5nZXM6IF9jUHRyIHVzZWQgd2hlcmUgcG9zc2libGUgcmF0aGVyIHRoYW4KCSAgICAgZ2V0Q1B0cigpLiBCdWcgZml4ZXMgZm9yIGluaGVyaXRhbmNlIC0gZGVyaXZlZCBjbGFzcyBzb21ldGltZXMKCSAgICAgZGlkbid0IGRlbGV0ZSB0aGUgYyBtZW1vcnkgd2hlbiBfZGVsZXRlKCkgd2FzIGNhbGxlZC4KCSAgICogW0phdmFdIEFic3RyYWN0IGMrKyBjbGFzc2VzIGFyZSB3cmFwcGVkIHdpdGggYSBqYXZhIGFic3RyYWN0IHNoYWRvdwoJICAgICBjbGFzcy4gQWxzbyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBpcyBtYXBwZWQgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QuCgkgICAqIFRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGhhcyBhbHdheXMgYmVlbiA8bW9kdWxlPl93cmFwLmMuIEl0IGlzIG5vdwoJICAgICA8bW9kdWxlPl93cmFwLmN4eCBpZiB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24gaXMgcGFzc2VkIHRvIHN3aWcuCgkgICAgIFRoaXMgaGFzIGJlZW4gZG9uZSBhcyBvdGhlcndpc2UgYysrIGNvZGUgd291bGQgYXBwZWFyIGluIGEgYyBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKCjcvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIHRvIGJlIG1vcmUgQy1saWtlIGluIHN5bnRheC4KICAgICAgICAgICBUaGUgc3ludGF4IGlzIG5vdzoKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgTkFNRSA9IFZBTFVFOwogICAgICAgICAgICAgICAgJWNvbnN0YW50IFRZUEUgTkFNRSA9IFZBTFVFOwogCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IEZvbyAqQmFyID0gJlNwYW07CgogICAgICAgICAgIEEgbW9yZSBzdWJ0bGUgY2FzZSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBibGFoOwoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIE1vZHVsZXMgdGhhdCB3ZXJlIHVzaW5nCiAgICAgICAgICAgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgZGlyZWN0bHkgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICAgICAKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBvYnNjdXJlIGFuZCB1bmRvY3VtZW50ZWQgZm9ybSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAlaW5saW5lIGludCBibGFoKGludCBhLCBpbnQgYikgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCiAgICAgICAgICAgKG5vdGU6IHRoaXMgZmVhdHVyZSB3YXMgbmV2ZXIgZG9jdW1lbnRlZCBhbmQgaXMgd2l0aGRyYXduKQoKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyBleHBsaWNpdGx5IGRlY2xhcmVkCiAgICAgICAgICAgcmV0dXJuIHR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGZvbyhpbnQpOwoKICAgICAgICAgICBJbiBDLCBzdWNoIGZ1bmN0aW9ucyB3ZXJlIGltcGxpY2l0bHkgYXNzdW1lZCB0byByZXR1cm4gYW4gJ2ludCcuCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzIGlsbGVnYWwuICBFaXRoZXIgd2F5LCBpdCdzIGNvbnNpZGVyZWQgYmFkCiAgICAgICAgICAgc3R5bGUuICBSZW1vdmluZyBzdXBwb3J0IGZvciB0aGlzIGluIFNXSUcgd2lsbCBzaW1wbGlmeQogICAgICAgICAgIGNlcnRhaW4gaXNzdWVzIGluIHBhcnNpbmcuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzMwLzIwMDE6IG1rb2VwcGUKCSAgICogUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsuICBUaGUgU291cmNlL0RPSCBkaXJlY3RvcnkKCSAgICAgYW5kIG1vc3Qgb2YgdGhlIFNvdXJjZS9Td2lnIGRpcmVjdG9yeSBpcyB1cC10by1kYXRlIG5vdy4KCSAgICogW0d1aWxlXSAlc2NoZW1lIGlzIG5vdyBhIG1hY3JvIGZvciAlaW5zZXJ0KCJzY2hlbWUiKS4gIAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAiRklMRU5BTUUiOyAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgJXsgU0NIRU1FLUNPREUgJX0KCSAgICAgTmV3IG1hY3JvcyAlbXVsdGlwbGVfdmFsdWVzLCAldmFsdWVzX2FzX2xpc3QsCgkgICAgICV2YWx1ZXNfYXNfdmVjdG9yLiAKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBoYXZlIGJlZW4gdHVybmVkIGludG8gU1dJRyBwcmFnbWFzLgogICAgICAgICAgICVwcmFnbWEoc3dpZykgcmVhZG9ubHkgYW5kICVwcmFnbWEoc3dpZykgcmVhZHdyaXRlLiAgTWFjcm9zCiAgICAgICAgICAgYXJlIHVzZWQgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXByYWdtYSBkaXJlY3RpdmUuICAlcHJhZ21hIG11c3QgYWx3YXlzCiAgICAgICAgICAgYmUgZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyBsYW5ndWFnZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcHJhZ21hKHN3aWcpIG1ha2VfZGVmYXVsdDsKICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImJsYWguaSI7CgogICAgICAgICAgIEFsc28gZXh0ZW5kZWQgdGhlIHByYWdtYSBkaXJlY3RpdmUgdG8gYWxsb3cgY29kZSBibG9ja3MKIAogICAgICAgICAgICAgICVwcmFnbWEoZm9vKSBjb2RlID0gJXsKICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0aGUgd2F5ICdjb25zdCcgdmFyaWFibGVzIGFyZSB3cmFwcGVkLiAgSW4gCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgYSAnY29uc3QnIHZhcmlhYmxlIHdhcwogICAgICAgICAgIHdyYXBwZWQgYXMgYSBjb25zdGFudC4gICBOb3csICdjb25zdCcgdmFyaWFibGVzIGFyZQogICAgICAgICAgIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gIFRoZXJlIGFyZSBzZXZlcmFsCiAgICAgICAgICAgcmVhc29ucyBmb3IgbWFraW5nIHRoaXMgY2hhbmdlLCBtb3N0bHkgcGVydGFpbmluZyB0bwogICAgICAgICAgIHN1YnRsZSBkZXRhaWxzIG9mIGhvdyAnY29uc3QnIGFjdHVhbGx5IHdvcmtzLiAKCiAgICAgICAgICAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIG9sZCBpbnRlcmZhY2VzIHRoYXQgdXNlZCAnY29uc3QnCiAgICAgICAgICAgdG8gY3JlYXRlIGNvbnN0YW50cy4gICBBcyBhIHJlcGxhY2VtZW50LCBjb25zaWRlciB1c2luZyB0aGlzOgoKICAgICAgICAgICBjb25zdCBpbnQgYSA9IDQ7ICAgPT09PiAgICVjb25zdGFudCBpbnQgYSA9IDQ7CiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW9yZ2FuaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24gb2YgdHlwZSBwYXJzaW5nLgogICAgICAgICAgIFR5cGVzIHdpdGggJ2NvbnN0JyBzaG91bGQgd29yayBjb3JyZWN0bHkgbm93LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9zdCBzd2lnIGRpcmVjdGl2ZXMgcmVsYXRlZCB0byB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KICAgICAgICAgICBhcmUgbm93IGRlcHJlY2F0ZWQuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIE9iamVjdGl2ZS1DIGluIG9yZGVyIHRvIHNpbXBsaWZ5CiAgICAgICAgICAgcGFyc2VyIHJlY29uc3RydWN0aW9uLiAgV2lsbCByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudAogICAgICAgICAgIGRlbWFuZC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENvZGUgaW5jbHVzaW9uIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSBwYXJzZXIuICBBIGNvbW1vbgogICAgICAgICAgIGRpcmVjdGl2ZSAlaW5zZXJ0IGlzIG5vdyB1c2VkIGZvciBldmVyeXRoaW5nLiAgVGhpcwogICAgICAgICAgIGluc2VydHMgYSBmaWxlIGludG8gdGhlIG91dHB1dDoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAiZm9vLnN3ZyIKCiAgICAgICAgICAgVGhpcyBpbnNlcnRzIHNvbWUgaW5saW5lIGNvZGUgaW50byB0aGUgb3V0cHV0CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgJXsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uIAogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGVyZSBhcmUgZml2ZSBwcmVkZWZpbmVkIHRhcmdldHMgZm9yIHRoZSBpbnNlcnQgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgImhlYWRlciIgICAgLSBIZWFkZXIgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgInJ1bnRpbWUiICAgLSBSdW50aW1lIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJ3cmFwcGVyIiAgIC0gV3JhcHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgICJpbml0IiAgICAgIC0gSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgICAgICAgICAgICAgIm51bGwiICAgICAgLSBOb3RoaW5nLiBEaXNjYXJkLgoKICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgYXJlIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGFyZQogICAgICAgICAgIG5vdyBkZWZpbmVkIGluIHRlcm1zIG9mIG1hY3JvczoKCiAgICAgICAgICAgICAgICV7IC4uLiAlfSAgICAgICAgICAgLT4gJWluc2VydChoZWFkZXIpICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJWluaXQgJXsgLi4uICV9ICAgICAtPiAlaW5zZXJ0KGluaXQpICAgICV7IC4uLiAlfQogICAgICAgICAgICAgICAld3JhcHBlciAleyAuLi4gJX0gIC0+ICVpbnNlcnQod3JhcHBlcikgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVydW50aW1lICV7IC4uLiAlfSAgLT4gJWluc2VydChydW50aW1lKSAleyAuLi4gJX0KCiAgICAgICAgICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gZGVmaW5lIG5ldyBuYW1lZCB0YXJnZXRzIGJ5IHVzaW5nIHRoZQogICAgICAgICAgIEMgQVBJIGZ1bmN0aW9uIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgpIChzZWUgbWFpbi5jeHgpLgogICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGV4cG9zZSBhIHNoYWRvdyBjbGFzcyBmaWxlLAogICAgICAgICAgIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoInNoYWRvdyIsIGZfc2hhZG93KTsKCiAgICAgICAgICAgVGhlbiBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAgICVpbnNlcnQoc2hhZG93KSAleyAuLi4gJX0KCiAgICAgICAgICAgTm90ZTogdGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgYW55IG9sZCBpbnRlcmZhY2VzLCBidXQKICAgICAgICAgICBkb2VzIG9wZW4gdXAgbmV3IHBvc3NpYmlsaXRpZXMgZm9yIGVuaGFuY2VtZW50cy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGFsd2F5cyBpbmNsdWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgZmlsZSAnc3dpZy5zd2cnLgogICAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zCiAgICAgICAgICAgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHZhcmlvdXMgU1dJRyBkaXJlY3RpdmVzLgogICAgICAgICAgIFByZXZpb3VzbHksIGFsbCBTV0lHIGRpcmVjdGl2ZXMgd2VyZSBoYW5kbGVkIGFzIHNwZWNpYWwKICAgICAgICAgICBjYXNlcyBpbiB0aGUgcGFyc2VyLiAgVGhpcyBtYWRlIHRoZSBwYXJzZXIgYSBsYXJnZSAKICAgICAgICAgICBibG9hdGVkIG1lc3MuICBOb3csIHRoZSBwYXJzZXIgaXMgc3RyaXBwZWQgZG93biB0byBhIGZldwogICAgICAgICAgIHNpbXBsZSBkaXJlY3RpdmVzIGFuZCBtYWNyb3MgYXJlIHVzZWQgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgZWxzZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEZpeGVzIGZvciBTb3VyY2Vmb3JnZSBidWcgIzQ0NDc0OCAtIG5ldyB0ZXN0Y2FzZSBjcHBfc3RhdGljOgoJICAgICBbVENMXSBDbGFzcyB3aXRoIGp1c3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZS9mdW5jdGlvbiBmaXgKCSAgICAgW0phdmFdIEZpeGVkIHN0YXRpYyB2YXJpYWJsZXMgc3VwcG9ydAoJICAgICBbUnVieV0gU3RhdGljIHZhcmlhYmxlcyB3b3JrYXJvdW5kIHJlbW92ZWQKCjcvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBzdHlwZS5jIChTd2lnVHlwZV9kZWZhdWx0KTogU3RyaXAgcXVhbGlmaWVycyBmaXJzdC4gVGhlCgkgICAgIGRlZmF1bHQgdHlwZSBvZiAiaW50ICogY29uc3QiIGlzIG5vdyAiU1dJR1BPSU5URVIgKiIuCgkgICAqIG1haW4uY3h4OiBEZWZpbmUgIl9fY3BsdXNwbHVzIiBpbiBTV0lHJ3MgcHJlcHJvY2Vzc29yIGlmCgkgICAgIGluIEMrKyBtb2RlLgoJICAgKiBbR3VpbGVdOiBBZGRlZCBzb21lIHN1cHBvcnQgZm9yIGFycmF5cyBhbmQgQysrCgkgICAgIHJlZmVyZW5jZXMsIGZpeGluZyB0aGUgImNvbnN0YW50X3BvaW50ZXJzIiB0ZXN0IGNhc2UuCgkgICAqIE1vdmVkIG1vc3QgdGVzdHMgZnJvbSB0aGUgb2xkIEd1aWxlLXNwZWNpZmljIHRlc3Qtc3VpdGUKCSAgICAgdG8gdGhlIG5ldyB0ZXN0LXN1aXRlLiAgQWxzbyBtb3ZlZCBwZXJsNS9wb2ludGVyLWN4eAoJICAgICBleGFtcGxlIHRoZXJlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogVGVzdC1zdWl0ZSBhZGRlZC4KCSAgICogSW5pdGlhbCB0ZXN0Y2FzZXM6IGNvbnN0YW50X3BvaW50ZXJzIGNwcF9lbnVtIGRlZmluZXMKCSAgICAgc2l6ZW9mX3BvaW50ZXJzIHVuaW9ucyB2aXJ0dWFsX2Rlc3RydWN0b3IKCSAgICogTWFrZSBjbGVhbiBpbXByb3ZlbWVudHMuCgo3LzI0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gVW5kZXJzY29yZXMgaW4gdGhlIHBhY2thZ2UgbmFtZSBhbmQvb3IgbW9kdWxlIG5hbWUKCSAgIG5vIGxvbmdlciBnaXZlIGxpbmtpbmcgcHJvYmxlbXMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNb3JlIHBhcnNlciBidWcgZml4ZXMgZm9yIGNvbnN0YW50IHBvaW50ZXJzCgo3LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXSBBZXN0aGV0aWMgaW1wcm92ZW1lbnQgaW4gdmFyaWFibGUgd3JhcHBlcnMuCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIGNvcmUtZHVtcCBwcm9ibGVtIGluIHBvaW50ZXIgbGlicmFyeSB3aGVuIAogICAgICAgICAgICAgZnJlZWluZyBjaGFyYWN0ZXIgYXJyYXlzLgogICAgICAgICAgICAgU0YgQnVnIFsgIzQxNTgzNyBdIHBvaW50ZXIgbGliIGNvcmUgZHVtcAoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBkZXN0cnVjdG9ycyBhbmQgc2hhZG93CiAgICAgICAgICAgICBjbGFzc2VzLiAgU0YgYnVnICMyMjExMjguCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIFRvIHByb3ZpZGUgYmV0dGVyIGxpbmUtbnVtYmVyIHRyYWNraW5nIGluIGludGVyZmFjZXMKICAgICAgICAgICAgIHdpdGggbG90cyBvZiBtYWNyb3MsIHNwZWNpYWwgbG9jYXRvciBjb21tZW50cyBhcmUKICAgICAgICAgICAgIG5vdyBnZW5lcmF0ZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8qQGZvby5pLDQyLEJMQUhAKi9leHBhbmRlZCBtYWNyby8qQEAqLwoKICAgICAgICAgICAgIFRoZSBmaXJzdCAvKkAuLi5AKi8gc2VxdWVuY2Ugc2V0cyB0aGUgY29udGV4dAogICAgICAgICAgICAgdG8gcG9pbnQgdG8gdGhlIG1hY3JvIGNvZGUuICBUaGUgLypAQCovIGNvbW1lbnQKICAgICAgICAgICAgIHRlcm1pbmF0ZXMgdGhlIGNvbnRleHQuICBUaGUgU1dJRyBwYXJzZXIgc2hvdWxkCiAgICAgICAgICAgICBpZ25vcmUgYWxsIG9mIHRoZSBsb2NhdG9yIGNvbW1lbnRzIGFzIHNob3VsZAogICAgICAgICAgICAgdGhlIEMgY29tcGlsZXIgKHNob3VsZCBzdWNoIGNvbW1lbnRzIGVuZCB1cAogICAgICAgICAgICAgaW4gZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSkuCgo3LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgaGFuZGxlcyBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzIGluCgkgICB0eXBlbWFwcy4gIFRoaXMgaW50cm9kdWNlZCBhIG5ldyBzaGlmdC9yZWR1Y2UgY29uZmxpY3QsIGJ1dAoJICAgb25seSB3aXRoIGEgaGV1cmlzdGljIGZ1bmN0aW9uLXBvaW50ZXIgY2F0Y2gtYWxsIHJ1bGUuICAKCSAgICogW0d1aWxlXTogQWRkZWQgdHlwZW1hcHMgZm9yIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMuIAoJICAgKiBGaXhlZCB0aGUgInRlbXBsYXRlLXdoaXRlc3BhY2UiIHByb2JsZW0gYnkgY2Fub25pY2FsaXppbmcKCSAgICAgd2hpdGVzcGFjZSwgZXNwZWNpYWxseSBhcm91bmQgYW5nbGUgYnJhY2tldHMgYW5kIGNvbW1hcy4gCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogQSBTY2hlbWUgZmlsZSBpcyBlbWl0dGVkIGlmIHRoZSAtc2Ntc3R1YiBGSUxFLlNDTQoJICAgY29tbWFuZC1saW5lIG9wdGlvbiBpcyB1c2VkLiAgVGhlICVzY2hlbWUgZGlyZWN0aXZlCgkgICAoaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3IgYSBwcmFnbWEpIGFsbG93cyB0byBpbnNlcnQKCSAgIGFyYml0cmFyeSBjb2RlIGhlcmUuICBJbiAic2ltcGxlIiBhbmQgInBhc3NpdmUiIGxpbmthZ2UsCgkgICB0aGUgZmlsZSBnZXRzIGZpbGxlZCB3aXRoIGRlZmluZS1tb2R1bGUgYW5kIGV4cG9ydAoJICAgZGVjbGFyYXRpb25zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogUGFyc2VyIGJ1ZyBmaXggdG8gc3VwcG9ydCBjb25zdGFudCBwb2ludGVycywgZWcgaW50KiBjb25zdCBwdHIuCgkgICBGaXhlZCBldmVyeXdoZXJlIC0gdmFyaWFibGVzLCBwYXJhbWV0ZXJzLCByZXR1cm4gdHlwZXMgZXRjLiBOb3RlIHRoYXQKCSAgIHdoZW4gd3JhcHBpbmcgYSBjb25zdGFudCBwb2ludGVyIHZhcmlhYmxlIG9ubHkgdGhlIGdldHRlciBpcyBnZW5lcmF0ZWQuCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogRml4ZWQgU0YgYnVnICM0NDE0NzAgKCNkZWZpbmUgWCAiLy8iIHdvdWxkIG5vdCBiZSBwYXJzZWQsCgkgICAgIHNlZSB0ZXN0LXN1aXRlIGVudHJ5ICJwcmVwcm9jLTEiKSwgcmVwb3J0ZWQgYnkgVC4gVy4gQnVydG9uCgkgICAgIDx0d2J1cnRvbkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBDaGFuZ2VkIHRoZSB0eXBlIG9mIGNoYXJhY3RlciBjb25zdGFudHMgdG8gImNoYXIiLCByYXRoZXIKCSAgICAgdGhhbiAiY2hhciAqIi4gIENoYW5nZWQgdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcwoJICAgICB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBleGNlcHQgZm9yIHRoZSBHdWlsZSBtb2R1bGUsCgkgICAgIHdoZXJlIGl0IGlzIGRlc2lyZWQgdG8gbWFrZSB0aGVtIFNjaGVtZSBjaGFyYWN0ZXJzLiAgVGhpcwoJICAgICBmaXhlcyBTRiBidWcgIzIzMTQwOSwgdGVzdC1zdWl0ZSBlbnRyeSAiY2hhci1jb25zdGFudCIuCgkgICAqIEFwcGxpZWQgcGF0Y2ggZm9yIERPSC9Eb2gvbWVtb3J5LmMgYnkgTGVzIFNjaGFmZmVyCgkgICAgIDxzY2hhZmZlckBvcHRvbmxpbmUubmV0PiAoYXZvaWQgcmVxdWlyZWQgc2lkZSBlZmZlY3RzIGluCgkgICAgIGFzc2VydCkuIAoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvciB3aXRoIHZvaWQgYXMgcGFyYW1ldGVyCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyICNkZWZpbmVzIGVtYmVkZGVkIHdpdGhpbiBjbGFzc2VzL3N0cnVjdHMvdW5pb25zCgkgICBDb25zZXF1ZW50bHkgJWNvbnN0YW50IGNhbiBub3cgYWxzbyBiZSBwbGFjZWQgd2l0aGluIGEgc3RydWN0L2NsYXNzL3VuaW9uLgoJICAgKiBCdWcgZml4IGluIHBhcnNlciB0byBhbGxvdyBzaXplb2YoKklfYW1fYV9wb2ludGVyKSB3aXRoaW4gYSAjZGVmaW5lCgo3LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogQWRkZWQgY2hhbmdlcyBmb3IgdGhlIE1hY2ludG9zaCBjb250cmlidXRlZCBieSBMdWlnaQoJICAgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LiAKCSAgICogU29tZSAiY29uc3QiIGZpeGVzIGluIHRoZSBjb2RlLgoJICAgKiBbR3VpbGVdOiBNYWRlIHRoZSBjb25zdGFudC13cmFwcGVyIGZ1bmN0aW9ucyBtdWNoIHNob3J0ZXIuCgo3LzEzLzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogU29tZSAiY29uc3QiIGZpeGVzIGZvciBHdWlsZSB2ZXJzaW9uIDEuMy40LgoJICAgKiBIYW5kbGUgYW5vbnltb3VzIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCBzdGF0aWMKCSAgICAgYXJyYXkgbWVtYmVycyBvZiBjbGFzc2VzLiAgQm90aCBidWdzIHJlcG9ydGVkIGJ5IEFubmFsaXNhIFRlcnJhY2luYQoJICAgICA8YW5uYWxpc2EudGVycmFjaW5hQGRhdGFtYXQuaXQ+OyBzZWUgdGhlIGZpbGVzCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvc3RhdGljLWFycmF5LW1lbWJlci5pIGFuZAoJICAgICBhbm9ueW1vdXMtYXJnLmkuCgpWZXJzaW9uIDEuMy42ICAoSnVseSA5LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNy8wOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogRk9SRUdST1VORCBhbmQgQkFDS0dST1VORCBkZWZpbml0aW9uIG1pc3NpbmcgCgkgICBhZnRlciBUUkFOU1BBUkVOVCAjZGVmaW5lIGZpeCBpbiBHSUZQbG90Cgo3LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXJzIHNvIHRoYXQgdGhlIHJlbGVhc2UgaXMga25vd24KICAgICAgICAgICBhcyAxLjMuNi4gIEFsbCBmdXR1cmUgcmVsZWFzZXMgc2hvdWxkIGhhdmUgYSBzaW1pbGFyCiAgICAgICAgICAgdmVyc2lvbiBmb3JtYXQuCgo3LzAyLzIwMDE6IG1rb2VwcGUKCSAgICogW1B5dGhvbl06IFByZXZlbnQgdGhlIHByb2JsZW0gb2Ygc2VsZi50aGlzb3duIG5vdCBiZWluZwoJICAgZGVmaW5lZCBpZiB0aGUgQysrIGNsYXNzIGNvbnN0cnVjdG9yIHJhaXNlZCBhbiBleGNlcHRpb24uCgkgICBUaGFua3MgdG8gTHVpZ2kgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LgoKNi8yOS8yMDAxOiBta29lcHBlCgkgICAqIE1vcmUgcG9ydGFiaWxpdHkgZml4ZXM7IGZpeGVkICJnY2MgLVdhbGwiIHdhcm5pbmdzLgoKNi8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogVFJBTlNQQVJFTlQgI2RlZmluZSBtdWx0aXBsZSB0aW1lcyBvbiBTb2xhcmlzIAoJICAgKGNsYXNoZXMgd2l0aCBzdHJlYW0uaCkuCgkgICAqIE11bHRpcGxlIGRlZmluaXRpb24gYnVnIGZpeCBmb3Igc2hhZG93IGNsYXNzZXMuIFRoZSBwZXJsIGFuZCBweXRob24gCgkgICBtb2R1bGVzIGhhZCB3b3JrYXJvdW5kcyB3aGljaCBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBmaXhlcyBpbiAKCSAgIHRoZSBjb3JlLiBNYW55IG9mIHRoZSBMYW5ndWFnZTo6Y3BwX3h4eHggZnVuY3Rpb25zIG5vdyBzZXQgYSAKCSAgIGZsYWcgd2hpY2ggdGhlIGRlcml2ZWQgY2xhc3NlcyBjYW4gYWNjZXNzIHRocm91Z2ggCgkgICBpc19tdWx0aXBsZV9kZWZpbml0aW9uKCkgdG8gc2VlIHdoZXRoZXIgb3Igbm90IGNvZGUgc2hvdWxkIGJlIAoJICAgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgYmVsb3cgd291bGQgaGF2ZSBwcm9kdWNlZCB2YXJ5aW5nIGRlZ3JlZXMgCgkgICBvZiBpbmNvcnJlY3Qgc2hhZG93IGNsYXNzIGNvZGUgZm9yIHRoZSB2YXJpb3VzIG1vZHVsZXM6CgkgICBjbGFzcyBUZXN0Q2xhc3MKCSAgIHsKCSAgIHB1YmxpYzoKCSAgICAgVGVzdENsYXNzKCkge30KCSAgICAgVGVzdENsYXNzKGludCBhKSB7fQoJICAgICB+VGVzdENsYXNzKCkge30KCSAgICAgdW5zaWduZWQgbG9uZyB4eXooc2hvcnQgaykge30KCSAgICAgdW5zaWduZWQgbG9uZyB4eXooaW50IG4pIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKCkge30KCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoaW50IGEpIHt9CgkgICB9OwoJICAgdm9pZCBkZWxldGVfVGVzdENsYXNzKGludCBhKTsKCjYvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBbUGVybF0gQW5vdGhlciBjb25zdC1yZWxhdGVkIHBvcnRhYmlsaXR5IGZpeC4KCjYvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBBZGRlZCBpbiBjcHBfcHJhZ21hKCkgc3VwcG9ydCB3aXRoIGEgaG9zdCBvZiBuZXcgcHJhZ21hcyAtIHNlZSAKCSAgIGpzd2lnLmh0bWwuIFRoZXNlIGFyZSBkZXNpZ25lZCBmb3IgYmV0dGVyIG1peGluZyBvZiBKYXZhIGFuZCBjKysuIEl0IAoJICAgZW5hYmxlcyB0aGUgdXNlciB0byBzcGVjaWZ5IHB1cmUgSmF2YSBjbGFzc2VzIGFzIGJhc2VzIGFuZC9vciBpbnRlcmZhY2VzIAoJICAgZm9yIHRoZSB3cmFwcGVkIGMvYysrLgoJICAgKiBbSmF2YV0gT2xkIHByYWdtYXMgcmVuYW1lZC4gV2FybmluZyBnaXZlbiBmb3IgdGhlIG1vbWVudCBpZiB1c2VkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8yNS8yMDAxOiBta29lcHBlCgkgICAqIEluY29ycG9yYXRlZCBtb3JlIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiBmb3Igc3dpZy9ydWJ5IG9uIGN5Z3dpbi4KCjYvMjAvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1ha2VmaWxlIG1vZHMgc28gdGhhdCAnbWFrZSBjaGVjaycgdXNlcyB0aGUgc3dpZyBvcHRpb25zIGluIHRoZSBtYWtlZmlsZXMKCSAgICogW0phdmFdIFJlbW92ZWQgR2VuZXJhdGluZyB3cmFwcGVycyBtZXNzYWdlCgkgICAqIFtKYXZhXSBOVUxMIHBvaW50ZXIgYnVnIGZpeAoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgS2FmZmUgSlZNCgo2LzIwLzIwMDE6IG1rb2VwcGUKCSAgICogU1dJR19UeXBlUXVlcnkgZnJvbSBjb21tb24uc3dnIG5vdyByZXR1cm5zIGEKCSAgIHN3aWdfdHlwZV9pbmZvKiByYXRoZXIgdGhhbiBhIHZvaWQqLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0KCSAgIHdoZW4gdXNpbmcgcG9pbnRlci5pIGFuZCBDKyssIGFzIGlsbHVzdHJhdGVkIGJ5IHRoZSBuZXcKCSAgIHRlc3Qtc3VpdGUgZXhhbXBsZSBwZXJsNS9wb2ludGVyLWN4eC4KCSAgICogUG9ydGFiaWxpdHkgZml4ZXMgKGNvbnN0IGNoYXIgKikuIAoJICAgKiBJbmNvcnBvcmF0ZWQgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+LCB3aGljaCBtYWtlIHN3aWcgcnVubmFibGUgb24gY3lnd2luLgoKNi8xOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIFNGIGJ1ZyAjMjExMTQ0LiBUaGlzIGZpeCBpcyBhIHdvcmthcm91bmQgCgkgICAgIHVudGlsIGZpeGVkIGluIHRoZSBjb3JlLgoKNi8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFBvcnRhYmlsaXR5IGZpeGVzIGZvciB1c2Ugd2l0aCB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMuIAoJICAgKiBbVGNsXTogUG9ydGFiaWxpdHkgZml4IChjb25zdCBjaGFyICopLgoJICAgKiBbVGNsXTogQ29uZmlndXJlIG5vdyBmaXJzdCB0cmllcyB0byBmaW5kIGEgdGNsQ29uZmlnLnNoCgkgICBmaWxlIGluIG9yZGVyIHRvIGZpbmQgdGhlIFRjbCBpbmNsdWRlIGRpcmVjdG9yeSwgbGlicmFyeQoJICAgbG9jYXRpb24gYW5kIGxpYnJhcnkgbmFtZS4KCSAgICogW1B5dGhvbl06IEFkZGVkIGEgZmV3IHBvc3NpYmxlIGxpYnJhcnkgbG9jYXRpb25zLgoKNi8xOC8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IERvbid0IGNhbGwgc2NtX2NfZXhwb3J0IGlmIG5vdGhpbmcgaXMgdG8gYmUKCSAgICAgZXhwb3J0ZWQuICBEb24ndCB3YXJuIG9uICVtb2R1bGUgaWYgbW9kdWxlIGhhcyBiZWVuIHNldAoJICAgICBhbHJlYWR5ICh0aGlzIGZyZXF1ZW50bHkgb2NjdXJzIHdoZW4gJWltcG9ydCBpcyB1c2VkKS4KCjYvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBOZXcgInBhc3NpdmUiIGxpbmthZ2UsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIGZvcgoJICAgICBtdWx0aS1tb2R1bGUgZXh0ZW5zaW9ucyB3aXRob3V0IEd1aWxlIG1vZHVsZSBtYWdpYy4KCjYvMTUvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBGaXhlZCBwcmludGluZyBvZiBzbW9icyAoc3BhY2UgYW5kIGFuZ2xlIHdlcmUKCSAgICAgbWlzc2luZykuIAoJICAgKiBQcm9wZXJseSBnZW5lcmF0ZSB0eXBlIGluZm9ybWF0aW9uIGZvciBiYXNlIGNsYXNzZXMKCSAgICAgaW1wb3J0ZWQgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuICBUaGFua3MgdG8gTWFyY2VsbwoJICAgICBNYXR1cyA8bW1hdHVzQGFjbXMuYXJpem9uYS5lZHU+IGZvciB0aGUgcmVwb3J0IGFuZCB0aGUKCSAgICAgcGF0Y2g7IHRoaXMgY2xvc2VzIFNGIGJ1ZyAjMjMxNjE5OyBzZWUgYWxzbwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2ltcG9ydCouIAoJICAgKiBbR3VpbGVdOiBGaXggY2FzdGluZyBiZXR3ZWVuIGNsYXNzIGFuZCBiYXNlIGNsYXNzOyB0aGUKCSAgICAgcnVudGltZSB0eXBlIHN5c3RlbSBoYWQgaXQgdGhlIHdyb25nIHdheSBhcm91bmQ7IHNlZQoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2Nhc3RzLmkKCSAgICogTWFrZSB0eXBlbWFwcyBmb3IgU1dJR1BPSU5URVIgKiB3aXRoIGFyZyBuYW1lIHRha2UKCSAgICAgcHJlY2VkZW5jZSBvdmVyIHRob3NlIHdpdGhvdXQgYXJnIG5hbWUsIHRvIG1hdGNoIG5vcm1hbAoJICAgICB0eXBlbWFwIHByZWNlZGVuY2UgcnVsZXMuCgkgICAqIEZpeGVkIHRoZSByYW5kb20tbGluZS1udW1iZXJzIHByb2JsZW0gcmVwb3J0ZWQgYXMgU0YgYnVnCgkgICAgICMyMTczMTA7IHRoYW5rcyB0byBNaWNoYWVsIFNjaGFyZiA8c2NoYXJmQHVzZXJzLnNmLm5ldD4uCgkgICAqIFtHdWlsZV06IEhhbmRsZSB0aGUgJW5hbWUgYW5kICVyZW5hbWUgZGlyZWN0aXZlcy4KCSAgICogTmV3IHN5bnRheDogJW5hbWUgYW5kICVyZW5hbWUgbm93IG9wdGlvbmFsbHkgdGFrZSBkb3VibGUKCSAgICAgcXVvdGVzIGFyb3VuZCB0aGUgc2NyaXB0aW5nIG5hbWUuICBUaGlzIGlzIHRvIGFsbG93IHNjcmlwdGluZwoJICAgICBuYW1lcyB0aGF0IGFyZW4ndCB2YWxpZCBDIGlkZW50aWZpZXJzLgoKNi8xNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFkZSBhIG1pbm9yIGNoYW5nZSB0byB0aGUgd2F5IGZpbGVzIGFyZSBsb2FkZWQgaW4KICAgICAgICAgICBvcmRlciB0byBnZXQgZmlsZS9saW5lIG51bWJlciByZXBvcnRpbmcgY29ycmVjdCBpbgogICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IuCgo2LzE0LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgdGhlIChub24tc3RhbmRhcmQpICJsb25nIGxvbmciCgkgICAgIHR5cGVzLiBJdCBpcyB1cCB0byB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIHRvCgkgICAgIHByb3ZpZGUgdHlwZW1hcHMgaWYgbmVlZGVkLiBSZXBvcnRlZCBieSBTYW0gU3RlaW5nb2xkLCBTRgoJICAgICBidWcgIzQyOTE3Ni4KCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgYXJndW1lbnRzIGxpa2UgImNvbnN0IGludCAqCgkgICAgIGNvbnN0IGkiLiBUaGlzIGZpeGVzIFNGIGJ1ZyAjMjE1NjQ5LgoJICAgKiBGaXhlZCB0aGUgR3VpbGUgdGVzdC1zdWl0ZS4KCjYvMTMvMjAwMTogbWtvZXBwZQoJICAgUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsgYXQgdGFnCgkgICAibWtvZXBwZS1tZXJnZS0xIi4gVGhpcyBjb3ZlcnMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgoKfCAwMS8xNi8wMTogdHRuCnwJICAgV3JvdGUgdGFibGUgb2YgY29udGVudHMgZm9yIERvYy9lbmdpbmVlcmluZy5odG1sLiAgQWRkZWQgc2VjdGlvbgp8CSAgIG9uIENWUyB0YWdnaW5nIGNvbnZlbnRpb25zLiAgQWRkZWQgY29weXJpZ2h0IHRvIG90aGVyIGRvY3MuCnwgOS8yNS8wMCA6IGJlYXpsZXkKfCAJICAgTW9kaWZpZWQgdGhlIHByZXByb2Nlc3NvciBzbyB0aGF0IG1hY3JvIG5hbWVzIGNhbiBzdGFydCB3aXRoIGEgJyUnLgp8IAkgICBUaGlzIG1heSBhbGxvdyBuZXcgU1dJRyAiZGlyZWN0aXZlcyIgdG8gYmUgZGVmaW5lZCBhcyBtYWNyb3MgaW5zdGVhZAp8IAkgICBvZiBoYXZpbmcgdG8gYmUgaGFyZC1jb2RlZCBpbnRvIHRoZSBwYXJzZXIuICAKfAp8ICoqKiBBbHNvIGEgeWV0LXRvLWJlLWRvY3VtZW50ZWQgcXVvdGluZyBtZWNoYW5pc20gd2l0aCBiYWNrcXVvdGVzCnwgKioqIGhhcyBiZWVuIGltcGxlbWVudGVkPwoKNi8xMy8yMDAxOiBta29lcHBlCgkgKiBXaGVuIGNvbmZpZ3VyZSBkb2VzIG5vdCBmaW5kIGEgbGFuZ3VhZ2UsIGRvbid0IHVzZSBkZWZhdWx0CgkgICBwYXRocyBsaWtlIC91c3IvbG9jYWwvaW5jbHVkZTsgdGhpcyBvbmx5IGNhdXNlcyBidWlsZAoJICAgcHJvYmxlbXMuCgkgKiBOZXcgZGlyZWN0b3J5OiBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlLCB3aGVyZSBhIGZldwoJICAgYnVncyBpbiAxLjNhNSBhcmUgZGVtb25zdHJhdGVkLiAKCSAqIEhhbmRsZSBDKysgbWV0aG9kcyB0aGF0IGhhdmUgYm90aCBhICJjb25zdCIgYW5kIGEgInRocm93IgoJICAgZGlyZWN0aXZlIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9jcGx1c3BsdXMtdGhyb3cuaSk7IAoJICAgdGhhbmtzIHRvIFNjb3R0IEIuIERydW1tb25kcyBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlIGZpeC4gCgkgKiBIYW5kbGUgQysrIHBvaW50ZXItcmVmZXJlbmNlIGFyZ3VtZW50cyAobGlrZSAiaW50IComIGFyZyIpIAoJICAgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL3BvaW50ZXItcmVmZXJlbmNlLmksCgkgICByZXBvcnRlZCBhcyBTRiBidWcgIzQzMjIyNCkuCgkgKiBbUnVieV0gRml4ZWQgdHlwbyBpbiBydWJ5ZGVjLnN3ZzsgdGhhbmtzIHRvIEx5bGUgSm9obnNvbiEKCSAqIERvbid0IHN0b3AgdGVzdGluZyB3aGVuIG9uZSB0ZXN0IGZhaWxzLgoJICogW0d1aWxlLCBNelNjaGVtZV0gRG9uJ3QgcHJpbnQgIkdlbmVyYXRpbmcgd3JhcHBlcnMuLi4iLgoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFZFQ1RPUkxFTklOUFVUIGFuZCBMSVNUTEVOSU5QVVQgbm93IGhhdmUgc2VwYXJhdGUKCSAgIGxpc3QgbGVuZ3RoIHZhcmlhYmxlcy4gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVAoJICAgYXR0YWNoZXMgYXJndW1lbnQgZG9jdW1lbnRhdGlvbiBpbnZvbHZpbmcgU0NNX1RZUEUgdG8gdGhlCgkgICBzdGFuZGFyZCBwb2ludGVyIHR5cGVtYXBzLiBJTk9VVCBpcyBub3cgYW4gYWxpYXMgZm9yIEJPVEguCgo2LzEyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgU29tZSBKYXZhIGRvY3VtZW50YXRpb24gYWRkZWQuCgkgICBbSmF2YV0gRml4ZWQgYnVncyBpbiBpbXBvcnQgcHJhZ21hIGFuZCBzaGFkb3cgcHJhZ21hLiAKCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgRml4IGRlY2xhcmF0aW9ucyBvZiBTV0lHX2RlZmluZV9jbGFzcwoJICAgKExpYi9ydWJ5L3J1YnlkZWMuc3dnKSBhbmQgU1dJR19UeXBlUXVlcnkKCSAgIChMaWIvY29tbW9uLnN3ZykuIFRoYW5rcyB0byBMeWxlIEpvaG5zb24KCSAgIDxsam9obnNvbkByZXNnZW4uY29tPiBmb3IgdGhlIHBhdGNoZXMuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVXNlIGxvbmcgaW5zdGVhZCBvZiBzY21fYml0c190OyB0aGlzIG1ha2VzIHRoZQoJICAgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBjb21wYXRpYmxlIHdpdGggR3VpbGUgMS4zLjQKCSAgIGFnYWluLiBUaGFua3MgdG8gTWFzYWtpIEZ1a3VzaGltYSBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCgo2LzExLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgVGhlIGdlbmVyaWMgSU5TVEFMTCBmaWxlIGZyb20gYXV0b2NvbmYgYWRkZWQuIEZldyBjaGFuZ2VzIHRvIFJFQURNRSBmaWxlLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBGaXhlZCB0eXBvIGluIE1ha2VmaWxlLmluOyB0aGFua3MgdG8gR3JlZyBUcm94ZWwKCSAgIDxnZHRAaXIuYmJuLmNvbT4uIAoKNi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIG1ha2UgY2hlY2sgd29ya3MgYWdhaW4uIEV4YW1wbGVzL0dJRlBsb3QgY29uZmlndXJlIGdlbmVyYXRlZCBieQoJICAgdG9wIGxldmVsIGF1dG9jb25mIG5vdy4KCjYvMDgvMjAwMTogbWtvZXBwZQoJICAgQW5vdGhlciBidWlsZCBjaGFuZ2U6IFRoZSBuZXcgc2NyaXB0IGF1dG9nZW4uc2ggcnVucwoJICAgYXV0b2NvbmYgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzLiAgVGhlIHRvcC1sZXZlbAoJICAgY29uZmlndXJlIGFsc28gY29uZmlndXJlcyBpbiBFeGFtcGxlcy9HSUZQbG90LgoKNi8wNy8yMDAxOiBta29lcHBlCgkgICBNYWRlIHRoZSBNYWtlZmlsZSB3b3JrIHdpdGggbm9uLUdOVSBtYWtlIGFnYWluLgoKNi8wNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBDbGFzcy9zdHJ1Y3QgbWVtYmVycyB0aGF0IGFyZSBhcnJheXMgb2YgcG9pbnRlcnMgdG8gY2xhc3Nlcy9zdHJ1Y3RzIC0KCSAgIFNoYWRvdyBjbGFzcydzIGdldC9zZXQgYWNjZXNzb3JzIG5vdyB1c2UgSmF2YSBjbGFzc2VzIGluc3RlYWQgb2YgbG9uZ3MgKHBvaW50ZXJzKS4KCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyB3aWxsIG5vdyBjbGVhbiB1cCBtZW1vcnkgaWYgZnVuY3Rpb24gcmV0dXJuIHR5cGUgCgkgICBpcyBhIGNsYXNzL3N0cnVjdC4KCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzLgoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBOZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggYWxsb3dzIGZvcgoJICAgYXR0YWNoaW5nIGEgc3VmZml4IHRvIHRoZSBzd2lnIGJpbmFyeSBhbmQgdGhlIHN3aWcgcnVudGltZQoJICAgbGlicmFyaWVzLiAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgInN3aWcKCSAgIC1zd2lnbGliIiB3b3JrcyBhZ2Fpbi4gIElmIGludm9rZWQgd2l0aCB0aGUgbmV3IG9wdGlvbgoJICAgIi1sZGZsYWdzIiwgU1dJRyBwcmludHMgYSBsaW5lIG9mIGxpbmtlciBmbGFncyBuZWVkZWQgdG8KCSAgIGxpbmsgd2l0aCB0aGUgcnVudGltZSBsaWJyYXJ5IG9mIHRoZSBzZWxlY3RlZCBsYW5ndWFnZQoJICAgbW9kdWxlLiAKCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBnc3dpZ19saXN0X3AgaXMgYW4gaW50LCBub3QgYSBTQ00uICBUaGlzIHR5cG8KCSAgIGNhdXNlZCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiBJbiBJTlBVVCBhbmQgQk9USCB0eXBlbWFwcwoJICAgZ2VuZXJhdGVkIGJ5IHRoZSBTSU1QTEVfTUFQIG1hY3JvLCB1c2UgdGhlIFNDTV9UT19DCgkgICBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gR3VpbGUgdG8gQyAocmF0aGVyIHRoYW4gQ19UT19TQ00pLgoJICAgVXNlIHNjbV9pbnRwcmludCB0byBwcmludCBwb2ludGVycyAocmF0aGVyIHRoYW4KCSAgIHNwcmludGYpLiBBbGxvdyB1c2luZyAiLWxpbmthZ2UiIGluc3RlYWQgb2YgIi1MaW5rYWdlIi4gCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIE1vZHMgZm9yIHVzaW5nIGluaGVyaXRlZCBjKysgY2xhc3NlcyBmcm9tIEphdmEKCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgY2xhc3MgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gZGVzdHJ1Y3RvciAoX2RlbGV0ZSgpKSB3YXMgbm90IGF3YXJlIG9mICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIG5vdCBrbm93IGFib3V0ICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIGV4dGVuZCBldmVuIHdoZW4gdGhlIGJhc2VjbGFzcyB3YXMgbm90IGtub3duIHRvIHN3aWcKCSAgIFtKYXZhXSBzb21ldGltZXMgZW51bS1kZWNsYXJhdGlvbnMgb2NjdXJyZWQgYmVmb3JlIHRoZSBKYXZhIGNsYXNzIGRlY2xhcmF0aW9uCgkgICBbSmF2YV0gdW5yZWxhdGVkIGVudW0gaW5pdGlhbGlzYXRpb25zIG5vIGxvbmdlciBhcHBlYXIgaW4gSmF2YSBjbGFzcwoJICAgW0phdmFdIGlmIG1vZHVsZSBlbmRzIGluICdfJyBjb3JyZWN0IEpOSSBuYW1lcyBhcmUgbm93IHByb2R1Y2VkCgo2LzA0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBtb2RzIC0gTW9kaWZpZWQgY29uc3RydWN0b3IgcmVwbGFjZXMKCSAgIG5ld0luc3RhbmNlKCkuIF9kZWxldGUoKSBub3cgdGhyZWFkIHNhZmUuIGdldENQdHIoKSByZXBsYWNlcwoJICAgX3NlbGYuIF9zZWxmQ2xhc3MoKSByZW1vdmVkIGFzIG5vdyByZWR1bmRhbnQuIAogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCSAgIFtKYXZhXSBOb3QgYWxsIG91dHB1dCBqYXZhIGZpbGVzIGhhZCBTV0lHIGJhbm5lci4gTmV3IGJhbm5lci4KCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIGZpbmFsaXplcnMgYXJlIG91dHB1dCBieSBkZWZhdWx0OiBDb21tYW5kCgkgICBsaW5lIG9wdGlvbiAtZmluYWxpemUgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCAtbm9maW5hbGl6ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBDYXN0IFNDTV9DQVIoKSB0byBzY21fYml0c190IGJlZm9yZSBzaGlmdGluZyBpdC4KCSAgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiAgCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIGNvbmZpZ3VyZSBvcHRpb24gIi0td2l0aC1zd2lnbGliZGlyIi4KCjUvMzEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBTdXBwb3J0IG11bHRpcGxlIHBhcmFsbGVsIGxpc3RzIG9yIHZlY3RvcnMgaW4KCSAgIHRoZSB0eXBlbWFwcyBwcm92aWRlZCBieSBsaXN0LXZlY3Rvci5pLiAgTmV3IHR5cGVtYXBzIGZpbGUsCgkgICBwb2ludGVyLWluLW91dC5pLiAKCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gSFRNTCB1cGRhdGUgZm9yIGV4YW1wbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICBBZGRlZCBzdWJkaXJlY3RvcnkgZm9yCgkgICBEZWJpYW4gcGFja2FnZSBjb250cm9sIGZpbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEJ1aWxkIGEgcnVudGltZSBsaWJyYXJ5LCBsaWJzd2lnZ3VpbGUuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9uICQqZGVzY3JpcHRvci4gIFVzZSB0aGUge30KCSAgIHN5bnRheCwgcmF0aGVyIHRoYW4gdGhlICIiIHN5bnRheCBmb3IgdGhlIHN0YW5kYXJkCgkgICB0eXBlbWFwcywgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgc3RyYW5nZSBtYWNyby1leHBhbnNpb24KCSAgIGJlaGF2aW9yIG9mIHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIFRoaXMgaW50cm9kdWNlcyBzb21lCgkgICBleHRyYSBicmFjZXMuCgo1LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHBvaW50ZXIgdHlwZXMgd2l0aCB0eXBlbWFwcywgcmF0aGVyIHRoYW4KCSAgIGhhcmQtY29kZWQuIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMgJGRlc2NyaXB0b3IsCgkgICAkYmFzZWRlc2NyaXB0b3I7IHNlZSBkb2N1bWVudGF0aW9uLiBTb21lIGNsZWFuLXVwIGluIHRoZQoJICAgdmFyaWFibGUvY29uc3RhbnRzIHdyYXBwZXIgZ2VuZXJhdG9yIGNvZGUuICBOZXcgY29udmVuaWVuY2UKCSAgIG1hY3JvIFNXSUdfR3VpbGVfTXVzdEdldFB0ciwgd2hpY2ggYWxsb3dzIGdldHRpbmcgcG9pbnRlcnMKCSAgIGZyb20gc21vYnMgaW4gYSBmdW5jdGlvbmFsIHN0eWxlLiAgTmV3IHR5cGVtYXAgZmlsZQoJICAgImxpc3QtdmVjdG9yLmkiLCBwcm92aWRpbmcgbWFjcm9zIHRoYXQgZGVmaW5lIHR5cGVtYXBzIGZvcgoJICAgY29udmVydGluZyBiZXR3ZWVuIEMgYXJyYXlzIGFuZCBTY2hlbWUgbGlzdHMgYW5kIHZlY3RvcnMuCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNUTCBzdHJpbmcgbW92ZWQgaW50byBpdHMgb3duIHR5cGVtYXAgYXMgaXQgaXMgYysrIGNvZGUgYW5kIAoJICAgaXQgYnJlYWsgYW55IGMgY29kZSB1c2luZyB0aGUgdHlwZW1hcHMuaSBmaWxlLgoJICAgLSBGaXhlcyBmb3Igd3JhcHBlcnMgYXJvdW5kIGdsb2JhbCB2YXJpYWJsZXMgLSBhcHBsaWVzIHRvIHByaW1pdGl2ZSAKCSAgIHR5cGVzIGFuZCB1c2VyIHR5cGVzIChjbGFzcy9zdHJ1Y3QpIGFuZCBwb2ludGVycyB0byB0aGVzZS4KCSAgIC0gU3RydWN0dXJlIG1lbWJlciB2YXJpYWJsZXMgYW5kIGNsYXNzIHB1YmxpYyBtZW1iZXIgdmFyaWFibGVzIGdldHRlcnMgCgkgICBhbmQgc2V0dGVycyBwYXNzIGEgcG9pbnRlciB0byB0aGUgbWVtYmVyIGFzIHdhcyBpbiAxLjNhMyBhbmQgMS4xIAoJICAgKDEuM2E1IHdhcyBwYXNzaW5nIGJ5IHZhbHVlKQoJICAgLSBQYXJhbWV0ZXJzIHRoYXQgd2VyZSBhcnJheXMgYW5kIHJldHVybiB0eXBlcyB3ZXJlIGluY29ycmVjdGx5IAoJICAgYmVpbmcgcGFzc2VkIHRvIGNyZWF0ZV9mdW5jdGlvbigpIGFzIHBvaW50ZXJzLgoJICAgLSBGaXggZm9yIGFycmF5cyBvZiBlbnVtcy4gCgkgICBbSmF2YV0gVXBkYXRlZCBqYXZhIGV4YW1wbGVzIGFuZCBhZGRlZCB0d28gbW9yZS4KCSAgIFtKYXZhXSBKYXZhIG1vZHVsZSB1cGRhdGVkIGZyb20gU1dJRzEuM2EzIGluY2x1ZGluZyBjb2RlIGNsZWFudXAgZXRjLgoJICAgW0phdmFdIGVudW0gc3VwcG9ydCBhZGRlZC4KCSAgIFtKYXZhXSBBcnJheSBzdXBwb3J0IGltcGxlbWVudGVkCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgaW1wcm92ZWQgLSBKYXZhIG9iamVjdHMgdXNlZCByYXRoZXIgdGhhbiAKCSAgIGxvbmdzIGhvbGRpbmcgdGhlIGMgcG9pbnRlciB0byB0aGUgd3JhcHBlZCBzdHJ1Y3R1cmUvYysrY2xhc3MKCjUvMjIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBpbiBDKysgbW9kZS4gVGhhbmtzCgkgICB0byBHcmVnIFRyb3hlbCA8Z2R0QGlyLmJibi5jb20+LgoKNS8yMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyBsaW5rYWdlICJtb2R1bGUiIGZvciBjcmVhdGluZyBHdWlsZSBtb2R1bGVzIGZvcgoJICAgR3VpbGUgdmVyc2lvbnMgPj0gMS41LjAuIAoKNC8xOC8yMDAxOiBta29lcHBlCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBwYXNzaW5nIHRocm91Z2ggU2NoZW1lX09iamVjdAoJICAgcG9pbnRlcnMuIAoKNC85LzIwMDEgOiBta29lcHBlIAoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgYGJvb2wnLiAgSW5jbHVzaW9uIG9mIGhlYWRlcnMKCSAgIGFuZCBzdXBwb3J0IHJvdXRpbmVzIGlzIG5vdyBkYXRhLWRyaXZlbiB2aWEgbXpzY2hlbWUuaS4KCSAgIEhlYWRlcnMgY29tZSBmcm9tIHRoZSBuZXcgZmlsZSBtenNjaGVtZGVjLnN3Zy4gIERvbid0IGFib3J0CgkgICBpbW1lZGlhdGVseSB3aGVuIGEgdHlwZS1oYW5kbGluZyBlcnJvciBpcyByZXBvcnRlZC4gIFdoZW4KCSAgIHNlYXJjaGluZyBmb3IgdHlwZW1hcHMgZm9yIGVudW1zLCBmYWxsIGJhY2sgdG8gdXNpbmcgaW50LAoJICAgbGlrZSB0aGUgR3VpbGUgYmFja2VuZCBkb2VzLiAgU3VwcG9ydCBjaGFyIGNvbnN0YW50cy4gIEVtaXQKCSAgIGNvcnJlY3Qgd3JhcHBlciBjb2RlIGZvciB2YXJpYWJsZXMuCgozLzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKipPVVRQVVQsIGNoYXIgKipCT1RILgoKMy8yLzIwMDEgOiBta29lcHBlIAoJICAgW0d1aWxlXSBFdmVyeSB3cmFwcGVyIGZ1bmN0aW9uIG5vdyBnZXRzIGEgYm9vbGVhbiB2YXJpYWJsZQoJICAgZ3N3aWdfbGlzdF9wIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlIHZhbHVlcyBhcmUKCSAgIHByZXNlbnQuIFRoZSBtYWNyb3MgR1VJTEVfQVBQRU5EX1JFU1VMVCwgR1VJTEVfTUFZQkVfVkFMVUVTCgkgICBhbmQgR1VJTEVfTUFZQkVfVkVDVE9SIHVzZSB0aGlzIHZhcmlhYmxlLCByYXRoZXIgdGhhbgoJICAgY2hlY2tpbmcgd2hldGhlciB0aGUgY3VycmVudCByZXR1cm4gdmFsdWUgaXMgYSBsaXN0LiBUaGlzCgkgICBhbGxvd3MgZm9yIHR5cGVtYXBzIHJldHVybmluZyBhIGxpc3QgYXMgYSBzaW5nbGUgdmFsdWUgKGEKCSAgIGxpc3Qgd2FzIGVycm9uZW91c2x5IGNvbnZlcnRlZCBpbnRvIGEgdmVjdG9yIG9yIGEKCSAgIG11bHRpcGxlLXZhbHVlIG9iamVjdCBpbiB0aGlzIGNhc2UpLgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIHJldHVybmluZyBtdWx0aXBsZSB2YWx1ZXMgYXMKCSAgIHZlY3RvcnMsIG9yIHBhc3NpbmcgdGhlbSB0byBhIG11bGlwbGUtdmFsdWUKCSAgIGNvbnRpbnVhdGlvbi4gQnkgZGVmYXVsdCwgbXVsdGlwbGUgdmFsdWVzIHN0aWxsIGdldAoJICAgcmV0dXJuZWQgYXMgYSBsaXN0LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIGEgImJlZm9yZXJldHVybiIgcHJhZ21hLiBUaGUgdmFsdWUgb2YgdGhpcwoJICAgcHJhZ21hIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IHJldHVybiBzdGF0ZW1lbnQuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgR3VpbGUgMS40LjEgcHJvY2VkdXJlCgkgICBkb2N1bWVudGF0aW9uIGZvcm1hdHMsIHNlZSBpbnRlcm5hbHMuaHRtbC4KCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBNYWRlIHRoZSB3cmFwcGVyIGNvZGUgY29tcGlsZSB3aXRoIEMrKyBpZiB0aGUKCSAgICItYysrIiBjb21tYW5kLWxpbmUgc3dpdGNoIGlzIGdpdmVuLiAgVGhhbmtzIHRvCgkgICA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5vdyB0d28gdHlwZSB0YWJsZXMsIHN3aWdfdHlwZXMgYW5kCgkgICBzd2lnX3R5cGVzX2luaXRpYWwsIGFyZSB1c2VkLCBhcyBhbGwgb3RoZXIgU1dJRyBsYW5ndWFnZQoJICAgbW9kdWxlcyBkby4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgdGhlIHRyaWNreQoJICAgY29uc3RydWN0aW9uIHVzZWQgYmVmb3JlIHRoYXQgdGhlIGJyb2tlbiBSZWRoYXQgNy4wIGdjYwoJICAgZG9lc24ndCBwYXJzZS4gUmVwb3J0ZWQgYnkgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqT1VUUFVULCBjaGFyICpCT1RIOyBhIGJhZAoJICAgZnJlZSgpIHdvdWxkIGJlIGVtaXR0ZWQuICBBZGRlZCB0eXBlbWFwIGZvciBTQ00uCgoKVmVyc2lvbiAxLjMgQWxwaGEgNSAKPT09PT09PT09PT09PT09PT09PQoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFtQeXRob25dIFB5dGhvbiBtb2R1bGUgZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUgZm9yCiAgICAgICAgICBjcmVhdGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgd3JhcHBlciBmdW5jdGlvbi4gTW9kaWZpY2F0aW9uCiAgICAgICAgICBzdWdnZXN0ZWQgYnkgSm9uIFRyYXZpcy4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBMaWJyYXJ5IGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZSAtbCBvcHRpb24gYXJlIG5vdyBpbmNsdWRlZCBhdCB0aGUKICAgICAgICAgIGVuZCBvZiB0aGUgaW50ZXJmYWNlIGZpbGUgKHJldmVydGluZyB0byB0aGUgb2xkIGJlaGF2aW9yKS4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggZW51bSBoYW5kbGluZy4gIGVudW1zIGFyZSBub3cgbWFuaXB1bGF0ZWQgYXMKICAgICAgICAgICdpbnQnLCBidXQgY2FzdCBpbnRvIHRoZSBlbnVtIHR5cGUgd2hlbiB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgCiAgICAgICAgICBjb3JyZXNwb25kaW5nIEMgZnVuY3Rpb24uCgo5LzE5LzAwIDogbWtvZXBwZQoJICBbR3VpbGVdIFJlbW92ZWQgIi13aXRoLXNtb2JzIiBjb21tYW5kLWxpbmUgb3B0aW9uLCBhcyB0aGlzIGlzIHRoZQoJICBkZWZhdWx0IG5vdy4gIEFkZGVkICItZW1pdC1zZXR0ZXJzIiBjb21tYW5kLWxpbmUgb3B0aW9uLAoJICB3aGljaCB0dXJucyBvbiBnZW5lcmF0aW5nIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzOyBzZWUKCSAgaW50ZXJuYWxzLmh0bWwuCgo5LzE4LzAwIDogbWtvZXBwZQoJICBJbmNvcnBvcmF0ZWQgcGF0Y2ggIzEwMTQzMCwgZml4aW5nIGJ1Z3MgaW4gdGhlIEd1aWxlIG1vZHVsZTogCgkgIDEuIFNvbWUgYXJndW1lbnRzIHdlcmUgZXJyb25lb3VzbHkgdGFrZW4gYXMgKm9wdGlvbmFsKiBhcmd1bWVudHMgd2hlbgoJICAgICBpZ25vcmVkIGFyZ3VtZW50cyB3ZXJlIHByZXNlbnQuIAoJICAyLiBHdWlsZSAxLjMuNCB3YXMgbm90IHN1cHBvcnRlZCBzaW5jZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiBHdWlsZQoJICAgICAgMS40IHdlcmUgdXNlZC4JICAKCSAgMy4gQWRkZWQgaGFuZGxpbmcgb2YgYGNvbnN0IGNoYXIgKicuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZhaWxlZCBhc3NlcnRpb24gYW5kIGxhcmdlIGZpbGVzLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0aGUgJyUnIGNoYXJhY3RlciBhcHBlYXJpbmcgaW4gYWRkZWQgbWV0aG9kcwogICAgICAgICAgYW5kIGZ1bmN0aW9uIGJvZGllcy4gIFByZXByb2Nlc3NvciBidWcuCgpWZXJzaW9uIDEuMyBBbHBoYSA0IChTZXB0ZW1iZXIgNCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzMvMDAgIDogdHRuCiAgICAgICAgICBBZGRlZCBpbnN0cnVjdGlvbnMgZm9yIG1haW50YWluZXJzIGluIEV4YW1wbGVzL1JFQURNRSBvbiBob3cKICAgICAgICAgIHRvIG1ha2UgZXhhbXBsZXMgYWxzbyBiZSB1c2VmdWwgaW4gdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICAgQWxzbywgIm1ha2UgY2hlY2siIG5vdyB1c2VzIC4vTGliIGJ5IHZpYSBlbnYgdmFyIGBTV0lHX0xJQicuCiAgICAgICAgICBUaGlzIGlzIG92ZXJyaWRhYmxlIGxpa2Ugc286CiAgICAgICAgICAgICBtYWtlIGNoay1zd2lnbGliPS9teS9leHBlcmltZW50YWwvc3dpZy9MaWIgY2hlY2sKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAkdHlwZW1hcCB2YXJpYWJsZSB0byB0eXBlbWFwcy4gIFRoaXMgZ2V0cyByZXBsYWNlZCB3aXRoCiAgICAgICAgICBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlbWFwIHRoYXQgaXMgYXBwbGllZC4gIEZlYXR1cmUKICAgICAgICAgIHJlcXVlc3QgZnJvbSByc2Fsei4KCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBFeHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdmlydHVhbAogICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIHR3byBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgQSgpIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNsYXNzIEIoKSA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgU3dpZyBub3cgd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGlzCgogICAgICAgICAgICAgICAgQV9mb28oQSAqYSkgewogICAgICAgICAgICAgICAgICAgIGEtPmZvbygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGFuZCB1c2UgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGJvdGggQV9mb28oKSBhbmQgQl9mb28oKS4KICAgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgaWYgYm90aCBtZXRob2RzIGFyZSBkZWNsYXJlZAogICAgICAgICAgYXMgdmlydHVhbCBhbmQgYm90aCB0YWtlIGlkZW50aWNhbCBwYXJhbWV0ZXJzLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlc3RvcmVkIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAgZm9yIHNldHRpbmcgc3RydWN0dXJlIG1lbWJlcnMuCiAgICAgICAgICBVbmxpa2UgdGhlIG9sZCB2ZXJzaW9uLCB0aGUgbmV3IHZlcnNpb24gaXMgZXhwYW5kZWQgaW5saW5lIGluIHRoZQogICAgICAgICAgd3JhcHBlciBmdW5jdGlvbiBhbGxvd2luZyBhY2Nlc3MgdG8gc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBpbnRlcm5hbHMgKGEgc29tZXRpbWVzIHJlcXVlc3RlZCBmZWF0dXJlKS4gVGhlICJtZW1iZXJvdXQiIHR5cGVtYXAKICAgICAgICAgIGlzIGdvbmUuIFVzZSB0aGUgIm91dCIgdHlwZW1hcHMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBzZXQgbWV0aG9kcyBubyBsb25nZXIgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIG1lbWJlci4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBub3cgZ2V0cyBzZXQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgdm9pZCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgIGYtPnggPSB4OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiBTV0lHMS4xIGl0IHVzZWQgdG8gYmUgdGhpczoKCiAgICAgICAgICAgICAgaW50IEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYtPnggPSB4KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGR1ZSB0byB0aGUgY29tcGxleGl0eSBjcmVhdGVkIGJ5IHRyeWluZwogICAgICAgICAgdG8gZG8gdGhpcyB3aXRoIG1vcmUgZXhvdGljIGRhdGF0eXBlcyBzdWNoIGFzIGFycmF5cy4gIEl0IGFsc28KICAgICAgICAgIGNvbXBsaWNhdGVzIGlubGluaW5nIGFuZCBoYW5kbGluZyBvZiB0aGUgIm1lbWJlcmluIiB0eXBlbWFwLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgcHRyY2FzdCgpIGFuZCBwdHJtYXAoKSBmdW5jdGlvbnMgZnJvbSB0aGUKICAgICAgICAgIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBPbGQgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG5ldyB0eXBlIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKm5hbWUpIGFkZGVkLgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHRoZSB0eXBlIGluZm8gc3RydWN0dXJlCiAgICAgICAgICB0aGF0IGlzIHVzZWQgZm9yIHR5cGUtY2hlY2tpbmcuICBJdCB3b3JrcyB3aXRoIGVpdGhlciB0aGUKICAgICAgICAgIG5pY2UgQyBuYW1lIG9yIG1hbmdsZWQgdmVyc2lvbiBvZiBhIGRhdGF0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJpbnQgKiIpOwogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJfcF9pbnQiKTsKCiAgICAgICAgICBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IHNvbWUKICAgICAgICAgIGV4b3RpYyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZQogICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlIG9iamVjdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IGRpcmVjdGl2ZSAldHlwZXMoKSBhZGRlZC4gIFRoaXMgaXMgdXNlZCB0bwogICAgICAgICAgZXhwbGljaXRseSBsaXN0IGRhdGF0eXBlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZS1jaGVja2luZyBjb2RlLiBOb3JtYWxseSBpdCBpcyBuZXZlcgogICAgICAgICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGJ1dCBzb21ldGltZXMgYWR2YW5jZWQgZXh0ZW5zaW9ucwogICAgICAgICAgKHN1Y2ggYXMgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5KSBtYXkgbmVlZCB0byBtYW51YWxseQogICAgICAgICAgYWRkIHR5cGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzAwIDogYmVhemxleQogICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygc3RyaW5nIGFycmF5IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCiAgICAgICAgICBhIGdsb2JhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSAiY2hhciBuYW1lWzY0XSIgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgbWFuYWdlZCBhcyBhIDY0IGNoYXJhY3RlciBzdHJpbmcuICBQcmV2aW91c2x5IHRoaXMgZGlkbid0CiAgICAgICAgICB3b3JrIGF0IGFsbCBvciByZXF1aXJlZCB0aGUgdXNlIG9mIGEgc3BlY2lhbCB0eXBlbWFwLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFIChUY2wsIFBlcmwsIFB5dGhvbikgKioqCgo4LzMxLzAwIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCBgY2hlY2stYysrLWV4YW1wbGVzJywgd2hpY2ggdXNlcyBuZXcKCSAgZmlsZXMgdW5kZXIgRXhhbXBsZXMvQysrIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuICBOb3cgIm1ha2UKCSAgY2hlY2siIGFsc28gZG9lcyAibWFrZSBjaGVjay1jKystZXhhbXBsZXMiLiAgQWxzbywgZXhwYW5kZWQKCSAgYWN0aW9ucyBpbiBgY2hlY2stZ2lmcGxvdC1leGFtcGxlJyBhbmQgYGNoZWNrLWFsaXZlbmVzcycuCgo4LzMwLzAwIDogbWtvZXBwZQoJICBNYWpvciBjbGVhbi11cCBpbiB0aGUgR3VpbGUgbW9kdWxlLiBBZGRlZCB0eXBlbWFwLWRyaXZlbgoJICBkb2N1bWVudGF0aW9uIHN5c3RlbS4gQ2hhbmdlZCB0byBoYW5kbGUgbW9yZSB0aGFuIDEwCgkgIGFyZ3MuIFVwZGF0ZWQgYW5kIGV4dGVuZGVkIGV4YW1wbGVzLgoJICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVpbnNlcnQgZGlyZWN0aXZlIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBpbnRvIGEgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IHdyYXBwZXIgZmlsZS4gIFRoaXMgaXMgb25seSBpbnRlbmRlZAogICAgICAgICAgZm9yIHVzZSBieSB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXb3JrcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXJzKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChydW50aW1lKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydCh3cmFwcGVycykgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChpbml0KSAgICAgImZpbGUuc3dnIjsKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVydW50aW1lIGRpcmVjdGl2ZSB3aGljaCBpbmNsdWRlcyBjb2RlIGludG8gdGhlIHJ1bnRpbWUKICAgICAgICAgIHBvcnRpb24gb2YgdGhlIHdyYXBwZXIgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVydW50aW1lICV7CiAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgaW50ZXJuYWwgcnVudGltZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgVGhlcmUgaXMgbm8gcHJhY3RpY2FsIHJlYXNvbiBmb3Igb3JkaW5hcnkgdXNlcnMgdG8gdXNlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgKGFsbW9zdCBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHVzaW5nICV7IC4uLiAlfQogICAgICAgICAgaW5zdGVhZCkuICAgSG93ZXZlciwgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzIG1heSB3YW50IHRvCiAgICAgICAgICB1c2UgdGhpcyBpbiBsYW5ndWFnZSBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZyBsaXRlcmFscyBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICIkdGFyZ2V0ID0gU3ZJVigkc291cmNlKTsiOwoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWxseSBjb21waWxlIGV4cGVyaW1lbnRhbCBjb2RlIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudAoJICBjb25maWd1cmUgZmxhZy4KCSAgRml4IC5jdnNpZ25vcmUgdG8gaWdub3JlIGNvbmZpZ3VyZSAmIHlhY2MgZ2VuZXJhdGVkIGZpbGVzCgoxLzI4LzAwIDogbG9pYwoJICBBcHBseSBhdXRvbWFrZSBldmVyeXdoZXJlCgkgIEtlZXAgY29uZmlndXJlIHNjcmlwdHMgc28gdGhhdCBwZW9wbGUgYXJlIG5vdCAqZm9yY2VkKiB0byBhdXRvY29uZgogICAgICAgICAgS2VlcCBzb3VyY2VzIGdlbmVyYXRlZCBieSB5YWNjIHNvIHRoYXQgY29tcGlsYXRpb24gd2l0aG91dCB5YWNjCgkgIGlzIHBvc3NpYmxlLgoJICBTb3VyY2UvTFBhcnNlL2NzY2FubmVyLmM6IGNoYW5nZSBseWFjYy5oIGludG8gcGFyc2VyLmggdG8gcGxlYXNlCgkgIGRlZmF1bHQgeWFjYyBnZW5lcmF0aW9uIHJ1bGVzLgoJICBVc2UgQUNfQ09ORklHX1NVQkRJUlMgaW4gY29uZmlndXJlLmluIGluc3RlYWQgb2YgaGFuZCBtYWRlIHNjcmlwdC4KCSAgVXBkYXRlIGFsbCByZWxldmFudCAuY3ZzaWdub3JlIHRvIGluY2x1ZGUgLmRlcHMKCSAgRml4ZWQgbWlzc2luZyA7IGxpbmUgMTM2IFNvdXJjZS9Td2lnL3N3aWcuaAoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1pbm9yIGVuZC1vZi1maWxlIHBhcnNpbmcgcHJvYmxlbXMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWZyZWV6ZSBvcHRpb24gdGhhdCBmb3JjZXMgU1dJRyB0byBmcmVlemUgdXBvbiBleGl0LgogICAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBkZWJ1Z2dpbmcgdG9vbCBzbyB0aGF0IEkgY2FuIG1vcmUKICAgICAgICAgIGVhc2lseSBleGFtaW5lIFNXSUcncyBtZW1vcnkgZm9vdHByaW50LgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIGd1aWxlIG1vZHVsZSBmb3Igc3VwcG9ydGluZyBvcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERpZXRlciBCYXJvbi4KCjEvMTMvMDAgOiBsb2ljCgkgIEFkZGVkIC5jdnNpZ25vcmUsIEV4YW1wbGVzLy5jdnNpZ25vcmUsIFNvdXJjZS9ET0gvRG9oLy5jdnNpZ25vcmUKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IEZpeGVkIC1JIGhhbmRsaW5nIGJ1ZwoJICBTb3VyY2UvTW9kdWxlczEuMS9qYXZhLmN4eDogZml4ZWQgY2hhciogLT4gY29uc3QgY2hhciogd2FybmluZ3MgdGhhdCBhcmUKCSAgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHdpdGggZ2NjLTIuOTUuMgoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogY2FzdCBjb25zdCBjaGFyKiB0byBjaGFyKiBmb3IgU3RyaW5nX3JlcGxhY2UKCSAgdG9rZW4gYW5kIHJlcCBzaG91bGQgcmVhbGx5IGJlIGNvbnN0LgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIEhhcmNvJ3MgSmF2YSBtb2R1bGVzLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJldm9rZWQgdGhlICVpZmRlZiwgJWlmbmRlZiwgJWVuZGlmLCAlaWYsICVlbGlmLCBhbmQgJWVsc2UKICAgICAgICAgIGRpcmVjdGl2ZXMuICBUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBhcyBTV0lHIG5vdyBoYXMgYSByZWFsCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGZyb20gdGhlIFNXSUcgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgTW9kdWxlcyBkaXJlY3RvcnkgKHdoZXJlIHRoZXkgcmVhbGx5IHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgIHRvIGJlZ2luIHdpdGgpLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1zdGF0IG9wdGlvbiBmb3IgcHJpbnRpbmcgc3RhdGlzdGljcy4gVGhlCiAgICAgICAgICBzdGF0aXN0aWNzIHJlcG9ydGluZyB3YXMgaW5hZGVxdWF0ZSBhbmQgbW9zdGx5IGJyb2tlbgogICAgICAgICAgYW55d2F5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXQgb3B0aW9uIGZvciByZWFkaW5nIGEgdHlwZW1hcCBmaWxlLiAgTW9yZQogICAgICAgICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguICBKdXN0IGluY2x1ZGUgdHlwZW1hcHMgYXQgdGhlIHRvcAogICAgICAgICAgb2YgdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgJWNoZWNrb3V0IGRpcmVjdGl2ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1jaSBvcHRpb24gZm9yIGZpbGUgY2hlY2tpbi4gICBUb28gcHJvYmxlbWF0aWMKICAgICAgICAgIHRvIGltcGxlbWVudC4gIFByb2JhYmx5IGJldHRlciB0byBqdXN0IHB1dCB5b3VyIFNXSUcgbGlicmFyeQogICAgICAgICAgdW5kZXIgQ1ZTIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgRGVsZXRlZCB0aGUgTEFURVggbW9kdWxlLiAgU29ycnkuLi4gRGlkbid0IGtub3cgYW55b25lCiAgICAgICAgICB3aG8gd2FzIHVzaW5nIGl0LiAgQmVzaWRlcywgSSdtIGxvb2tpbmcgdG8gc2ltcGxpZnkKICAgICAgICAgIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uIG1vZHVsZSB0byB1c2UgYSAudHh0CiAgICAgICAgICBzdWZmaXggZm9yIGl0cyBvdXRwdXQgZmlsZSBpbnN0ZWFkIG9mIC5kb2MuCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGxvbmctbG9zdCBTV0lHIHByZXByb2Nlc3NvciBiYWNrIHRvIHRoZSBzeXN0ZW0uCiAgICAgICAgICBJdCBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgUmF3IHByZXByb2Nlc3NlZCBvdXRwdXQKICAgICAgICAgIGNhbiBiZSB2aWV3ZWQgdXNpbmcgc3dpZyAtRSBmaWxlLmkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxLzExLzAwIDogYmVhemxleSBhbmQgZGptaXRjaGUKICAgICAgICAgIENvbXBsZXRlbHkgcmVvcmdhbml6ZWQgdGhlIFNXSUcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gIFRoZQogICAgICAgICAgYmFzaWMgb3JnYW5pemF0aW9uIGlzIG5vdzoKCiAgICAgICAgICAgICAgICBTb3VyY2UvICAgICAgICAgU1dJRyBzb3VyY2UgY29kZQogICAgICAgICAgICAgICAgTGliLyAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyAoc3dpZ19saWIpCiAgICAgICAgICAgICAgICBEb2MvICAgICAgICAgICAgRG9jdW1lbnRhdGlvbgogICAgICAgICAgICAgICAgRXhhbXBsZXMvICAgICAgIEV4YW1wbGVzCgogICAgICAgICAgTW9yZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KCjEyLzA4Lzk5OiBMb2ljIERhY2hhcnkgKGxvaWNAc2VuZ2Eub3JnKQoJICBFbmhhbmNlZCBwYWNrYWdlIGhhbmRsaW5nIGZvciBwZXJsNSBhbmQgYysrLgoKCSAgV2l0aCBuZXcgb3B0aW9uIC1oaWRlIEZvbzo6QmFyLCBldmVyeSBwZXJsNSBvYmplY3QgKEZyb2IpIGlzCgkgIHF1YWxpZmllZCBieSBGb286OkJhcjo6RnJvYi4gVGhlIHBhY2thZ2UgbmFtZSBpcyBzb2xlbHkgdXNlZAoJICB0byBlbmNhcHN1bGF0ZSBDL0MrKyB3cmFwcGVycyBvdXRwdXQgaW4gPG1vZHVsZT5fd3JhcC5jIGFuZCB0aGUKCSAgY29ycmVzcG9uZGluZyBwZXJsIHBhY2thZ2UgaW4gPG1vZHVsZT4ucG0uIE5vdGUgdGhhdCBhIHBhY2thZ2UKCSAgbmFtZSBtYXkgY29udGFpbiA6OiAoRnJvYjo6Tml0eikgYW5kIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlCgkgIHBhY2thZ2UgbmFtZSBwcm92aWRlZCBieSAtaGlkZSAoRm9vOjpCYXI6OkZyb2I6Ok5pdHopLgoKCSAgSW4gKl93cmFwLmMsIFNXSUdfaW5pdCBtYWNybyBpcyB1c2VkLiBXYXMgcHJldmlvdXNseSBkZWZpbmVkCgkgIGJ1dCBub3QgdXNlZCBhbmQgc2ltcGxpZmllcyBjb2RlLgoKCSAgQWRkZWQgdHlwZW1hcChwZXJsNSxwZXJsNWluKSBhbmQgdHlwZW1hcChwZXJsNSxwZXJsNW91dCkgdGhhdAoJICBkbyB0aGUgZXF1aXZhbGVudCBvZiB0eXBlbWFwKHBlcmw1LGluKSBhbmQgdHlwZW1hcChwZXJsNSxvdXQpCgkgIGJ1dCBjb250YWluIHBlcmwgY29kZSBhbmQgYXBwbGllcyB0byB3cmFwcGVycyBnZW5lcmF0ZWQgYnkKCSAgLXNoYWRvdy4KCgkgIExhY2tpbmcgcHJvcGVyIHJlZ3Jlc3Npb24gdGVzdHMgSSB1c2VkCgkgIEV4YW1wbGVzL3Blcmw1L3tjKyssY29uc3RyYWludCxkZWZhcmcsZXhjZXB0LAoJICBncmFwaC9ncmFwaFsxMjM0XSxtdWx0aW5oZXJpdCxuZXN0ZWQsc2hhZG93LHNpbXBsZSx0cmVlLAoJICB0eXBlbWFwcy97YXJndixhcmd2MixhcnJheW1lbWJlcixkYXRhYmFzZSxmaWxlLGlnbm9yZSxpbnRlZ2VyLAoJICBvdXRwdXQscGFzc3JlZixyZWZlcmVuY2UscmV0dXJufX0vLiBJIHJhbiBzd2lnIHdpdGggYW5kIHdpdGhvdXQKCSAgdGhlIHBhdGNoZXMsIGRpZmYgdGhlIGdlbmVyYXRlZHNvdXJjZXMsIHJ1biB0aGUgLnBsIGZpbGVzCgkgIGFuZCBjaGVja2VkIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGlkZW50aWNhbC4gSW4gYWxsIHRob3NlIGV4YW1wbGVzCgkgIEkgaGFkIG5vIGVycm9yLgoKMTEvMjEvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHByb3ZpZGUgZnVsbCB2YXJpYWJsZSBsaW5raW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgdG8gYWxsIGRhdGF0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgd2VyZSBjcmVhdGVkIGZvciBkYXRhdHlwZXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIFRjbF9MaW5rVmFyKCkgZnVuY3Rpb24uCiAgICAgICAgICBOb3csIHdlIHNpbXBseSB1c2UgdmFyaWFibGUgdHJhY2VzIHRvIHN1cHBvcnQgZXZlcnl0aGluZy4gVGhpcyBtYXkKICAgICAgICAgIGJyZWFrIHNjcmlwdHMgdGhhdCByZWx5IHVwb24gdGhlIG9sZGVyIGJlaGF2aW9yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS85OTogQWRkZWQgc2xpZ2h0IHR3ZWFrIHRvIHdyYXBwZXIgZ2VuZXJhdG9yIHRvIGNvbGxlY3QgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICBvZiBzaW1pbGFyIHR5cGUuICBQcm9kdWNlcyBzb21ld2hhdCBtb3JlIGNvbXBhY3Qgd3JhcHBlciBjb2RlLgoKMTEvMjAvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHVzZSBTV0lHX0dldEFyZ3MoKSB0byBwYXJzZQogICAgICAgICAgYXJndW1lbnRzLiAgICBUaGlzIGlzIGEgdGVjaG5pcXVlIGJvcnJvd2VkIGZyb20gUHl0aG9uIGluIHdoaWNoCiAgICAgICAgICBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB1c2luZyBhIGZvcm1hdCBzdHJpbmcgY29udmVudGlvbiBzaW1pbGlhcgogICAgICAgICAgdG8gZnByaW50ZigpLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpzdWJzdGFudGlhbCogcmVkdWN0aW9uIGluIHRoZQogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSB3aXRoIG9ubHkgYSBtb2Rlc3QgcnVudGltZSBvdmVyaGVhZAogICAgICAgICAgaW4gZ29pbmcgdGhyb3VnaCB0aGUgZXh0cmEgY29udmVyc2lvbiBmdW5jdGlvbi4KCjExLzEzLzk5OiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIGNsYXNzL3N0cnVjdHVyZSBnZW5lcmF0aW9uIGNvZGUgZm9yIHRoZQogICAgICAgICAgVGNsIG1vZHVsZS4gIE5vdywgYSBzbWFsbCBzZXQgb2YgcnVudGltZSBmdW5jdGlvbnMgYXJlIHVzZWQKICAgICAgICAgIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIGNsYXNzZXMgKGluc3RlYWQgb2YgYQogICAgICAgICAgbWFzc2l2ZSBhbW91bnQgb2YgcnVudGltZSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBmb3IgZWFjaCBjbGFzcykuCiAgICAgICAgICBDbGFzcyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBzaW1wbHkgZW5jb2RlZCBpbiBhIHNlcmllcyBvZgogICAgICAgICAgc3RhdGljIHRhYmxlcy4gICBUaGlzIHJlc3VsdHMgaW4gYSAqSFVHRSogcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS0tZXNwZWNpYWxseSBmb3IgQysrLgoKMTEvMTMvOTk6IFJlbW92ZWQgdGhlIC10Y2wgKFRjbCA3LngpIG1vZHVsZS4gIFRjbCA4LjAgaXMgbm93IHNldmVyYWwKICAgICAgICAgIHllYXJzIG9sZCBhbmQgdGhlIGRlZmFjdG8gc3RhbmRhcmQtLW5vIHJlYWwgcmVhc29uIHRvIGtlZXAKICAgICAgICAgIHN1cHBvcnRpbmcgdGhlIG9sZCB2ZXJzaW9uIGF0IHRoaXMgcG9pbnQuCgoxMS8xMy85OTogQ2xlYW5lZCB1cCAtYyBvcHRpb24gZm9yIFB5dGhvbiBtb2R1bGUuICBUaGUgcHlleHAuc3dnIGZpbGUKICAgICAgICAgIGlzIG5vdyBnb25lLgoKMTEvMTMvOTk6IEZpeGVkIGV4dGVybmFsIGRlY2xhcmF0aW9ucyB0byB3b3JrIGJldHRlciB3aXRoIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvbiBXaW5kb3dzLiAgU3RhdGljIGxpbmtpbmcgc2hvdWxkIG5vdyBiZSBwb3NzaWJsZSBieSBkZWZpbmluZwogICAgICAgICAgdGhlIC1EU1RBVElDX0xJTksgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgQWxiZXJ0byBGb25zZWNhLgoKMTEvNS85OSA6IEZpeGVkIGFuIG9ic2N1cmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyByZWxhdGVkIHRvIHRoZSBnZW5lcmF0aW9uCiAgICAgICAgICBvZiBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gICBCdWcgcmVwb3J0ZWQgYnkgQnJhZCBDbGVtZW50cy4KCjExLzUvOTkgOiBGaXhlZCBhIGZldyBtZW1vcnkgcHJvYmxlbXMgZm91bmQgYnkgcHVyaWZ5LgoKMTEvNS85OSA6IE9mZmljaWFsbHkgZGVwcmVjYXRlZCB0aGUgLWh0Y2wsIC1odGssIGFuZCAtcGx1Z2luIG9wdGlvbnMKICAgICAgICAgIGZyb20gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMTAvMjYvOTk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGZyb20gcHl0aG9uL3R5cGVtYXBzLmkuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgS2VpdGggRGF2aWRzb24uCgo4LzE2Lzk5IDogQWRkZWQgX1dJTjMyIHN5bWJvbCB0byBsaWJyYXJpZXMgdG8gYmV0dGVyIHN1cHBvcnQgV2luZG93cy4KCjgvMTYvOTkgOiBEZXByZWNhdGVkIHRoZSBQZXJsNCBtb2R1bGUuICAgSXQgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHRoZQogICAgICAgICAgZGlzdHJpYnV0aW9uIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLiAgSW4gdGhlIGVudGlyZSAzIHllYXJzIFNXSUcKICAgICAgICAgIGhhcyBiZWVuIGFyb3VuZCBJIG5ldmVyIHJlY2VpdmVkIGEgc2luZ2xlIGNvbW1lbnQgYWJvdXQgaXQgc28gSSdtCiAgICAgICAgICBhc3N1bWluZyBubyBvbmUgd2lsbCBtaXNzIGl0Li4uCgo4LzE2Lzk5IDogTW9kaWZpZWQgdGhlIHR5cGUtY2hlY2tpbmcgY29kZSB0byByZWdpc3RlciB0eXBlIG1hcHBpbmdzIHVzaW5nIGEKICAgICAgICAgIHRhYmxlIGluc3RlYWQgb2YgcmVwZWF0ZWQgY2FsbHMgdG8gU1dJR19SZWdpc3Rlck1hcHBpbmcoKS4gIFRoaXMKICAgICAgICAgIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzb21ld2hhdC4KCjgvMTUvOTkgOiBDbGVhbmVkIHVwIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tpbmcgY29kZSBpbiB0aGUgVGNsIG1vZHVsZS4KCjgvMTUvOTkgOiBNYW55IGNoYW5nZXMgdG8gdGhlIGxpYnJhcmllcyB0byBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzLgoKOC8xMy85OSA6IEVsaW1pbmF0ZWQgQysrIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgZXh0ZXJuICJDIiBsaW5rYWdlLgoKOC8xMy85OSA6IFNvbWUgY2xlYW51cCBvZiBQeXRob24gLnN3ZyBmaWxlcyB0byBiZXR0ZXIgc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgb24gV2luZG93cy4KCjgvMTMvOTkgOiBNb2RpZmllZCB0aGUgJXByYWdtYSBkaXJlY3RpdmUgdG8gYXR0YWNoIHByYWdtYXMgZGVjbGFyZWQgaW5zaWRlCiAgICAgICAgICBhIGNsYXNzIGRlZmluaXRpb24gdG8gdGhlIGNsYXNzIGl0c2VsZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICVwcmFnbWEocHl0aG9uKSBhZGR0b21ldGhvZCA9ICJpbnNlcnQ6cHJpbnQgYGhlbGxvIHdvcmxkJyIKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaG93IHRoaXMgd29ya3MuICBGb3IgcGVvcGxlCiAgICAgICAgICB3cml0aW5nIGJhY2tlbmQgbW9kdWxlcywgY2xhc3MtYmFzZWQgcHJhZ21hcyB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX29wZW5fY2xhc3MoKSAgICAgICAgICAgICAvLyBPcGVuIGEgY2xhc3MKICAgICAgICAgICAgICBsYW5nLT5jcHBfcHJhZ21hKCkgICAgICAgICAgICAgICAgIC8vIFN1cHBseSBwcmFnbWFzCiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IG1lbWJlcnMKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX2Nsb3NlX2NsYXNzKCkgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY2xhc3MKCiAgICAgICAgICBBbGwgb2YgdGhlIHByYWdtYXMgYXJlIHBhc3NlZCBmaXJzdCBzaW5jZSB0aGV5IG1pZ2h0IGJlIHVzZWQgdG8KICAgICAgICAgIGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIG90aGVyIG1lbWJlcnMuICAgUGxlYXNlIHNlZQogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUgZm9yIGFuIGV4YW1wbGUuICAgUGF0Y2hlcyBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTMvOTkgOiBQYXRjaCB0byBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gZWxpbWluYXRlIGlnbm9yZWQKICAgICAgICAgIGV4Y2VwdGlvbiBlcnJvcnMgaW4gZGVzdHJ1Y3RvcnMuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTEvOTkgOiBNaW5vciBwYXRjaCB0byBzd2lnX2xpYi9weXRob24vc3dpZ3B0ci5zd2cgIChhZGRlZCBTV0lHU1RBVElDCiAgICAgICAgICBkZWNsYXJhdGlvbikuICBQYXRjaCBjb250cmlidXRlZCBieSBMeWxlIEpvaG5zb24uCgo4LzExLzk5IDogQWRkZWQgRklSU1RLRVkvTkVYVEtFWSBtZXRob2RzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgo4LzExLzk5IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIHJldHVybmVkCiAgICAgICAgICBhbmQgcGFzc2VkIGFzICdOb25lLicgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuCgo4LzEwLzk5IDogRml4ZWQgbWlzc2luZyAnaW50JyBzcGVjaWZpZXJzIGluIHZhcmlvdXMgcGxhY2VzLgoKOC8xMC85OSA6IEFkZGVkIFdpbmRvd3MgbWFrZWZpbGUgZm9yIFJ1bnRpbWUgbGlicmFyaWVzLiAgQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEJvYiBUZWNoZW50aW4uCgo4LzEwLzk5IDogRml4ZWQgbWlub3IgcHJvYmxlbSBpbiBQeXRob24gcnVudGltZSBtYWtlZmlsZSBpbnRyb2R1Y2VkCiAgICAgICAgICBieSBrZXl3b3JkIGFyZ3VtZW50cy4KCjgvOC85OSAgOiBDaGFuZ2VkICR0YXJnZXQgb2YgcGVybDUob3V0KSB0eXBlbWFwIGZyb20gU1QoMCkgdG8KICAgICAgICAgIFNUKGFyZ3ZpKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogRml4ZWQgYnVnIGluIHR5cGVtYXAgY2hlY2tpbmcgcmVsYXRlZCB0byB0aGUgQU5ZIGtleXdvcmQKICAgICAgICAgIGluIGFycmF5cyBhbmQgaWdub3JlZCBhcmd1bWVudHMuICBFcnJvciByZXBvcnRlZCBieQogICAgICAgICAgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiAlZW5hYmxlZG9jIGFuZCAlZGlzYWJsZWRvYyBkaXJlY3RpdmVzIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgaW5zaWRlIGNsYXNzL3N0cnVjdHVyZSBkZWZpbml0aW9ucy4gICBIb3dldmVyLCBubyBjaGVjawogICAgICAgICAgaXMgbWFkZSB0byBzZWUgaWYgdGhleSBhcmUgYmFsYW5jZWQgKGkuZS4sIGEgJWRpc2FibGVkb2MKICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBkb2VzIG5vdCBoYXZlIHRvIGhhdmUgYSBtYXRjaGluZwogICAgICAgICAgJWVuYWJsZWRvYyBpbiB0aGUgc2FtZSBjbGFzcykuCgo4LzgvOTkgIDogS2V5d29yZCBhcmd1bWVudCBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkIGluIHRoZSBQeXRob24KICAgICAgICAgIG1vZHVsZS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oY2hhciAqYmFyLCBpbnQgc3BhbSwgZG91YmxlIHgpOwoKICAgICAgICAgIENhbiBiZSBjYWxsZWQgZnJvbSBQeXRob24gYXMKCiAgICAgICAgICAgICAgIGZvbyh4ID0gMy40LCBiYXI9ImhlbGxvIiwgc3BhbT00MikKCiAgICAgICAgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBydW4gU1dJRyB3aXRoIHRoZSAnLWtleXdvcmQnIGNvbW1hbmQKICAgICAgICAgIGxpbmUgb3B0aW9uLiAgICBNaXhpbmcga2V5d29yZCBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgIHNob3VsZCB3b3JrIGFzIHdlbGwuICAgVW5uYW1lZCBhcmd1bWVudHMgYXJlIGFzc2lnbmVkIG5hbWVzCiAgICAgICAgICBzdWNoIGFzICJhcmcxIiwgImFyZzIiLCBldGMuLi4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIEZ1bmN0aW9ucyB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lcyBzdWNoIGFzCiAgICAgICAgICBiYXIoaW50ICpPVVRQVVQsIGludCAqT1VUUFVUKSB3aWxsIGxpa2VseSBjYXVzZSBwcm9ibGVtYXRpYwogICAgICAgICAgd3JhcHBlciBjb2RlIHRvIGJlIGdlbmVyYXRlZC4gICBUbyBmaXggdGhpcywgIHVzZSBkaWZmZXJlbnQKICAgICAgICAgIG5hbWVzIG9yIHVzZSAlYXBwbHkgdG8gbWFwIHR5cGVtYXBzIHRvIGFsdGVybmF0ZSBuYW1lcy4KCjgvOC85OSAgOiBIYW5kbGluZyBvZiB0aGUgJ3RoaXMnIHBvaW50ZXIgaGFzIGJlZW4gY2hhbmdlZCBpbiBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgUHJldmlvdXNseSwgZGVyZWZlcmVuY2luZyBvZiAnLnRoaXMnIG9jY3VycmVkIGluIHRoZQogICAgICAgICAgUHl0aG9uIHNoYWRvdyBjbGFzcyBpdHNlbGYuICAgTm93LCB0aGlzIHN0ZXAgb2NjdXJzIGluIHRoZSBDCiAgICAgICAgICB3cmFwcGVycyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICAgIFNXSUdfR2V0UHRyT2JqKFB5T2JqZWN0ICosIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpCgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcG9pbnRlcgogICAgICAgICAgb3IgYSBzaGFkb3cgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhICcudGhpcycgYXR0cmlidXRlIG9mCiAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgMS4gIFRoZSByZWFsIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSBmb3IgYW4gb2JqZWN0IGlzCiAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBDIHdyYXBwZXJzIHdoZXJlIGl0IGNhbiBiZSBleGFtaW5lZC9tb2RpZmllZAogICAgICAgICAgICAgIGJ5IHR5cGVtYXBzLgoKICAgICAgICAgIDIuICBIYW5kbGluZyBvZiBkZWZhdWx0L2tleXdvcmQgYXJndW1lbnRzIGlzIG5vdyBncmVhdGx5CiAgICAgICAgICAgICAgc2ltcGxpZmllZC4KCiAgICAgICAgICAzLiAgVGhlIFB5dGhvbiB3cmFwcGVyIGNvZGUgaXMgbXVjaCBtb3JlIHNpbXBsZS4KCiAgICAgICAgICBQbHVzLCBpdCBlbGltaW5hdGVkIG1vcmUgdGhhbiAzMDAgbGluZXMgb2YgQysrIGNvZGUgaW4gdGhlCiAgICAgICAgICBQeXRob24gbW9kdWxlLgoKICAgICAgICAgICoqKiBDQVZFQVQgOiBUaGlzIHJlcXVpcmVzIHRoZSBhYnN0cmFjdCBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgSXQgc2hvdWxkIHdvcmsgd2l0aCBQeXRob24gMS40LCBidXQgcHJvYmFibHkgbm90aGluZyBvbGRlcgogICAgICAgICAgdGhhbiB0aGF0LgoKCjgvOC85OSAgOiBGaXhlZCBoYW5kbGluZyBvZiAiY29uc3QiIGFuZCBwb2ludGVycyBpbiBjbGFzc2VzLiAgSW4gcGFydGljdWxhciwKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzCgogICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGNvbnN0IGludCAgKmlwdHI7CiAgICAgICAgICB9CgogICAgICAgICAgYXJlIGhhbmRsZWQgYXMgYXNzaWduYWJsZSB2YXJpYWJsZXMgYXMgb3Bwb3NlZCB0byBjb25zdGFudAogICAgICAgICAgdmFsdWVzICh0aGlzIGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGluIEMvQysrKS4gICBOb3RlOgogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMgImNoYXIgKmNvbnN0IG1zZyIgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgogICAgICAgICAgQ29uc3RhbnRzIGRlY2xhcmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgdXNpbmcgY29uc3QgYXJlIGFsc28KICAgICAgICAgIGJyb2tlbiAoYmVjYXVzZSBJIGhhdmUgYSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0IHJlbHkgdXBvbgogICAgICAgICAgdGhpcyBiZWhhdmlvcikuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQKICAgICAgICAgIG1pc3Rha2VubHkgdHJlYXQgJ2NvbnN0IGNoYXIgKicgdHlwZXMgYXMgY29uc3RhbnQgdmFsdWVzLgoKOC84Lzk5ICA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBiaXQtZmllbGRzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2tleXdvcmQgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19leHRlcm4gIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfc3RhdGljICA6IDE7CiAgICAgICAgICB9IGZsYWdzOwoKICAgICAgICAgIEJpdC1maWVsZHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnRlZ2VyIHR5cGVzIGFuZCB0aGVpcgogICAgICAgICAgYXJlIG90aGVyIHJlc3RyaWN0aW9ucy4gIFNXSUcgcGVyZm9ybXMgbm8gc3VjaCB0eXBlLWNoZWNraW5nCiAgICAgICAgICAoYWx0aG91Z2ggdGhlIEMgY29tcGlsZXIgd2lsbCBjYXRjaCBwcm9ibGVtcyB3aGVuIGl0IHRyaWVzIHRvCiAgICAgICAgICBjb21waWxlIHRoZSB3cmFwcGVyIGNvZGUpLgoKOC84Lzk5ICA6IFJlbW92ZWQgdHJhaWxpbmcgc3BhY2Ugb2YgJGJhc2V0eXBlIHN1YnN0aXR1dGlvbiBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAldHlwZW1hcChweXRob24sIGFyZ291dCkgc3BhbSoqIE9VVFBVVHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBjaGFyKiBhID0gIiRiYXNldHlwZV9wIjsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH0KCiAgICAgICAgICAoUGF0Y2ggc3VnZ2VzdGVkIGJ5IE5hdGhhbiBEdW5maWVsZCkuCgo2LzIyLzk5IDogTWFkZSBhIHZlcnkgc2xpZ2h0IHR3ZWFrIHRvIHRoZSBQZXJsNSBzaGFkb3cgY2xhc3MKICAgICAgICAgIGNvZGUgdGhhdCBhbGxvd3MgdHlwZW1hcHMgdG8gYWx0ZXIgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICBvZiBvYmplY3RzICh0byBzdXBwb3J0IHBvbHltb3JwaGljIHR5cGVzKS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBEcmFrZSBEaWVkcmljaC4KCjQvOC85OSAgOiBGaXhlZCBudWxsIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmwgbW9kdWxlLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMy8xNy85OSA6IEZpeGVkIGJ1ZyBpbiBwZXJsNXB0ci5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBHcmVnIEFuZGVyc29uLgoKMi8yNy85OSA6IEVsaW1pbmF0ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gU3dpZyBydW5zIG9uCiAgICAgICAgICBlbXB0eSBmaWxlcy4KCjIvMjcvOTkgOiBBZGRlZCBwYXRjaCB0byBHdWlsZSBtb2R1bGUgdG8gZWxpbWluYXRlIHVudXNlZAogICAgICAgICAgdmFyaWFibGVzLiAgIENvbnRyaWJ1dGVkIGJ5IE1pa2UgU2ltb25zLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyByZXR1cm5pbmcgcmVmZXJlbmNlcy4KCjIvMjcvOTkgOiBGaXhlZCBSdW50aW1lL01ha2VmaWxlLiBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgTWlrZSBSb21iZXJnLgoKMi8yNy85OSA6IEluY29ycG9yYXRlZCBwYXRjaGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoIC1leHBvcnRhbGwgc3dpdGNoIGFuZCBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgaW4gUGVybDUgbW9kdWxlLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKMi8yNy85OSA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSB0byByZWNvZ25pemUgJ3VuZGVmJyBhcyBhIE5VTEwgY2hhciAqLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBQZXJsNSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YKICAgICAgICAgIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbjMyLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBpbmNsdWRlIG9yZGVyIG9mIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgLUkgb3B0aW9uLgoKMi81Lzk4LSA6IERhdmUgZmluaXNoZXMgaGlzIGRpc3NlcnRhdGlvbiwgZ29lcyBqb2IgaHVudGluZywgbW92ZXMgdG8KMi81Lzk5ICAgIENoaWNhZ28gYW5kIGdlbmVyYWxseSB0aHJhc2hlcyBhYm91dC4KClZlcnNpb24gMS4xIFBhdGNoIDUgKEZlYnJ1YXJ5IDUsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2FsbHkgbGluayB2ZXJzaW9ucyBvZiBQeXRob24gMS41LiAgICBUbyBtYWtlIGl0IHRoZSBkZWZhdWx0LAogICAgICAgICAgc2ltcGx5IGNvcHkgJ3N3aWdfbGliL3B5dGhvbi9lbWJlZDE1LmknIHRvICdzd2lnX2xpYi9weXRob24vZW1iZWQuaScKClZlcnNpb24gMS4xIFBhdGNoIDMgKE5vdmVtYmVyIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aXRoIHNoYWRvdyBjbGFzc2VzIGFuZAogICAgICAgICAgc3RhdGljIGNsYXNzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjbGFzcyBpbnN0YW5jZXMuCiAgICAgICAgICBOb3RlIDogVGhlIGZpeCBmb3IgdGhpcyBidWcgcmVxdWlyZXMgYSBzbGlnaHQgcmVzdHJ1Y3R1cmluZyBvZgogICAgICAgICAgb2YgdGhlIC5wbSBmaWxlcyBjcmVhdGVkIGJ5IFNXSUcuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFRjbC9UY2w4IG1vZHVsZXMgcmVsYXRlZCB0byB2YXJpYWJsZSBsaW5raW5nCiAgICAgICAgICBvZiBjaGFyYWN0ZXIgYXJyYXlzLiAgSWYgeW91IGRlY2xhcmVkIGEgZ2xvYmFsIHZhcmlhYmxlICdjaGFyIGZvb1sxMF0nLAogICAgICAgICAgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgd291bGQgZWl0aGVyIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgICAgICAgICBpbW1lZGlhdGVseSB1cG9uIGxvYWRpbmcgb3Igd2VpcmQgbWVtb3J5IGNvcnJ1cHRpb24gZWxzZXdoZXJlLgogICAgICAgICAgVGhpcyBzaG91bGQgbm93IGJlIGZpeGVkIGFsdGhvdWdoIGNoYXJhY3RlciBhcnJheXMgY2FuIG9ubHkgYmUKICAgICAgICAgIHJlYWQtb25seS4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCBpdCB0bwogICAgICAgICAgZmFpbCBpZiBmaWxlcyB3ZXJlIGltcG9ydGVkIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbgogICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCgoxMS8yMy85NzogRml4ZWQgaW5jb3JyZWN0IGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbgogICAgICAgICAgbW9kdWxlLgoKMTEvMjMvOTc6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIHRoZSAtbyBvcHRpb24gd2hlbiB1c2VkIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiBJZiAtbyB3YXMgdXNlZCB0byBzcGVjaWZ5IGJvdGggdGhlIHBhdGhuYW1lIGFuZCBmaWxlbmFtZQogICAgICAgICAgb2YgU1dJRydzIG91dHB1dCBzdWNoIGFzCgogICAgICAgICAgICAgICAgIHN3aWcgLW8gL2hvbWUvc3dpZy93cmFwcGVyLmMgLXNoYWRvdyAtcGVybDUgZm9vLmkKCiAgICAgICAgICBUaGUgd3JhcHBlciBjb2RlIHdvdWxkIGJlIHBsYWNlZCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtbywKICAgICAgICAgIGJ1dCB0aGUgLnBtIGZpbGUgYW5kIGRvY3VtZW50YXRpb24gd291bGQgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIFNXSUcgd2FzIHJ1bi4gICBOb3csIHRoZXNlIGZpbGVzIGFyZSBwbGFjZWQKICAgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgLW8gb3B0aW9uLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBuZWVkZWQgZm9yIHByb3BlciBvcGVyYXRpb24gb24gdGhlCiAgICAgICAgICBNYWNpbnRvc2guCgoxMS8yMy85NzogQWRkZWQgYSAndGhpcygpJyBtZXRob2QgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuICAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZSBmcm9tIGEgc2hhZG93CiAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgdGllZCBoYXNoLiAgIFRvIHVzZSBqdXN0CiAgICAgICAgICBpbnZva2UgYXMgYSBtZXRob2QgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgJGwgPSBuZXcgTGlzdDsgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgJHB0ciA9ICRsLT50aGlzKCk7ICAgIyBHZXQgdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2wgOCBwb2ludGVyLmkgbGlicmFyeSBmaWxlICh3aGljaCB3YXMgY29tcGxldGVseQogICAgICAgICAgYnJva2VuIGluIDEuMXAyKS4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgUGVybDUgdHlwZS1jaGVja2VyIHRvIGZpeCBhIGZldyBwcm9ibGVtcwogICAgICAgICAgd2l0aCBnbG9iYWwgdmFyaWFibGVzIG9mIHBvaW50ZXIgdHlwZXMgYW5kIHRvIGFsbG93CiAgICAgICAgICB0aWVkIGhhc2hlcyB0byBiZSB1c2VkIGludGVyY2hhbmdhYmx5IHdpdGggbm9ybWFsCiAgICAgICAgICBwb2ludGVyIHZhbHVlcy4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgdHlwZW1hcCBtZWNoYW5pc20gdG8gYWxsb3cgb3V0cHV0CiAgICAgICAgICB0eXBlbWFwcyBvZiB0eXBlICd2b2lkJy4gICBUaGVzZSB3ZXJlIGlnbm9yZWQgcHJldmlvdXNseSwKICAgICAgICAgIGJ1dCBub3cgaWYgeW91IHNwZWNpZnksCgogICAgICAgICAgICAgICAgJXR5cGVtYXAobGFuZyxvdXQpIHZvaWQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZvaWQgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgWW91IGNhbiBjaGFuZ2Ugb3IgYXNzaWduIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBmdW5jdGlvbi4KCjExLzIzLzk3OiBGaXhlZCBwcm9jZXNzaW5nIG9mICdib29sJyBkYXRhdHlwZXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgoxMS8yMy85NzogRml4ZWQgbWlub3IgcGFyc2luZyBlcnJvciB3aXRoIEMrKyBpbml0aWFsaXplcnMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbDggbW9kdWxlIHNvIHRoYXQgQyBmdW5jdGlvbnMgdGhhdCBjYWxsIGJhY2sgaW50bwogICAgICAgICAgVGNsIGRvbid0IGNvcnJ1cHQgdGhlIHJldHVybiByZXN1bHQgb2JqZWN0IChTV0lHIHdhcyBnYXRoZXJpbmcKICAgICAgICAgIHRoZSByZXN1bHQgb2JqZWN0IHRvbyBlYXJseSB3aGljaCBsZWFkcyB0byBwcm9ibGVtcyBpZiBzdWJzZXF1ZW50CiAgICAgICAgICBUY2wgY2FsbHMgYXJlIG1hZGUpLgoKMTEvMjMvOTc6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiB0aGUgUHl0aG9uIG1vZHVsZSB3aGVuIHR3byBvcgogICAgICAgICAgbW9yZSBvdXRwdXQgcGFyYW1ldGVycyB3ZXJlIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyBvZiBhCiAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgdHlwZW1hcHMuaQogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqT1VUUFVULCBkb3VibGUgKk9VVFBVVCwgZG91YmxlIGEpOwoKICAgICAgICAgIFByZXZpb3VzbHksIGRvaW5nIHRoaXMgcmVzdWx0ZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFuCiAgICAgICAgICBleHRyYW5lb3VzIGNvbW1hIGluIHRoZSBvdXRwdXQsIHJlc3VsdGluZyBpbiBhIEMgc3ludGF4IGVycm9yLgoKMTEvMjIvOTc6IEZpeGVkIGEgYnVnIHdoZW4gdGVtcGxhdGUgaGFuZGxpbmcgdGhhdCB3YXMgc3RyaXBwaW5nIHdoaXRlc3BhY2UKICAgICAgICAgIGFyb3VuZCBuZXN0ZWQgdGVtcGxhdGVzLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgRm9vPEJhcjxkb3VibGU+ID4KCiAgICAgICAgICB3YXMgZ2V0dGluZyBtdW5nZWQgaW50byBGb288QmFyPj4gd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgaW4KICAgICAgICAgIGluIHRoZSBDKysgY29tcGlsZXIuCgoxMS8yMi85NzogRml4ZWQgYnVncyBpbiB0aGUgQm9ybGFuZCBDKysgbWFrZWZpbGVzLgoKMTEvMjIvOTc6IEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyB3aGVuIHByb2Nlc3NpbmcgaW50ZWdlcgogICAgICAgICAgYXJndW1lbnRzIGluIFRjbDggbW9kdWxlLgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBSdW50aW1lL01ha2VmaWxlIHJlbGF0ZWQgdG8gVGNsIDguCgoxMS8yMS85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgTm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHBlcmwgc3ludGF4IGVycm9yLgoKMTEvOS85NyA6IENoYW5nZWQgYSBzdHJuY3B5KCkgdG8gc3RyY3B5KCkgaW4gdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyLgogICAgICAgICAgVGhpcyByZXN1bHRzIGluIGEgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4KICAgICAgICAgIHR5cGUtY2hlY2tpbmcuCgoxMC8yOS85NzogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cyBhbmQKICAgICAgICAgIHVzZXItZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oVmVjdG9yIGEsIFZlY3RvciBiID0gZCk7CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrIHByb3Blcmx5LgoKVmVyc2lvbiAxLjEgUGF0Y2ggMiAoU2VwdGVtYmVyIDQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cnJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBleHBvcnQgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICB5b3Vyc2VsZi4KCiAgICAgICAgICAgIC0gIEJpemFycmUgY29tcGlsYXRpb24gcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlcgogICAgICAgICAgICAgICBjb2RlIGFzIEFOU0kgQyB1bmRlciBWaXN1YWwgQysrIDQueCBmaXhlZC4KCiAgICAgICAgICAgIC0gIFRlc3RlZCB3aXRoIGJvdGggdGhlIHN0b2NrIFB5dGhvbi0xLjQgZGlzdHJpYnV0aW9uIGFuZCBQeXRob253aW4KICAgICAgICAgICAgICAgcnVubmluZyB1bmRlciBXaW45NS4KCjIvMTkvOTcgOiBGaXhlZCB0eXBlZGVmIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjIvMTkvOTcgOiBBZGRlZCBleGNlcHRpb24gc3VwcG9ydC4gIFRvIHVzZSBpdCwgZG8gdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgICVleGNlcHQobGFuZykgewogICAgICAgICAgICAgICAgICAuLi4gdHJ5IHBhcnQgb2YgdGhlIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIC4uLiBjYXRjaCBwYXJ0IG9mIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgJGZ1bmN0aW9uIGlzIGEgU1dJRyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgICBhY3R1YWwgQy9DKysgZnVuY3Rpb24gY2FsbCBpbiBhIHdyYXBwZXIgZnVuY3Rpb24uICBUaHVzLAogICAgICAgICAgYSByZWFsIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAlZXhjZXB0KHBlcmw1KSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoIChjaGFyIComIHN6KSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHByb2Nlc3MgYW4gZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICB9IGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIGNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbi4gQmFpbGluZyBvdXQuLi4iKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQoKMi8xOS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGdlbmVyaWMgY29kZSBmcmFnbWVudHMgKG5lZWRlZAogICAgICAgICAgZm9yIGV4Y2VwdGlvbnMpLgoKMi8xOS85NyA6IEZpeGVkIHNvbWUgcmVhbGx5IG9ic2N1cmUgdHlwZW1hcCBzY29waW5nIGJ1Z3MgaW4gdGhlIEMrKwogICAgICAgICAgaGFuZGxlci4KCjIvMTgvOTcgOiBDbGVhbmVkIHVwIHBlcmxtYWluLmkgZmlsZSBieSByZW1vdmluZyBzb21lIHByb2JsZW1hdGljLAogICAgICAgICAgYnV0IHNlZW1pbmdseSB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMuCgoyLzE4Lzk3IDogT3B0aW1pemVkIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbnMgdW5kZXIgaW5oZXJpdGFuY2UuCiAgICAgICAgICBTV0lHIGNhbiBub3cgdXNlIHdyYXBwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgYQogICAgICAgICAgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIHJlZ2VuZXJhdGluZyB3cmFwcGVycyBmb3IKICAgICAgICAgIHRoZSBzYW1lIGZ1bmN0aW9ucyBpbiBhIGRlcml2ZWQgY2xhc3MuICAgIFRoaXMgY291bGQKICAgICAgICAgIG1ha2UgYSBkcmFzdGljIHJlZHVjdGlvbiBpbiB3cmFwcGVyIGNvZGUgc2l6ZSBmb3IgQysrCiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBkZWVwIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGFuZAogICAgICAgICAgbG90cyBvZiBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogQWRkaXRpb25hbCBtZXRob2RzIHNwZWNpZmllZCB3aXRoICVhZGRtZXRob2RzIGNhbiBub3cKICAgICAgICAgIGJlIGluaGVyaXRlZCBhbG9uZyB3aXRoIG5vcm1hbCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBNaW5vciBpbnRlcm5hbCBmaXhlcyB0byBtYWtlIFNXSUcncyBzdHJpbmcgaGFuZGxpbmcgYSBsaXR0bGUKICAgICAgICAgIHNhZmVyLgoKMi8xNi85NyA6IE1vdmVkIHNvbWUgY29kZSBnZW5lcmF0aW9uIG9mIFRjbCBzaGFkb3cgY2xhc3NlcyB0bwogICAgICAgICAgbGlicmFyeSBmaWxlcy4KCjIvMTYvOTcgOiBGaXhlZCBkb2N1bWVudGF0aW9uIGVycm9yIG9mICctY29uZmlndXJlJyBtZXRob2QgaW4KICAgICAgICAgIFRjbCBtb2R1bGVzLgoKMi8xNi85NyA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSBzbGlnaHRseSB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcy4KCjIvMTIvOTcgOiBGaXhlZCBhcmd1bWVudCBjaGVja2luZyBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBieQogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgKGZ1bmN0aW9uIGNhbGxzIHdpdGggdG9vIG1hbnkKICAgICAgICAgIGFyZ3VtZW50cyB3b3VsZCBzdGlsbCBiZSBleGVjdXRlZCkuICBGdW5jdGlvbnMgbm93CiAgICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyBDIHZlcnNpb24KICAgICAgICAgICh3aXRoIHBvc3NpYmlsaXR5IG9mIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBzdGlsbCBzdXBwb3J0ZWQpLgoKMi8xMi85NyA6IEZpeGVkIGRlZmF1bHQgYXJndW1lbnQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zIGludm9sdmluZyBkZWZhdWx0CiAgICAgICAgICBhcmd1bWVudHMgb2YgY29tcGxleCBkYXRhdHlwZXMuCgoyLzEyLzk3IDogRml4ZWQgdHlwZW1hcCBzY29waW5nIHByb2JsZW1zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gZ2V0IGEgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiYXIoZG91YmxlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBuZXcgZ2V0IGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBhcHBseSB0aGUgc2Vjb25kIHR5cGVtYXAgdG8gYWxsIGZ1bmN0aW9ucyBpbiBGb28KICAgICAgICAgIGR1ZSB0byBkZWxheWVkIGdlbmVyYXRpb24gb2YgQysrIHdyYXBwZXIgY29kZSAoY2xlYXJseSB0aGlzCiAgICAgICAgICBpcyBub3QgdGhlIGRlc2lyZWQgZWZmZWN0KS4gICBQcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5CiAgICAgICAgICBhc3NpZ25pbmcgdW5pcXVlIG51bWVyaWNhbCBpZGVudGlmaWVycyB0byBldmVyeSBkYXRhdHlwZSBpbgogICAgICAgICAgYW4gaW50ZXJmYWNlIGZpbGUgYW5kIHJlY29yZGluZyB0aGUgInJhbmdlIG9mIGVmZmVjdCIgb2YgZWFjaAogICAgICAgICAgdHlwZW1hcC4KCjIvMTEvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciAiaWdub3JlIiBhbmQgImRlZmF1bHQiIHR5cGVtYXBzLiAgT25seSB1c2UKICAgICAgICAgIGlmIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCgoyLzkvOTcgIDogQWRkZWQgYXV0b21hdGljIGNyZWF0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yCiAgICAgICAgICBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW55IHNvcnQgb2YKICAgICAgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGJ5CiAgICAgICAgICBydW5uaW5nIFNXSUcgd2l0aCB0aGUgJy1tYWtlX2RlZmF1bHQnIG9wdGlvbiBvciBieSBpbnNlcnRpbmcKICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGludG8gYW4gaW50ZXJmYWNlIGZpbGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG1ha2VfZGVmYXVsdAoKICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJhZ21hIGRpc2FibGVzIGF1dG9tYXRpYyBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uCgogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdAoKMi85Lzk3ICA6IEFkZGVkIC1tYWtlX2RlZmF1bHQgb3B0aW9uIGZvciBwcm9kdWNpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBmb3IgY2xhc3NlcyB3aXRob3V0IHRoZW0uCgoyLzkvOTcgIDogQ2hhbmdlZCB0aGUgc3ludGF4IG9mIHRoZSBTV0lHICVwcmFnbWEgZGlyZWN0aXZlIHRvCiAgICAgICAgICAlcHJhZ21hIG9wdGlvbj12YWx1ZSBvciAlcHJhZ21hKGxhbmcpIG9wdGlvbj12YWx1ZS4KICAgICAgICAgIFRoaXMgY2hhbmdlIG1ha2VzIHRoZSBzeW50YXggYSBsaXR0bGUgbW9yZSBjb25zaXN0ZW50CiAgICAgICAgICBiZXR3ZWVuIGdlbmVyYWwgcHJhZ21hcyBhbmQgbGFuZ3VhZ2Utc3BlY2lmaWMgcHJhZ21hcy4KICAgICAgICAgIFRoZSBvbGQgc3ludGF4IHN0aWxsIHdvcmtzLCBidXQgd2lsbCBwcm9iYWJseSBiZSBwaGFzZWQKICAgICAgICAgIG91dCAoYSB3YXJuaW5nIG1lc3NhZ2UgaXMgY3VycmVudGx5IHByaW50ZWQpLgoKMi85Lzk3ICA6IEltcHJvdmVkIFRjbCBzdXBwb3J0IG9mIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhcmUgb2YKICAgICAgICAgIHN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCB1bmlvbnMuCgoyLzkvOTcgIDogRml4ZWQgQysrIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gUHl0aG9uICdlbWJlZC5pJyBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgbWlzc2luZyByZXR1cm4gdmFsdWUgaW4gcGVybG1haW4uaSBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIHJldHVybiBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuCiAgICAgICAgICB1bmRlZmluZWQgYXR0cmlidXRlcyBhcmUgYWNjZXNzZWQgKG9sZGVyIHZlcnNpb25zIHJldHVybmVkCiAgICAgICAgICBhIE5hbWVFcnJvcikuCgoyLzkvOTcgIDogRml4ZWQgYnVnIHdoZW4gJWFkZG1ldGhvZHMgaXMgdXNlZCBhZnRlciBhIGNsYXNzIGRlZmluaXRpb24gd2hvc2UKICAgICAgICAgIGxhc3Qgc2VjdGlvbiBpcyBwcm90ZWN0ZWQgb3IgcHJpdmF0ZS4KCjIvOC85NyAgOiBNYWRlIHNsaWdodCBjaGFuZ2VzIGluIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHRvIHN1cHBvcnQKICAgICAgICAgIHRoZSBNYWNpbnRvc2guCgoyLzgvOTcgIDogRXh0ZW5kZWQgc3dpZ21haW4uY3h4IHRvIHByb3ZpZGUgYSBydWRpbWVudGFyeSBNYWNpbnRvc2ggaW50ZXJmYWNlLgogICAgICAgICAgSXQncyBhIHJlYWxseSBiYWQgaW50ZXJmYWNlLCBidXQgd29ya3MgdW50aWwgc29tZXRoaW5nIGJldHRlcgogICAgICAgICAgaXMgd3JpdHRlbi4KCjEvMjkvOTcgOiBGaXhlZCB0eXBlLWNhc3RpbmcgYnVnIGludHJvZHVjZWQgYnkgMS4xYjQgd2hlbiBzZXR0aW5nL2dldHRpbmcgdGhlCiAgICAgICAgICB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGVzIGludm9sdmluZyBjb21wbGV4IGRhdGEgdHlwZXMuCgoxLzI5Lzk3IDogUmVtb3ZlZCBlcnJvbmVvdXMgd2hpdGUgc3BhY2UgYmVmb3JlIGFuICNlbmRpZiBpbiB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgIGJ5IHRoZSBQeXRob24gbW9kdWxlICh3YXMgY2F1c2luZyBlcnJvcnMgb24gREVDIEFscGhhIGNvbXBpbGVycykuCgoxLzI2Lzk3IDogRml4ZWQgZXJyb3JzIHdoZW4gdXNpbmcgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMgaW4gUHl0aG9uIHNoYWRvdwoJICBzaGFkb3cgY2xhc3Nlcy4KCjEvMjMvOTcgOiBGaXhlZCBidWcgd2l0aCBuZXN0ZWQgJWV4dGVybiBkZWNsYXJhdGlvbnMuCgoxLzIxLzk3IDogRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgaW52b2x2aW5nIGNvbnN0IGRhdGF0eXBlcy4KCjEvMjEvOTcgOiBTb21ld2hhdCBvYnNjdXJlLCBidXQgc2VyaW91cyBidWcgd2l0aCBoYXZpbmcgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICBvZiB0eXBlZGVmcyBmaXhlZC4gIEZvciBleGFtcGxlIDoKCgkJdHlwZWRlZiBjaGFyICpTdHJpbmc7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFN0cmluZyAgTmFtZTsKClZlcnNpb24gMS4xIEJldGE0IChKYW51YXJ5IDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBTV0lHIDEuMWIzIGNyYXNoZWQgYW5kIGJ1cm5lZCBzaG9ydGx5IGFmdGVyIHRha2Ugb2ZmIGR1ZQp0byBhIGZldyBtYWpvciBydW4tdGltZSBwcm9ibGVtcyB0aGF0IHN1cmZhY2VkIGFmdGVyIHJlbGVhc2UuClRoaXMgcmVsZWFzZSBzaG91bGQgZml4IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRob3NlIHByb2JsZW1zLgoKMS8xNi85NyA6IEZpeGVkIG1ham9yIG1lbW9yeSBtYW5hZ2VtZW50IGJ1ZyBvbiBMaW51eAoKMS8xNC85NyA6IEZpeGVkIGJ1ZyBpbiBmdW5jdGlvbnMgcmV0dXJuaW5nIGNvbnN0YW50IEMrKyByZWZlcmVuY2VzLgoKMS8xNC85NyA6IE1vZGlmaWVkIEMrKyBtb2R1bGUgdG8gaGFuZGxlIGRhdGF0eXBlcyBiZXR0ZXIuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IGEgKnNpbmdsZSogc2NvcGUgcmVzb2x1dGlvbgogICAgICAgICAgb3BlcmF0b3IgaW4gZGF0YXR5cGVzLiAgSWUgOiBGb286OmJhci4gICBTV0lHIGRvZXNuJ3QKICAgICAgICAgIHlldCBoYW5kbGUgbmVzdGVkIGNsYXNzZXMsIHNvIHRoaXMgc2hvdWxkIGJlCiAgICAgICAgICBzdWZmaWNpZW50IGZvciBub3cuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHR5cGVkZWYgaW5zaWRlIGEgQysrIGNsYXNzLgoKMS8xNC85NyA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBkYXRhdHlwZXMgZGVmaW5lZCBpbnNpZGUKICAgICAgICAgIGEgQysrIGNsYXNzLiAgU1dJRyB3YXMgbm90IGdlbmVyYXRpbmcgY29ycmVjdCBjb2RlLAogICAgICAgICAgYnV0IGEgbmV3IHNjb3BpbmcgbWVjaGFuaXNtIGFuZCBtZXRob2QgZm9yIGhhbmRsaW5nCiAgICAgICAgICBkYXRhdHlwZXMgaW5zaWRlIGEgQysrIGNsYXNzIGhhdmUgYmVlbiBhZGRlZC4KCjEvMTQvOTcgOiBDaGFuZ2VkIGVudW1lcmF0aW9ucyB0byB1c2UgdGhlIHZhbHVlIG5hbWUgaW5zdGVhZAogICAgICAgICAgb2YgYW55IHZhbHVlcyB0aGF0IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGludGVyZmFjZQogICAgICAgICAgZmlsZS4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0bwogICAgICAgICAgQysrIGNvbXBpbGVycy4KCjEvMTQvOTcgOiBSZW1vdmVkIHR5cGVkZWYgYnVnIHRoYXQgbWFkZSBhbGwgZW51bWVyYXRpb25zCiAgICAgICAgICBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHR5cGUgY2hlY2tlciAoc2luY2UKICAgICAgICAgIGl0IGdlbmVyYXRlZCBhbG90IG9mIHVubmVjZXNzYXJ5IGNvZGUpLgoKVmVyc2lvbiAxLjEgQmV0YTMgKEphbnVhcnkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBDKysgbW9kdWxlCgoyLiBGaXhlZCBtaW5vciBidWcgaW4gcG9pbnRlciB0eXBlLWNoZWNrZXIgd2hlbiB1c2luZwogICAtREFMTE9XX05VTEwuCgozLiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsgd2l0aCBQeXRob24gMS40YmV0YTMKCjQuIENoYW5nZWQgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRob3V0CiAgIHlhY2Mgb3IgYmlzb24uCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDI4LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIENoYW5nZWQgcGFyc2VyIHRvIHN1cHBvcnQgbW9yZSBDL0MrKyBkYXRhdHlwZXMgKHdlbGwsCiAgICBtb3JlIHZhcmlhbnRzKS4gICBUeXBlcyBsaWtlICJ1bnNpZ25lZCIsICJzaG9ydCBpbnQiLAogICAgImxvbmcgaW50IiwgZXRjLi4uIG5vdyB3b3JrLgoKMi4gICJ1bmlvbnMiIGFkZGVkIHRvIHBhcnNlci4KCjMuICBVc2Ugb2YgInR5cGVkZWYiIGFzIGluIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgIGRvdWJsZSB4LHksejsKCX0gVmVjdG9yOwoKICAgIE5vdyB3b3JrcyBjb3JyZWN0bHkuICAgVGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgaXMgdXNlZCBhcwogICAgdGhlIHN0cnVjdHVyZSBuYW1lLgoKNC4gIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmLCAjZWxzZSwgI2VuZGlmLCBldGMuLi4KICAgIGFkZGVkLgoKNS4gIE5ldyAlZGlzYWJsZWRvYywgJWVuYWJsZWRvYyBkaXJlY3RpdmVzIGFsbG93IGRvY3VtZW50YXRpb24KICAgIHRvIHNlbGVjdGl2ZWx5IGJlIGRpc2FibGVkIGZvciBjZXJ0YWluIHBhcnRzIG9mIGEgd3JhcHBlcgogICAgZmlsZS4KCjYuICBOZXcgUHl0aG9uIG1vZHVsZSBzdXBwb3J0cyBiZXR0ZXIgdmFyaWFibGUgbGlua2luZywgY29uc3RhbnRzLAogICAgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNy4gIFBlcmw1IG1vZHVsZSBpbXByb3ZlZCB3aXRoIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggWFMKICAgIGFuZCB4c3VicHAuICAgU1dJRyBwb2ludGVycyBhbmQgbm93IGNyZWF0ZWQgc28gdGhhdCB0aGV5CiAgICBhcmUgY29tcGF0aWJsZSB3aXRoIHhzdWJwcCBwb2ludGVycy4KCjguICBTdXBwb3J0IGZvciBbaW5jciBUY2xdIG5hbWVzcGFjZXMgYWRkZWQgdG8gVGNsIG1vZHVsZS4KCjkuICAlcHJhZ21hIGRpcmVjdGl2ZSBhZGRlZC4KCjEwLiAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgYWRkZWQuCgoxMS4gJW5hdGl2ZSBkaXJlY3RpdmUgYWRkZWQgdG8gYWxsb3cgcHJlLWV4aXN0aW5nIHdyYXBwZXIgZnVuY3Rpb25zCiAgICB0byBiZSB1c2VkLgoKMTIuIFdyb3RlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFNXSUcgaW5zdGFsbGF0aW9uLgoKMTMuIEZ1bmN0aW9uIHBvaW50ZXJzIG5vdyBhbGxvd2VkIHdpdGggdHlwZWRlZiBzdGF0ZW1lbnRzLgoKMTQuICV0eXBlZGVmIG1vZGlmaWVkIHRvIGluc2VydCBhIGNvcnJlc3BvbmRpbmcgQyB0eXBlZGVmIGludG8KICAgIHRoZSBvdXRwdXQgZmlsZS4KCjE1LiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gQysrIHJlZmVyZW5jZXMuCgoxNi4gTmV3IFN0cmluZyBhbmQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzZXMgYWRkIHRvIG1ha2UgZ2VuZXJhdGluZwogICAgd3JhcHBlciBjb2RlIGVhc2llci4KCjE3LiBGaXhlZCBjb21tYW5kIGxpbmUgb3B0aW9uIHByb2Nlc3NpbmcgdG8gZWxpbWluYXRlIGNvcmUgZHVtcHMKICAgIGFuZCB0byBhbGxvdyBoZWxwIG1lc3NhZ2VzLgoKMTguIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byBhbG1vc3QgYWxsIGNvZGUgbW9kdWxlcwoKClZlcnNpb24gMS4wIEJldGEgMyAoUGF0Y2ggMSkgSnVseSAxNywgMTk5Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuMCBGaW5hbCBpcyBub3QgcXVpdGUgcmVhZHkgeWV0LCBidXQgdGhpcyByZWxlYXNlIGZpeGVzIGEKbnVtYmVyIG9mIGltbWVkaWF0ZSBwcm9ibGVtcyA6CgoxLiAgQ29tcGlsZXIgZXJyb3JzIHdoZW4gdXNpbmcgLXN0cmljdCAxIHR5cGUgY2hlY2tpbmcgaGF2ZSBiZWVuIGZpeGVkLgoKMi4gIFBvaW50ZXIgdHlwZSBjaGVja2VyIG5vdyByZWNvZ25pemVzIHBvaW50ZXJzIG9mIHRoZSBmb3JtCiAgICBfMF9UeXBlIGNvcnJlY3RseS4KCjMuICBBIGZldyBtaW5vciBmaXhlcyB3ZXJlIG1hZGUgaW4gdGhlIE1ha2VmaWxlCgpWZXJzaW9uIDEuMCBCZXRhIDMgKEp1bmUgMTQsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgcmVsZWFzZSBpcyBpZGVudGljYWwgdG8gQmV0YTEgZXhjZXB0IGEgZmV3IG1pbm9yIGJ1Z3MgYXJlCmZpeGVkIGFuZCB0aGUgU1dJRyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUvVGsgNC4xLgpBIHRjbDcuNSBleGFtcGxlcyBkaXJlY3RvcnkgaXMgbm93IGluY2x1ZGVkLgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgTWFrZWZpbGUgdGhhdCBkaWRuJ3QgaW5zdGFsbCB0aGUgbGlicmFyaWVzCiAgY29ycmVjdGx5LgoKLSBTV0lHIExpYnJhcnkgZmlsZXMgYXJlIG5vdyB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41IGFuZCBUayA0LjEuCgotIE1pbm9yIGJ1ZyBmaXhlcyBpbiBvdGhlciBtb2R1bGVzLgoKClZlcnNpb24gMS4wIEJldGEgMSAgKEFwcmlsIDEwLCAxOTk2KS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBpcyB0aGUgZmlyc3QgInNlbWktb2ZmaWNpYWwiIHJlbGVhc2Ugb2YgU1dJRy4gICAgSXQgaGFzIGEKbnVtYmVyIG9mIHN1YnN0YW50aWFsIGltcHJvdmVtZW50cyBvdmVyIHRoZSBBbHBoYSByZWxlYXNlLiAgIFRoZXNlCm5vdGVzIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLS1ob3BlIEkgcmVtZW1iZXJlZCBldmVyeXRoaW5nLi4uLgoKMS4gIFRjbC9UawoKU1dJRyBpcyBrbm93biB0byB3b3JrIHdpdGggVGNsNy4zLCBUazMuNiBhbmQgbGF0ZXIgdmVyc2lvbnMuCkkndmUgYWxzbyB0ZXN0ZWQgU1dJRyB3aXRoIGV4cGVjdC01LjE5LgoKTm9ybWFsbHkgU1dJRyBleHBlY3RzIHRvIHVzZSB0aGUgaGVhZGVyIGZpbGVzICJ0Y2wuaCIgYW5kICJ0ay5oIi4KTmV3ZXIgdmVyc2lvbnMgb2YgVGNsL1RrIHVzZSB2ZXJzaW9uIG51bWJlcnMuICAgWW91IGNhbiBzcGVjaWZ5IHRoZXNlCmluIFNXSUcgYXMgZm9sbG93cyA6CgogICAgICAgICUgd3JhcCAtaHRjbCB0Y2w3LjQuaCAtaHRrIHRrNC4wLmggZXhhbXBsZS5pCgpPZiBjb3Vyc2UsIEkgcHJlZmVyIHRvIHNpbXBseSBzZXQgdXAgc3ltYm9saWMgbGlua3MgYmV0d2VlbiAidGNsLmgiIGFuZAp0aGUgbW9zdCByZWNlbnQgc3RhYmxlIHZlcnNpb24gb24gdGhlIG1hY2hpbmUuCgoyLiAgUGVybDQKClRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gYmFzZWQgb24gUGVybC00LjAzNS4gIFNXSUcncyBpbnRlcmZhY2UgdG8KUGVybDQgaXMgYmFzZWQgb24gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgaW4gdGhlICJQcm9ncmFtbWluZyBQZXJsIgpib29rIGJ5IExhcnJ5IFdhbGwsIGFuZCBmaWxlcyBsb2NhdGVkIGluIHRoZSAidXN1YiIgZGlyZWN0b3J5IG9mIHRoZQpQZXJsNCBkaXN0cmlidXRpb24uCgpJbiBvcmRlciB0byBjb21waWxlIHdpdGggUGVybDQsIHlvdSdsbCBuZWVkIHRvIGxpbmsgd2l0aCB0aGUgdXBlcmwubwpmaWxlIGZvdW5kIGluIHRoZSBQZXJsNCBzb3VyY2UgZGlyZWN0b3J5LiAgWW91IG1heSB3YW50IHRvIG1vdmUgdGhpcwpmaWxlIHRvIGEgbW9yZSBjb252ZW5pZW50IGxvY2F0aW9uLgoKMy4gIFBlcmw1CgpUaGlzIGlzIGEgc29tZXdoYXQgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uLCBidXQgaXMgYWxvdCBsZXNzCmJ1Z2d5IHRoYW4gdGhlIGFscGhhIHJlbGVhc2UuICAgICBTV0lHIG9wZXJhdGVzIGluZGVwZW5kZW50bHkgb2YKdGhlIFhTIGxhbmd1YWdlIGFuZCB4c3VicHAgc3VwcGxpZWQgd2l0aCBQZXJsNS4gIEN1cnJlbnRseSBTV0lHCnByb2R1Y2VzIHRoZSBuZWNlc3NhcnkgQyBjb2RlIGFuZCAucG0gZmlsZSBuZWVkZWQgdG8gZHluYW1pY2FsbHkKbG9hZCBhIG1vZHVsZSBpbnRvIFBlcmw1LgoKVG8gc3VwcG9ydCBQZXJsNSdzIG5vdGlvbiBvZiBtb2R1bGVzIGFuZCBwYWNrYWdlcyAoYXMgd2l0aCB4c3VicHApLAp5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIDoKCiAgICAgICAgJSB3cmFwIC1wZXJsNSAtbW9kdWxlIE15TW9kdWxlIC1wYWNrYWdlIE15UGFja2FnZSBleGFtcGxlLmkKCk5vdGUgOiBJbiBvcmRlciBmb3IgZHluYW1pYyBsb2FkaW5nIHRvIGJlIGVmZmVjdGl2ZSwgeW91IG5lZWQgdG8gYmUKY2FyZWZ1bCBhYm91dCBuYW1pbmcuICAgIEZvciBhIG1vZHVsZSBuYW1lZCAiTXlNb2R1bGUiLCB5b3UnbGwgbmVlZCB0bwpjcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY2FsbGVkICJNeU1vZHVsZS5zbyIgdXNpbmcgc29tZXRoaW5nIGxpa2UKCiAgICAgICAgJSBsZCAtc2hhcmVkIG15X29iai5vIC1vIE15TW9kdWxlLnNvCgpUaGUgdXNlIG9mIHRoZSAlaW5pdCBkaXJlY3RpdmUgbXVzdCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgc2luY2UgUGVybDUKY2FsbHMgYSBmdW5jdGlvbiAiYm9vdF9Nb2R1bGVOYW1lIiBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoaW5ncy4KU2VlIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgZm9yIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGdldCB0aGluZ3MKdG8gd29yay4KCjQuICBQeXRob24xLjMKClRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugc3VwcG9ydGluZyBQeXRob24uICAgIFRoZSBQeXRob24gcG9ydCBpcwpleHBlcmltZW50YWwgYW5kIG1heSBiZSByZXdyaXR0ZW4uICAgVmFyaWFibGUgbGlua2FnZSBpcyBkb25lIHRocm91Z2gKZnVuY3Rpb25zIHdoaWNoIGlzIHNvcnQgb2YgYSBrbHVkZ2UuICBJIGFsc28gdGhpbmsgaXQgd291bGQgYmUgbmljZQp0byBpbXBvcnQgU1dJRyBwb2ludGVycyBpbnRvIFB5dGhvbiBhcyBhIG5ldyBvYmplY3QgKGluc3RlYWQgb2Ygc3RyaW5ncykuCk9mIGNvdXJzZSwgdGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsuCgo1LiAgR3VpbGUzCgpJZiB5b3UgcmVhbGx5IHdhbnQgdG8gbGl2ZSBvbiB0aGUgZWRnZSwgcGljayB1cCBhIGNvcHkgb2YgR3VpbGUtaWlpIGFuZApwbGF5IGFyb3VuZCB3aXRoIHRoaXMuICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsLS0tZXNwZWNpYWxseSBzaW5jZQpJJ20gbm90IHN1cmUgd2hhdCB0aGUgb2ZmaWNpYWwgc3RhdGUgb2YgR3VpbGUgaXMgdGhlc2UgZGF5cy4gIFRoaXMKaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBzaG91bGQgSSBzdWRkZW5seSBmaWd1cmUgb3V0IGJldHRlcgp3YXlzIHRvIGRvIHRoaW5ncy4KCjYuICBFeHRlbmRpbmcgU1dJRwoKU1dJRyBpcyB3cml0dGVuIGluIEMrKyBhbHRob3VnaCBJIHRlbmQgdG8gdGhpbmsgb2YgdGhlIGNvZGUgYXMgbW9zdGx5CmJlaW5nIEFOU0kgQyB3aXRoIGEgbGl0dGxlIGluaGVyaXRhbmNlIHRocm93biBpbi4gICBFYWNoIHRhcmdldCBsYW5ndWFnZQppcyBpbXBsZW1lbnRlZCBhcyBhIEMrKyBjbGFzcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KSWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMsIHNlZSBBcHBlbmRpeCBDIG9mIHRoZSB1c2VyCm1hbnVhbC4gICBUaGVuIHRha2UgYSBsb29rIGF0IHRoZSAidXNlciIgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvbWUKY29kZSBmb3IgYnVpbGRpbmcgeW91ciBvd24gZXh0ZW5pb25zLgoKNy4gVGhlIFNXSUcgbGlicmFyeQoKVGhlIFNXSUcgbGlicmFyeSBpcyBzdGlsbCBpbmNvbXBsZXRlLiAgU29tZSBvZiB0aGUgZmlsZXMgbWVudGlvbmVkIGluCnRoZSB1c2VyIG1hbnVhbCBhcmUgdW5hdmFpbGFibGUuICAgIFRoZXNlIGZpbGVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKd2hlbiB0aGV5IGFyZSByZWFkeS4gICBTdWJzY3JpYmUgdG8gdGhlIFNXSUcgbWFpbGluZyBsaXN0IGZvciBhbm5vdW5jZW1lbnRzCmFuZCB1cGRhdGVzLgoKOC4gU1dJRyBEb2N1bWVudGF0aW9uCgpJIGhhdmUgc29tZXRpbWVzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHZpZXdpbmcgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBpbgpzb21lIHBvc3RzY3JpcHQgdmlld2Vycy4gICBIb3dldmVyLCB0aGUgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBwcmludApub3JtYWxseS4gICAgSSdtIHdvcmtpbmcgb24gbWFraW5nIG11Y2ggb2YgdGhlIGRvY3VtZW50YXRpb24gb25saW5lLApidXQgdGhpcyB0YWtlcyB0aW1lLgoKVmVyc2lvbiAwLjEgQWxwaGEgKEZlYnJ1YXJ5IDksIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIFJ1bi10aW1lIHR5cGUtY2hlY2tpbmcgb2YgU1dJRyBwb2ludGVycy4gICBQb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkCiAgICBhcyBzdHJpbmdzIHdpdGggYm90aCBudW1lcmljIGFuZCBlbmNvZGVkIHR5cGUgaW5mb3JtYXRpb24uICAgIFRoaXMgbWFrZXMKICAgIGl0IGEgbGl0dGxlIGhhcmRlciB0byBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCAoYW5kIGl0IGVsaW1pbmF0ZXMKICAgIHNvbWUgc2VnbWVudGF0aW9uIGZhdWx0cyBhbmQgb3RoZXIgb2RkaXRpZXMpLgoKMi4gIFB5dGhvbiAxLjMgbm93IHN1cHBvcnRlZC4KCjMuICAjZGVmaW5lIGFuZCBlbnVtIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwgY29uc3RhbnRzLgoKNC4gIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgJWluY2x1ZGUgZGlyZWN0aXZlIGFuZCBtYWRlIGl0IGFsb3QgbW9yZSBwb3dlcmZ1bC4KCjUuICBSZXN0cnVjdHVyZWQgdGhlIFNXSUcgbGlicmFyeSB0byBtYWtlIGl0IHdvcmsgYmV0dGVyLgoKNi4gIFZhcmlvdXMgYnVnIGZpeGVzIHRvIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgaW1wbGVtZW50YXRpb25zLgoKNy4gIEJldHRlciBpbXBsZW1lbnRhdGlvbiBvZiAldHlwZWRlZiBkaXJlY3RpdmUuCgo4LiAgTWFkZSBzb21lIGNoYW5nZXMgdG8gU1dJRydzIGNsYXNzIHN0cnVjdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBleHBhbmQuCiAgICBTV0lHIGlzIG5vdyBidWlsdCBpbnRvIGEgbGlicmFyeSBmaWxlIHRoYXQgeW91IGNhbiB1c2UgdG8gbWFrZSB5b3VyCiAgICBvd24gZXh0ZW5pb25zLgoKOS4gIE1hZGUgZXh0ZW5zaXZlIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50YXRpb24uCgoxMC4gTWlub3IgY2hhbmdlcyB0byB0aGUgU1dJRyBwYXJzZXIgdG8gbWFrZSBpdCB1c2UgbGVzcyBtZW1vcnkuCiAgICBBbHNvIHRvb2sgb3V0IHNvbWUgZXh0cmFuZW91cyBydWxlcyB0aGF0IHdlcmUgdW5kb2N1bWVudGVkIGFuZAogICAgZGlkbid0IHdvcmsgaW4gdGhlIGZpcnN0IHBsYWNlLgoKMTEuIFRoZSBTV0lHIGxpYnJhcnkgZmlsZXMgInRjbHNoIiwgIndpc2giLCAiZXhwZWN0IiwgZXRjLi4uIGluIHRoZSBmaXJzdAogICAgcmVsZWFzZSBoYXZlIGJlZW4gcmVzdHJ1Y3R1cmVkIGFuZCByZW5hbWVkIHRvICJ0Y2xzaC5pIiwgIndpc2guaSIsCiAgICBhbmQgc28gb24uCg==