ICAgIC8qIG1vZHVsZS5jIC0gdGhlIG1vZHVsZSBpdHNlbGYKICAgICAqCiAgICAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgICAgKgogICAgICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgICAgKgogICAgICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICAgICAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKICAgICAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAgICAgKgogICAgICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgICAgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAgICAgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAgICAgKgogICAgICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAgICAgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKICAgICAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgICAgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogICAgICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogICAgICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICAgICAqLwoKI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJjYWNoZS5oIgojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgojaW5jbHVkZSAibWljcm9wcm90b2NvbHMuaCIKI2luY2x1ZGUgInJvdy5oIgoKI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAzMDAzCiNkZWZpbmUgSEFWRV9TSEFSRURfQ0FDSEUKI2VuZGlmCgovKiBzdGF0aWMgb2JqZWN0cyBhdCBtb2R1bGUtbGV2ZWwgKi8KClB5T2JqZWN0KiBFcnJvciwgKldhcm5pbmcsICpJbnRlcmZhY2VFcnJvciwgKkRhdGFiYXNlRXJyb3IsICpJbnRlcm5hbEVycm9yLAogICAgKk9wZXJhdGlvbmFsRXJyb3IsICpQcm9ncmFtbWluZ0Vycm9yLCAqSW50ZWdyaXR5RXJyb3IsICpEYXRhRXJyb3IsCiAgICAqTm90U3VwcG9ydGVkRXJyb3IsICpPcHRpbWl6ZWRVbmljb2RlOwoKUHlPYmplY3QqIGNvbnZlcnRlcnM7CmludCBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3M7CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9jb25uZWN0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCiAgICAgICAga3dhcmdzKQp7CiAgICAvKiBQeXRob24gc2VlbXMgdG8gaGF2ZSBubyB3YXkgb2YgZXh0cmFjdGluZyBhIHNpbmdsZSBrZXl3b3JkLWFyZyBhdAogICAgICogQy1sZXZlbCwgc28gdGhpcyBjb2RlIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBvbmUgaW4gY29ubmVjdGlvbl9pbml0IGluCiAgICAgKiBjb25uZWN0aW9uLmMgYW5kIG11c3QgYWx3YXlzIGJlIGNvcGllZCBmcm9tIHRoZXJlIC4uLiAqLwoKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKICAgIGNoYXIqIGRhdGFiYXNlOwogICAgaW50IGRldGVjdF90eXBlcyA9IDA7CiAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOwogICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOwogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkID0gMTsKICAgIGludCBjYWNoZWRfc3RhdGVtZW50czsKICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOwoKICAgIFB5T2JqZWN0KiByZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlOwogICAgfQoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZmFjdG9yeSwgYXJncywga3dhcmdzKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9jb21wbGV0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgIGt3YXJncykKewogICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzdGF0ZW1lbnQiLCBOVUxMLCBOVUxMfTsKICAgIGNoYXIqIHN0YXRlbWVudDsKCiAgICBQeU9iamVjdCogcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMiLCBrd2xpc3QsICZzdGF0ZW1lbnQpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICBpZiAoc3FsaXRlM19jb21wbGV0ZShzdGF0ZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CiAgICB9CgogICAgUHlfSU5DUkVGKHJlc3VsdCk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKI2lmZGVmIEhBVkVfU0hBUkVEX0NBQ0hFCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICBrd2FyZ3MpCnsKICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZG9fZW5hYmxlIiwgTlVMTCwgTlVMTH07CiAgICBpbnQgZG9fZW5hYmxlOwogICAgaW50IHJjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImkiLCBrd2xpc3QsICZkb19lbmFibGUpKQogICAgewogICAgICAgIHJldHVybiBOVUxMOyAKICAgIH0KCiAgICByYyA9IHNxbGl0ZTNfZW5hYmxlX3NoYXJlZF9jYWNoZShkb19lbmFibGUpOwoKICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkNoYW5naW5nIHRoZSBzaGFyZWRfY2FjaGUgZmxhZyBmYWlsZWQiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgfQp9CiNlbmRpZiAvKiBIQVZFX1NIQVJFRF9DQUNIRSAqLwoKc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5VHlwZU9iamVjdCogdHlwZTsKICAgIFB5T2JqZWN0KiBjYXN0ZXI7CiAgICBpbnQgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZ0eXBlLCAmY2FzdGVyKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHJjID0gbWljcm9wcm90b2NvbHNfYWRkKHR5cGUsIChQeU9iamVjdCopJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUsIGNhc3Rlcik7CiAgICBpZiAocmMgPT0gLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBQeU9iamVjdCogbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIGNoYXIqIG9yaWdfbmFtZTsKICAgIGNoYXIqIG5hbWUgPSBOVUxMOwogICAgY2hhciogYzsKICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic08iLCAmb3JpZ19uYW1lLCAmY2FsbGFibGUpKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogY29udmVydCB0aGUgbmFtZSB0byBsb3dlcmNhc2UgKi8KICAgIG5hbWUgPSBQeU1lbV9NYWxsb2Moc3RybGVuKG9yaWdfbmFtZSkgKyAyKTsKICAgIGlmICghbmFtZSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBzdHJjcHkobmFtZSwgb3JpZ19uYW1lKTsKICAgIGZvciAoYyA9IG5hbWU7ICpjICE9IChjaGFyKTA7IGMrKykgewogICAgICAgICpjID0gKCpjKSAmIDB4REY7CiAgICB9CgogICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGNvbnZlcnRlcnMsIG5hbWUsIGNhbGxhYmxlKSAhPSAwKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR2YWwgPSBQeV9Ob25lOwplcnJvcjoKICAgIGlmIChuYW1lKSB7CiAgICAgICAgUHlNZW1fRnJlZShuYW1lKTsKICAgIH0KICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyBQeU9iamVjdCogZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9Cgp2b2lkIGNvbnZlcnRlcnNfaW5pdChQeU9iamVjdCogZGljdCkKewogICAgY29udmVydGVycyA9IFB5RGljdF9OZXcoKTsKICAgIGlmICghY29udmVydGVycykgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiY29udmVydGVycyIsIGNvbnZlcnRlcnMpOwp9CgpzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKICAgIHsiY29ubmVjdCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2Nvbm5lY3QsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29ubmVjdGlvbi4iKX0sCiAgICB7ImNvbXBsZXRlX3N0YXRlbWVudCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2NvbXBsZXRlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiQ2hlY2tzIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKI2lmZGVmIEhBVkVfU0hBUkVEX0NBQ0hFCiAgICB7ImVuYWJsZV9zaGFyZWRfY2FjaGUiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiRW5hYmxlIG9yIGRpc2FibGUgc2hhcmVkIGNhY2hlIG1vZGUgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4gRXhwZXJpbWVudGFsL05vbi1zdGFuZGFyZC4iKX0sCiNlbmRpZgogICAgeyJyZWdpc3Rlcl9hZGFwdGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgd2l0aCBweXNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7InJlZ2lzdGVyX2NvbnZlcnRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGEgY29udmVydGVyIHdpdGggcHlzcWxpdGUuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICB7ImFkYXB0IiwgIChQeUNGdW5jdGlvbilwc3ljb19taWNyb3Byb3RvY29sc19hZGFwdCwgTUVUSF9WQVJBUkdTLCBwc3ljb19taWNyb3Byb3RvY29sc19hZGFwdF9kb2N9LAogICAgeyJlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyIsICAoUHlDRnVuY3Rpb24pZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJFbmFibGUgb3IgZGlzYWJsZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhyb3dpbmcgZXJyb3JzIHRvIHN0ZGVyci4iKX0sCiAgICB7TlVMTCwgTlVMTH0KfTsKCnN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIHsKICAgIGNoYXIqIGNvbnN0YW50X25hbWU7CiAgICBpbnQgY29uc3RhbnRfdmFsdWU7Cn07Cgp0eXBlZGVmIHN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIEludENvbnN0YW50UGFpcjsKCnN0YXRpYyBJbnRDb25zdGFudFBhaXIgX2ludF9jb25zdGFudHNbXSA9IHsKICAgIHsiUEFSU0VfREVDTFRZUEVTIiwgUEFSU0VfREVDTFRZUEVTfSwKICAgIHsiUEFSU0VfQ09MTkFNRVMiLCBQQVJTRV9DT0xOQU1FU30sCgogICAgeyJTUUxJVEVfT0siLCBTUUxJVEVfT0t9LAogICAgeyJTUUxJVEVfREVOWSIsIFNRTElURV9ERU5ZfSwKICAgIHsiU1FMSVRFX0lHTk9SRSIsIFNRTElURV9JR05PUkV9LAogICAgeyJTUUxJVEVfQ1JFQVRFX0lOREVYIiwgU1FMSVRFX0NSRUFURV9JTkRFWH0sCiAgICB7IlNRTElURV9DUkVBVEVfVEFCTEUiLCBTUUxJVEVfQ1JFQVRFX1RBQkxFfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX0lOREVYIiwgU1FMSVRFX0NSRUFURV9URU1QX0lOREVYfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1RBQkxFIiwgU1FMSVRFX0NSRUFURV9URU1QX1RBQkxFfSwKICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1RSSUdHRVIiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVFJJR0dFUn0sCiAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9WSUVXIiwgU1FMSVRFX0NSRUFURV9URU1QX1ZJRVd9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1RSSUdHRVIiLCBTUUxJVEVfQ1JFQVRFX1RSSUdHRVJ9LAogICAgeyJTUUxJVEVfQ1JFQVRFX1ZJRVciLCBTUUxJVEVfQ1JFQVRFX1ZJRVd9LAogICAgeyJTUUxJVEVfREVMRVRFIiwgU1FMSVRFX0RFTEVURX0sCiAgICB7IlNRTElURV9EUk9QX0lOREVYIiwgU1FMSVRFX0RST1BfSU5ERVh9LAogICAgeyJTUUxJVEVfRFJPUF9UQUJMRSIsIFNRTElURV9EUk9QX1RBQkxFfSwKICAgIHsiU1FMSVRFX0RST1BfVEVNUF9JTkRFWCIsIFNRTElURV9EUk9QX1RFTVBfSU5ERVh9LAogICAgeyJTUUxJVEVfRFJPUF9URU1QX1RBQkxFIiwgU1FMSVRFX0RST1BfVEVNUF9UQUJMRX0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfVFJJR0dFUiIsIFNRTElURV9EUk9QX1RFTVBfVFJJR0dFUn0sCiAgICB7IlNRTElURV9EUk9QX1RFTVBfVklFVyIsIFNRTElURV9EUk9QX1RFTVBfVklFV30sCiAgICB7IlNRTElURV9EUk9QX1RSSUdHRVIiLCBTUUxJVEVfRFJPUF9UUklHR0VSfSwKICAgIHsiU1FMSVRFX0RST1BfVklFVyIsIFNRTElURV9EUk9QX1ZJRVd9LAogICAgeyJTUUxJVEVfSU5TRVJUIiwgU1FMSVRFX0lOU0VSVH0sCiAgICB7IlNRTElURV9QUkFHTUEiLCBTUUxJVEVfUFJBR01BfSwKICAgIHsiU1FMSVRFX1JFQUQiLCBTUUxJVEVfUkVBRH0sCiAgICB7IlNRTElURV9TRUxFQ1QiLCBTUUxJVEVfU0VMRUNUfSwKICAgIHsiU1FMSVRFX1RSQU5TQUNUSU9OIiwgU1FMSVRFX1RSQU5TQUNUSU9OfSwKICAgIHsiU1FMSVRFX1VQREFURSIsIFNRTElURV9VUERBVEV9LAogICAgeyJTUUxJVEVfQVRUQUNIIiwgU1FMSVRFX0FUVEFDSH0sCiAgICB7IlNRTElURV9ERVRBQ0giLCBTUUxJVEVfREVUQUNIfSwKI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAxCiAgICB7IlNRTElURV9BTFRFUl9UQUJMRSIsIFNRTElURV9BTFRFUl9UQUJMRX0sCiAgICB7IlNRTElURV9SRUlOREVYIiwgU1FMSVRFX1JFSU5ERVh9LAojZW5kaWYKI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAzMDAwCiAgICB7IlNRTElURV9BTkFMWVpFIiwgU1FMSVRFX0FOQUxZWkV9LAojZW5kaWYKICAgIHsoY2hhciopTlVMTCwgMH0KfTsKClB5TU9ESU5JVF9GVU5DIGluaXRfc3FsaXRlMyh2b2lkKQp7CiAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKICAgIFB5T2JqZWN0ICp0bXBfb2JqOwogICAgaW50IGk7CgogICAgbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX3NxbGl0ZTMiLCBtb2R1bGVfbWV0aG9kcyk7CgogICAgaWYgKCFtb2R1bGUgfHwKICAgICAgICAocm93X3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChjdXJzb3Jfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKGNvbm5lY3Rpb25fc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKGNhY2hlX3NldHVwX3R5cGVzKCkgPCAwKSB8fAogICAgICAgIChzdGF0ZW1lbnRfc2V0dXBfdHlwZXMoKSA8IDApIHx8CiAgICAgICAgKHByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXMoKSA8IDApCiAgICAgICApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgUHlfSU5DUkVGKCZDb25uZWN0aW9uVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopICZDb25uZWN0aW9uVHlwZSk7CiAgICBQeV9JTkNSRUYoJkN1cnNvclR5cGUpOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkN1cnNvciIsIChQeU9iamVjdCopICZDdXJzb3JUeXBlKTsKICAgIFB5X0lOQ1JFRigmQ2FjaGVUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJTdGF0ZW1lbnQiLCAoUHlPYmplY3QqKSZTdGF0ZW1lbnRUeXBlKTsKICAgIFB5X0lOQ1JFRigmU3RhdGVtZW50VHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ2FjaGUiLCAoUHlPYmplY3QqKSAmQ2FjaGVUeXBlKTsKICAgIFB5X0lOQ1JFRigmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUHJlcGFyZVByb3RvY29sIiwgKFB5T2JqZWN0KikgJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUpOwogICAgUHlfSU5DUkVGKCZSb3dUeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJSb3ciLCAoUHlPYmplY3QqKSAmUm93VHlwZSk7CgogICAgaWYgKCEoZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIC8qKiogQ3JlYXRlIERCLUFQSSBFeGNlcHRpb24gaGllcmFyY2h5ICovCgogICAgaWYgKCEoRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5FcnJvciIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRXJyb3IiLCBFcnJvcik7CgogICAgaWYgKCEoV2FybmluZyA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLldhcm5pbmciLCBQeUV4Y19TdGFuZGFyZEVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIldhcm5pbmciLCBXYXJuaW5nKTsKCiAgICAvKiBFcnJvciBzdWJjbGFzc2VzICovCgogICAgaWYgKCEoSW50ZXJmYWNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcmZhY2VFcnJvciIsIEVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVyZmFjZUVycm9yIiwgSW50ZXJmYWNlRXJyb3IpOwoKICAgIGlmICghKERhdGFiYXNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhYmFzZUVycm9yIiwgRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRGF0YWJhc2VFcnJvciIsIERhdGFiYXNlRXJyb3IpOwoKICAgIC8qIERhdGFiYXNlRXJyb3Igc3ViY2xhc3NlcyAqLwoKICAgIGlmICghKEludGVybmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcm5hbEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlcm5hbEVycm9yIiwgSW50ZXJuYWxFcnJvcik7CgogICAgaWYgKCEoT3BlcmF0aW9uYWxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLk9wZXJhdGlvbmFsRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wZXJhdGlvbmFsRXJyb3IiLCBPcGVyYXRpb25hbEVycm9yKTsKCiAgICBpZiAoIShQcm9ncmFtbWluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuUHJvZ3JhbW1pbmdFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUHJvZ3JhbW1pbmdFcnJvciIsIFByb2dyYW1taW5nRXJyb3IpOwoKICAgIGlmICghKEludGVncml0eUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZWdyaXR5RXJyb3IiLCBEYXRhYmFzZUVycm9yLE5VTEwpKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZWdyaXR5RXJyb3IiLCBJbnRlZ3JpdHlFcnJvcik7CgogICAgaWYgKCEoRGF0YUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuRGF0YUVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhRXJyb3IiLCBEYXRhRXJyb3IpOwoKICAgIGlmICghKE5vdFN1cHBvcnRlZEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuTm90U3VwcG9ydGVkRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk5vdFN1cHBvcnRlZEVycm9yIiwgTm90U3VwcG9ydGVkRXJyb3IpOwoKICAgIC8qIFdlIGp1c3QgbmVlZCAic29tZXRoaW5nIiB1bmlxdWUgZm9yIE9wdGltaXplZFVuaWNvZGUuIEl0IGRvZXMgbm90IHJlYWxseQogICAgICogbmVlZCB0byBiZSBhIHN0cmluZyBzdWJjbGFzcy4gSnVzdCBhbnl0aGluZyB0aGF0IGNhbiBhY3QgYXMgYSBzcGVjaWFsCiAgICAgKiBtYXJrZXIgZm9yIHVzLiBTbyBJIHB1bGxlZCBQeUNlbGxfVHlwZSBvdXQgb2YgbXkgbWFnaWMgaGF0LgogICAgICovCiAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlDZWxsX1R5cGUpOwogICAgT3B0aW1pemVkVW5pY29kZSA9IChQeU9iamVjdCopJlB5Q2VsbF9UeXBlOwogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wdGltaXplZFVuaWNvZGUiLCBPcHRpbWl6ZWRVbmljb2RlKTsKCiAgICAvKiBTZXQgaW50ZWdlciBjb25zdGFudHMgKi8KICAgIGZvciAoaSA9IDA7IF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUgIT0gMDsgaSsrKSB7CiAgICAgICAgdG1wX29iaiA9IFB5SW50X0Zyb21Mb25nKF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X3ZhbHVlKTsKICAgICAgICBpZiAoIXRtcF9vYmopIHsKICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICB9CiAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfbmFtZSwgdG1wX29iaik7CiAgICAgICAgUHlfREVDUkVGKHRtcF9vYmopOwogICAgfQoKICAgIGlmICghKHRtcF9vYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFBZU1FMSVRFX1ZFUlNJT04pKSkgewogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAidmVyc2lvbiIsIHRtcF9vYmopOwogICAgUHlfREVDUkVGKHRtcF9vYmopOwoKICAgIGlmICghKHRtcF9vYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHNxbGl0ZTNfbGlidmVyc2lvbigpKSkpIHsKICAgICAgICBnb3RvIGVycm9yOwogICAgfQogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgInNxbGl0ZV92ZXJzaW9uIiwgdG1wX29iaik7CiAgICBQeV9ERUNSRUYodG1wX29iaik7CgogICAgLyogaW5pdGlhbGl6ZSBtaWNyb3Byb3RvY29scyBsYXllciAqLwogICAgbWljcm9wcm90b2NvbHNfaW5pdChkaWN0KTsKCiAgICAvKiBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGNvbnZlcnRlcnMgKi8KICAgIGNvbnZlcnRlcnNfaW5pdChkaWN0KTsKCiAgICBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MgPSAwOwoKICAgIC8qIE9yaWdpbmFsIGNvbW1lbnQgZm9ybSBfYnNkZGIuYyBpbiB0aGUgUHl0aG9uIGNvcmUuIFRoaXMgaXMgYWxzbyBzdGlsbAogICAgICogbmVlZGVkIG5vd2FkYXlzIGZvciBQeXRob24gMi4zLzIuNC4KICAgICAqIAogICAgICogUHlFdmFsX0luaXRUaHJlYWRzIGlzIGNhbGxlZCBoZXJlIGR1ZSB0byBhIHF1aXJrIGluIHB5dGhvbiAxLjUKICAgICAqIC0gMi4yLjEgKGF0IGxlYXN0KSBhY2NvcmRpbmcgdG8gUnVzc2VsbCBXaWxsaWFtc29uIDxtZXJlbEB3dC5uZXQ+OgogICAgICogVGhlIGdsb2JhbCBpbnRlcmVwcmV0ZXIgbG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIGZpcnN0CiAgICAgKiB0aHJlYWQgaXMgY3JlYXRlZCB1c2luZyB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG9yIGZvcmsoKSBpcwogICAgICogY2FsbGVkLiAgdGhhdCB3b3VsZCBjYXVzZSB0aGUgQUxMT1dfVEhSRUFEUyBoZXJlIHRvIHNlZ2ZhdWx0IGR1ZQogICAgICogdG8gYSBudWxsIHBvaW50ZXIgcmVmZXJlbmNlIGlmIG5vIHRocmVhZHMgb3IgY2hpbGQgcHJvY2Vzc2VzCiAgICAgKiBoYXZlIGJlZW4gY3JlYXRlZC4gIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgYW5kIGlzIGEgbm8tb3AgaWYKICAgICAqIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCiAgICAgKiAgKHNlZSBweWJzZGRiLXVzZXJzIG1haWxpbmcgbGlzdCBwb3N0IG9uIDIwMDItMDgtMDcpCiAgICAgKi8KICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOwoKZXJyb3I6CiAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIE1PRFVMRV9OQU1FICI6IGluaXQgZmFpbGVkIik7CiAgICB9Cn0K