LyogbW9kdWxlLmMgLSB0aGUgbW9kdWxlIGl0c2VsZgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAiY29ubmVjdGlvbi5oIgojaW5jbHVkZSAic3RhdGVtZW50LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicm93LmgiCgojaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKI2RlZmluZSBIQVZFX1NIQVJFRF9DQUNIRQojZW5kaWYKCi8qIHN0YXRpYyBvYmplY3RzIGF0IG1vZHVsZS1sZXZlbCAqLwoKUHlPYmplY3QqIHB5c3FsaXRlX0Vycm9yLCAqcHlzcWxpdGVfV2FybmluZywgKnB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAqcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwKICAgICpweXNxbGl0ZV9JbnRlcm5hbEVycm9yLCAqcHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgKnB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsCiAgICAqcHlzcWxpdGVfSW50ZWdyaXR5RXJyb3IsICpweXNxbGl0ZV9EYXRhRXJyb3IsICpweXNxbGl0ZV9Ob3RTdXBwb3J0ZWRFcnJvciwgKnB5c3FsaXRlX09wdGltaXplZFVuaWNvZGU7CgpQeU9iamVjdCogY29udmVydGVyczsKaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsKaW50IHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZDsKCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIC8qIFB5dGhvbiBzZWVtcyB0byBoYXZlIG5vIHdheSBvZiBleHRyYWN0aW5nIGEgc2luZ2xlIGtleXdvcmQtYXJnIGF0CiAgICAgKiBDLWxldmVsLCBzbyB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IHdpdGggdGhlIG9uZSBpbiBjb25uZWN0aW9uX2luaXQgaW4KICAgICAqIGNvbm5lY3Rpb24uYyBhbmQgbXVzdCBhbHdheXMgYmUgY29waWVkIGZyb20gdGhlcmUgLi4uICovCgogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OwogICAgY2hhciogZGF0YWJhc2U7CiAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7CiAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CiAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQgPSAxOwogICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzOwogICAgZG91YmxlIHRpbWVvdXQgPSA1LjA7CgogICAgUHlPYmplY3QqIHJlc3VsdDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfGRpT2lPaSIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7IAogICAgfQoKICAgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKICAgICAgICBmYWN0b3J5ID0gKFB5T2JqZWN0KikmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGU7CiAgICB9CgogICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmYWN0b3J5LCBhcmdzLCBrd2FyZ3MpOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KClB5RG9jX1NUUlZBUihtb2R1bGVfY29ubmVjdF9kb2MsCiJjb25uZWN0KGRhdGFiYXNlWywgdGltZW91dCwgaXNvbGF0aW9uX2xldmVsLCBkZXRlY3RfdHlwZXMsIGZhY3RvcnldKVxuXApcblwKT3BlbnMgYSBjb25uZWN0aW9uIHRvIHRoZSBTUUxpdGUgZGF0YWJhc2UgZmlsZSAqZGF0YWJhc2UqLiBZb3UgY2FuIHVzZVxuXApcIjptZW1vcnk6XCIgdG8gb3BlbiBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSB0aGF0IHJlc2lkZXMgaW5cblwKUkFNIGluc3RlYWQgb2Ygb24gZGlzay4iKTsKCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2NvbXBsZXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAga3dhcmdzKQp7CiAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InN0YXRlbWVudCIsIE5VTEwsIE5VTEx9OwogICAgY2hhciogc3RhdGVtZW50OwoKICAgIFB5T2JqZWN0KiByZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyIsIGt3bGlzdCwgJnN0YXRlbWVudCkpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7IAogICAgfQoKICAgIGlmIChzcWxpdGUzX2NvbXBsZXRlKHN0YXRlbWVudCkpIHsKICAgICAgICByZXN1bHQgPSBQeV9UcnVlOwogICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBQeV9GYWxzZTsKICAgIH0KCiAgICBQeV9JTkNSRUYocmVzdWx0KTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgpQeURvY19TVFJWQVIobW9kdWxlX2NvbXBsZXRlX2RvYywKImNvbXBsZXRlX3N0YXRlbWVudChzcWwpXG5cClxuXApDaGVja3MgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBjb21wbGV0ZSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIik7CgojaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkb19lbmFibGUiLCBOVUxMLCBOVUxMfTsKICAgIGludCBkb19lbmFibGU7CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaSIsIGt3bGlzdCwgJmRvX2VuYWJsZSkpCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7IAogICAgfQoKICAgIHJjID0gc3FsaXRlM19lbmFibGVfc2hhcmVkX2NhY2hlKGRvX2VuYWJsZSk7CgogICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiQ2hhbmdpbmcgdGhlIHNoYXJlZF9jYWNoZSBmbGFnIGZhaWxlZCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICB9Cn0KClB5RG9jX1NUUlZBUihtb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZV9kb2MsCiJlbmFibGVfc2hhcmVkX2NhY2hlKGRvX2VuYWJsZSlcblwKXG5cCkVuYWJsZSBvciBkaXNhYmxlIHNoYXJlZCBjYWNoZSBtb2RlIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuXG5cCkV4cGVyaW1lbnRhbC9Ob24tc3RhbmRhcmQuIik7CiNlbmRpZiAvKiBIQVZFX1NIQVJFRF9DQUNIRSAqLwoKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5VHlwZU9iamVjdCogdHlwZTsKICAgIFB5T2JqZWN0KiBjYXN0ZXI7CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZ0eXBlLCAmY2FzdGVyKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIGEgYmFzaWMgdHlwZSBpcyBhZGFwdGVkOyB0aGVyZSdzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlmIHRoYXQncyBub3QgdGhlIGNhc2UKICAgICAqICg5OSAlIG9mIGFsbCB1c2FnZXMpICovCiAgICBpZiAodHlwZSA9PSAmUHlMb25nX1R5cGUgfHwgdHlwZSA9PSAmUHlGbG9hdF9UeXBlCiAgICAgICAgICAgIHx8IHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlIHx8IHR5cGUgPT0gJlB5Qnl0ZUFycmF5X1R5cGUpIHsKICAgICAgICBweXNxbGl0ZV9CYXNlVHlwZUFkYXB0ZWQgPSAxOwogICAgfQoKICAgIHJjID0gcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfYWRkKHR5cGUsIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIGNhc3Rlcik7CiAgICBpZiAocmMgPT0gLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcl9kb2MsCiJyZWdpc3Rlcl9hZGFwdGVyKHR5cGUsIGNhbGxhYmxlKVxuXApcblwKUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgd2l0aCBweXNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIE5vbi1zdGFuZGFyZC4iKTsKCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIFB5T2JqZWN0KiBvcmlnX25hbWU7CiAgICBQeU9iamVjdCogbmFtZSA9IE5VTEw7CiAgICBQeU9iamVjdCogY2FsbGFibGU7CiAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVPIiwgJm9yaWdfbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIGNvbnZlcnQgdGhlIG5hbWUgdG8gdXBwZXIgY2FzZSAqLwogICAgbmFtZSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob3JpZ19uYW1lLCAidXBwZXIiLCAiIik7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGlmIChQeURpY3RfU2V0SXRlbShjb252ZXJ0ZXJzLCBuYW1lLCBjYWxsYWJsZSkgIT0gMCkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dmFsID0gUHlfTm9uZTsKZXJyb3I6CiAgICBQeV9YREVDUkVGKG5hbWUpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKUHlEb2NfU1RSVkFSKG1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXJfZG9jLAoicmVnaXN0ZXJfY29udmVydGVyKHR5cGVuYW1lLCBjYWxsYWJsZSlcblwKXG5cClJlZ2lzdGVycyBhIGNvbnZlcnRlciB3aXRoIHB5c3FsaXRlLiBOb24tc3RhbmRhcmQuIik7CgpzdGF0aWMgUHlPYmplY3QqIGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJl9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKUHlEb2NfU1RSVkFSKGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzX2RvYywKImVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKGZsYWcpXG5cClxuXApFbmFibGUgb3IgZGlzYWJsZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhyb3dpbmcgZXJyb3JzIHRvIHN0ZGVyci4iKTsKCnN0YXRpYyB2b2lkIGNvbnZlcnRlcnNfaW5pdChQeU9iamVjdCogZGljdCkKewogICAgY29udmVydGVycyA9IFB5RGljdF9OZXcoKTsKICAgIGlmICghY29udmVydGVycykgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiY29udmVydGVycyIsIGNvbnZlcnRlcnMpOwp9CgpzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKICAgIHsiY29ubmVjdCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2Nvbm5lY3QsCiAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbW9kdWxlX2Nvbm5lY3RfZG9jfSwKICAgIHsiY29tcGxldGVfc3RhdGVtZW50IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29tcGxldGUsCiAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbW9kdWxlX2NvbXBsZXRlX2RvY30sCiNpZmRlZiBIQVZFX1NIQVJFRF9DQUNIRQogICAgeyJlbmFibGVfc2hhcmVkX2NhY2hlIiwgIChQeUNGdW5jdGlvbiltb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZSwKICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZV9kb2N9LAojZW5kaWYKICAgIHsicmVnaXN0ZXJfYWRhcHRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfYWRhcHRlciwKICAgICBNRVRIX1ZBUkFSR1MsIG1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyX2RvY30sCiAgICB7InJlZ2lzdGVyX2NvbnZlcnRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyLAogICAgIE1FVEhfVkFSQVJHUywgbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlcl9kb2N9LAogICAgeyJhZGFwdCIsICAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfYWRhcHQsIE1FVEhfVkFSQVJHUywKICAgICBweXNxbGl0ZV9hZGFwdF9kb2N9LAogICAgeyJlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyIsICAoUHlDRnVuY3Rpb24pZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MsCiAgICAgTUVUSF9WQVJBUkdTLCBlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrc19kb2N9LAogICAge05VTEwsIE5VTEx9Cn07CgpzdHJ1Y3QgX0ludENvbnN0YW50UGFpciB7CiAgICBjaGFyKiBjb25zdGFudF9uYW1lOwogICAgaW50IGNvbnN0YW50X3ZhbHVlOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ludENvbnN0YW50UGFpciBJbnRDb25zdGFudFBhaXI7CgpzdGF0aWMgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CiAgICB7IlBBUlNFX0RFQ0xUWVBFUyIsIFBBUlNFX0RFQ0xUWVBFU30sCiAgICB7IlBBUlNFX0NPTE5BTUVTIiwgUEFSU0VfQ09MTkFNRVN9LAoKICAgIHsiU1FMSVRFX09LIiwgU1FMSVRFX09LfSwKICAgIHsiU1FMSVRFX0RFTlkiLCBTUUxJVEVfREVOWX0sCiAgICB7IlNRTElURV9JR05PUkUiLCBTUUxJVEVfSUdOT1JFfSwKICAgIHsiU1FMSVRFX0NSRUFURV9JTkRFWCIsIFNRTElURV9DUkVBVEVfSU5ERVh9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RBQkxFIiwgU1FMSVRFX0NSRUFURV9UQUJMRX0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9JTkRFWCIsIFNRTElURV9DUkVBVEVfVEVNUF9JTkRFWH0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9UQUJMRSIsIFNRTElURV9DUkVBVEVfVEVNUF9UQUJMRX0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9UUklHR0VSIiwgU1FMSVRFX0NSRUFURV9URU1QX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVklFVyIsIFNRTElURV9DUkVBVEVfVEVNUF9WSUVXfSwKICAgIHsiU1FMSVRFX0NSRUFURV9UUklHR0VSIiwgU1FMSVRFX0NSRUFURV9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0NSRUFURV9WSUVXIiwgU1FMSVRFX0NSRUFURV9WSUVXfSwKICAgIHsiU1FMSVRFX0RFTEVURSIsIFNRTElURV9ERUxFVEV9LAogICAgeyJTUUxJVEVfRFJPUF9JTkRFWCIsIFNRTElURV9EUk9QX0lOREVYfSwKICAgIHsiU1FMSVRFX0RST1BfVEFCTEUiLCBTUUxJVEVfRFJPUF9UQUJMRX0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfSU5ERVgiLCBTUUxJVEVfRFJPUF9URU1QX0lOREVYfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9UQUJMRSIsIFNRTElURV9EUk9QX1RFTVBfVEFCTEV9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX1RSSUdHRVIiLCBTUUxJVEVfRFJPUF9URU1QX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX1ZJRVciLCBTUUxJVEVfRFJPUF9URU1QX1ZJRVd9LAogICAgeyJTUUxJVEVfRFJPUF9UUklHR0VSIiwgU1FMSVRFX0RST1BfVFJJR0dFUn0sCiAgICB7IlNRTElURV9EUk9QX1ZJRVciLCBTUUxJVEVfRFJPUF9WSUVXfSwKICAgIHsiU1FMSVRFX0lOU0VSVCIsIFNRTElURV9JTlNFUlR9LAogICAgeyJTUUxJVEVfUFJBR01BIiwgU1FMSVRFX1BSQUdNQX0sCiAgICB7IlNRTElURV9SRUFEIiwgU1FMSVRFX1JFQUR9LAogICAgeyJTUUxJVEVfU0VMRUNUIiwgU1FMSVRFX1NFTEVDVH0sCiAgICB7IlNRTElURV9UUkFOU0FDVElPTiIsIFNRTElURV9UUkFOU0FDVElPTn0sCiAgICB7IlNRTElURV9VUERBVEUiLCBTUUxJVEVfVVBEQVRFfSwKICAgIHsiU1FMSVRFX0FUVEFDSCIsIFNRTElURV9BVFRBQ0h9LAogICAgeyJTUUxJVEVfREVUQUNIIiwgU1FMSVRFX0RFVEFDSH0sCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMjAwMQogICAgeyJTUUxJVEVfQUxURVJfVEFCTEUiLCBTUUxJVEVfQUxURVJfVEFCTEV9LAogICAgeyJTUUxJVEVfUkVJTkRFWCIsIFNRTElURV9SRUlOREVYfSwKI2VuZGlmCiNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMAogICAgeyJTUUxJVEVfQU5BTFlaRSIsIFNRTElURV9BTkFMWVpFfSwKI2VuZGlmCiAgICB7KGNoYXIqKU5VTEwsIDB9Cn07CgoKc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBfc3FsaXRlM21vZHVsZSA9IHsKCVB5TW9kdWxlRGVmX0hFQURfSU5JVCwKCSJfc3FsaXRlMyIsCglOVUxMLAoJLTEsCgltb2R1bGVfbWV0aG9kcywKCU5VTEwsCglOVUxMLAoJTlVMTCwKCU5VTEwKfTsKClB5TU9ESU5JVF9GVU5DIFB5SW5pdF9fc3FsaXRlMyh2b2lkKQp7CiAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKICAgIFB5T2JqZWN0ICp0bXBfb2JqOwogICAgaW50IGk7CgogICAgbW9kdWxlID0gUHlNb2R1bGVfQ3JlYXRlKCZfc3FsaXRlM21vZHVsZSk7CgogICAgaWYgKCFtb2R1bGUgfHwKICAgICAgICAocHlzcWxpdGVfcm93X3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChweXNxbGl0ZV9jdXJzb3Jfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX2NhY2hlX3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChweXNxbGl0ZV9zdGF0ZW1lbnRfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHB5c3FsaXRlX3ByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXMoKSA8IDApCiAgICAgICApIHsKCVB5X0RFQ1JFRihtb2R1bGUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkNvbm5lY3Rpb24iLCAoUHlPYmplY3QqKSAmcHlzcWxpdGVfQ29ubmVjdGlvblR5cGUpOwogICAgUHlfSU5DUkVGKCZweXNxbGl0ZV9DdXJzb3JUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJDdXJzb3IiLCAoUHlPYmplY3QqKSAmcHlzcWxpdGVfQ3Vyc29yVHlwZSk7CiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX0NhY2hlVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiU3RhdGVtZW50IiwgKFB5T2JqZWN0KikmcHlzcWxpdGVfU3RhdGVtZW50VHlwZSk7CiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX1N0YXRlbWVudFR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkNhY2hlIiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX0NhY2hlVHlwZSk7CiAgICBQeV9JTkNSRUYoJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlByZXBhcmVQcm90b2NvbCIsIChQeU9iamVjdCopICZweXNxbGl0ZV9QcmVwYXJlUHJvdG9jb2xUeXBlKTsKICAgIFB5X0lOQ1JFRigmcHlzcWxpdGVfUm93VHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUm93IiwgKFB5T2JqZWN0KikgJnB5c3FsaXRlX1Jvd1R5cGUpOwoKICAgIGlmICghKGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICAvKioqIENyZWF0ZSBEQi1BUEkgRXhjZXB0aW9uIGhpZXJhcmNoeSAqLwoKICAgIGlmICghKHB5c3FsaXRlX0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRXJyb3IiLCBQeUV4Y19FeGNlcHRpb24sIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRXJyb3IiLCBweXNxbGl0ZV9FcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfV2FybmluZyA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLldhcm5pbmciLCBQeUV4Y19FeGNlcHRpb24sIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiV2FybmluZyIsIHB5c3FsaXRlX1dhcm5pbmcpOwoKICAgIC8qIEVycm9yIHN1YmNsYXNzZXMgKi8KCiAgICBpZiAoIShweXNxbGl0ZV9JbnRlcmZhY2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVyZmFjZUVycm9yIiwgcHlzcWxpdGVfRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZXJmYWNlRXJyb3IiLCBweXNxbGl0ZV9JbnRlcmZhY2VFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfRGF0YWJhc2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkRhdGFiYXNlRXJyb3IiLCBweXNxbGl0ZV9FcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhYmFzZUVycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvcik7CgogICAgLyogcHlzcWxpdGVfRGF0YWJhc2VFcnJvciBzdWJjbGFzc2VzICovCgogICAgaWYgKCEocHlzcWxpdGVfSW50ZXJuYWxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkludGVybmFsRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVybmFsRXJyb3IiLCBweXNxbGl0ZV9JbnRlcm5hbEVycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuT3BlcmF0aW9uYWxFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3BlcmF0aW9uYWxFcnJvciIsIHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IpOwoKICAgIGlmICghKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5Qcm9ncmFtbWluZ0Vycm9yIiwgcHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJQcm9ncmFtbWluZ0Vycm9yIiwgcHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfSW50ZWdyaXR5RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlZ3JpdHlFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlZ3JpdHlFcnJvciIsIHB5c3FsaXRlX0ludGVncml0eUVycm9yKTsKCiAgICBpZiAoIShweXNxbGl0ZV9EYXRhRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhRXJyb3IiLCBweXNxbGl0ZV9EYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkRhdGFFcnJvciIsIHB5c3FsaXRlX0RhdGFFcnJvcik7CgogICAgaWYgKCEocHlzcWxpdGVfTm90U3VwcG9ydGVkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5Ob3RTdXBwb3J0ZWRFcnJvciIsIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiTm90U3VwcG9ydGVkRXJyb3IiLCBweXNxbGl0ZV9Ob3RTdXBwb3J0ZWRFcnJvcik7CgogICAgLyogV2UganVzdCBuZWVkICJzb21ldGhpbmciIHVuaXF1ZSBmb3IgcHlzcWxpdGVfT3B0aW1pemVkVW5pY29kZS4gSXQgZG9lcyBub3QgcmVhbGx5CiAgICAgKiBuZWVkIHRvIGJlIGEgc3RyaW5nIHN1YmNsYXNzLiBKdXN0IGFueXRoaW5nIHRoYXQgY2FuIGFjdCBhcyBhIHNwZWNpYWwKICAgICAqIG1hcmtlciBmb3IgdXMuIFNvIEkgcHVsbGVkIFB5Q2VsbF9UeXBlIG91dCBvZiBteSBtYWdpYyBoYXQuCiAgICAgKi8KICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKSZQeUNlbGxfVHlwZSk7CiAgICBweXNxbGl0ZV9PcHRpbWl6ZWRVbmljb2RlID0gKFB5T2JqZWN0KikmUHlDZWxsX1R5cGU7CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3B0aW1pemVkVW5pY29kZSIsIHB5c3FsaXRlX09wdGltaXplZFVuaWNvZGUpOwoKICAgIC8qIFNldCBpbnRlZ2VyIGNvbnN0YW50cyAqLwogICAgZm9yIChpID0gMDsgX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfbmFtZSAhPSAwOyBpKyspIHsKICAgICAgICB0bXBfb2JqID0gUHlMb25nX0Zyb21Mb25nKF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X3ZhbHVlKTsKICAgICAgICBpZiAoIXRtcF9vYmopIHsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CiAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfbmFtZSwgdG1wX29iaik7CiAgICAgICAgUHlfREVDUkVGKHRtcF9vYmopOwogICAgfQoKICAgIGlmICghKHRtcF9vYmogPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhQWVNRTElURV9WRVJTSU9OKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgInZlcnNpb24iLCB0bXBfb2JqKTsKICAgIFB5X0RFQ1JFRih0bXBfb2JqKTsKCiAgICBpZiAoISh0bXBfb2JqID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoc3FsaXRlM19saWJ2ZXJzaW9uKCkpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAic3FsaXRlX3ZlcnNpb24iLCB0bXBfb2JqKTsKICAgIFB5X0RFQ1JFRih0bXBfb2JqKTsKCiAgICAvKiBpbml0aWFsaXplIG1pY3JvcHJvdG9jb2xzIGxheWVyICovCiAgICBweXNxbGl0ZV9taWNyb3Byb3RvY29sc19pbml0KGRpY3QpOwoKICAgIC8qIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgY29udmVydGVycyAqLwogICAgY29udmVydGVyc19pbml0KGRpY3QpOwoKICAgIF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyA9IDA7CgogICAgcHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkID0gMDsKCiAgICAvKiBPcmlnaW5hbCBjb21tZW50IGZyb20gX2JzZGRiLmMgaW4gdGhlIFB5dGhvbiBjb3JlLiBUaGlzIGlzIGFsc28gc3RpbGwKICAgICAqIG5lZWRlZCBub3dhZGF5cyBmb3IgUHl0aG9uIDIuMy8yLjQuCiAgICAgKiAKICAgICAqIFB5RXZhbF9Jbml0VGhyZWFkcyBpcyBjYWxsZWQgaGVyZSBkdWUgdG8gYSBxdWlyayBpbiBweXRob24gMS41CiAgICAgKiAtIDIuMi4xIChhdCBsZWFzdCkgYWNjb3JkaW5nIHRvIFJ1c3NlbGwgV2lsbGlhbXNvbiA8bWVyZWxAd3QubmV0PjoKICAgICAqIFRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIGZpcnN0CiAgICAgKiB0aHJlYWQgaXMgY3JlYXRlZCB1c2luZyB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG9yIGZvcmsoKSBpcwogICAgICogY2FsbGVkLiAgdGhhdCB3b3VsZCBjYXVzZSB0aGUgQUxMT1dfVEhSRUFEUyBoZXJlIHRvIHNlZ2ZhdWx0IGR1ZQogICAgICogdG8gYSBudWxsIHBvaW50ZXIgcmVmZXJlbmNlIGlmIG5vIHRocmVhZHMgb3IgY2hpbGQgcHJvY2Vzc2VzCiAgICAgKiBoYXZlIGJlZW4gY3JlYXRlZC4gIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgYW5kIGlzIGEgbm8tb3AgaWYKICAgICAqIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCiAgICAgKiAgKHNlZSBweWJzZGRiLXVzZXJzIG1haWxpbmcgbGlzdCBwb3N0IG9uIDIwMDItMDgtMDcpCiAgICAgKi8KI2lmZGVmIFdJVEhfVEhSRUFECiAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsKI2VuZGlmCgplcnJvcjoKICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgTU9EVUxFX05BTUUgIjogaW5pdCBmYWlsZWQiKTsKCVB5X0RFQ1JFRihtb2R1bGUpOwoJbW9kdWxlID0gTlVMTDsKICAgIH0KICAgIHJldHVybiBtb2R1bGU7Cn0K