Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiY29kZV9lbnYuaCIKI2luY2x1ZGUgInNicl9yb20uaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzCiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIEh1ZmZtYW4gVGFibGVzIGRlcGVuZGVudCBvbiBjaG9zZW4gYW1wX3JlcwogcmV0dXJuczogICAgICBlcnJvciBoYW5kbGUKIGlucHV0Ogogb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVApGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaGVudiwKICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaG5vaXNlLAogICAgICAgICAgICAgICAgICAgICAgQU1QX1JFUyAgICAgICAgICAgICAgICAgICBhbXBfcmVzKQp7CiAgaWYgKCAoIWhlbnYpICB8fCAgKCFobm9pc2UpICB8fCAoIXNickVudkRhdGEpICkKICAgIHJldHVybiAoMSk7IC8qIG5vdCBpbml0LiAqLwoKICBzYnJFbnZEYXRhLT5pbml0X3Nicl9hbXBfcmVzID0gYW1wX3JlczsKCiAgc3dpdGNoIChhbXBfcmVzKSB7CiAgY2FzZSAgU0JSX0FNUF9SRVNfM18wOgogICAgLyplbnZlbG9wZSBkYXRhKi8KCiAgICAvKkxldmVsL1BhbiAtIGNvZGluZyAqLwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUOwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUOwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVDID0gYm9va1NickVudkJhbGFuY2VDMTFUOwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gYm9va1NickVudkJhbGFuY2VMMTFUOwoKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUMgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IGJvb2tTYnJFbnZCYWxhbmNlTDExRjsKCiAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVDsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVMICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVDsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRjsKCiAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2UgID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExOwogICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYgICAgICAgICA9IENPREVfQk9PS19TQ0ZfTEFWMTE7CgogICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzICAgICAgICAgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzNfMDsKICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlICAgPSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzNfMDsKICAgIGJyZWFrOwoKICBjYXNlIFNCUl9BTVBfUkVTXzFfNToKICAgLyplbnZlbG9wZSBkYXRhKi8KCiAgICAvKkxldmVsL1BhbiAtIGNvZGluZyAqLwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUOwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUOwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVDID0gYm9va1NickVudkJhbGFuY2VDMTBUOwogICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gYm9va1NickVudkJhbGFuY2VMMTBUOwoKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUMgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzEwRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IGJvb2tTYnJFbnZCYWxhbmNlTDEwRjsKCiAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVDsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVMICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVDsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRjsKICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRjsKCiAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2UgPSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTA7CiAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdiA9IENPREVfQk9PS19TQ0ZfTEFWMTA7CgogICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzICAgICAgICAgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzFfNTsKICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlICAgPSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzFfNTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgcmV0dXJuICgxKTsgLyogdW5kZWZpbmVkIGFtcF9yZXMgbW9kZSAqLwogIH0KCiAgLyogdGhlc2UgYXJlIGNvbW1vbiB0byBib3RoIGFtcF9yZXMgdmFsdWVzICovCiAgLypOb2lzZSBkYXRhKi8KCiAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUMgICA9IHZfSHVmZl9Ob2lzZUxldmVsQzExVDsKICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUwgICA9IHZfSHVmZl9Ob2lzZUxldmVsTDExVDsKICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lQyA9IGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUOwogIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVMID0gYm9va1Nick5vaXNlQmFsYW5jZUwxMVQ7CgogIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGOwogIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOwogIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFDID0gYm9va1NickVudkJhbGFuY2VDMTFGOwogIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMID0gYm9va1NickVudkJhbGFuY2VMMTFGOwoKCiAgLypSaWdodC9MZWZ0IC0gY29kaW5nICovCiAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VUaW1lQyAgICAgICAgPSB2X0h1ZmZfTm9pc2VMZXZlbEMxMVQ7CiAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VUaW1lTCAgICAgICAgPSB2X0h1ZmZfTm9pc2VMZXZlbEwxMVQ7CiAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxQyAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7CiAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CgogIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzICAgICAgICAgPSBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19BTVBfUkVTXzNfMDsKICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0c19iYWxhbmNlID0gU0lfU0JSX1NUQVJUX05PSVNFX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzNfMDsKCgogIC8qIGluaXQgZW52ZWxvcGUgdGFibGVzIGFuZCBjb2RlYm9va3MgKi8KICBoZW52LT5jb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lID0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlOwogIGhlbnYtPmNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXEgPSBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2U7CiAgaGVudi0+Y29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUgPSBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdjsKICBoZW52LT5jb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2OwogIGhlbnYtPmNvZGVCb29rU2NmTGF2VGltZSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2OwogIGhlbnYtPmNvZGVCb29rU2NmTGF2RnJlcSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2OwoKICBoZW52LT5odWZmdGFibGVMZXZlbFRpbWVMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTDsKICBoZW52LT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUw7CiAgaGVudi0+aHVmZnRhYmxlVGltZUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTDsKICBoZW52LT5odWZmdGFibGVMZXZlbEZyZXFMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTDsKICBoZW52LT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUw7CiAgaGVudi0+aHVmZnRhYmxlRnJlcUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTDsKCiAgaGVudi0+Y29kZUJvb2tTY2ZMYXZGcmVxID0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXY7CiAgaGVudi0+Y29kZUJvb2tTY2ZMYXZUaW1lID0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXY7CgogIGhlbnYtPnN0YXJ0X2JpdHMgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHM7CiAgaGVudi0+c3RhcnRfYml0c19iYWxhbmNlID0gc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2U7CgoKICAvKiBpbml0IG5vaXNlIHRhYmxlcyBhbmQgY29kZWJvb2tzICovCgogIGhub2lzZS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMTsKICBobm9pc2UtPmNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXEgPSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTE7CiAgaG5vaXNlLT5jb2RlQm9va1NjZkxhdkxldmVsVGltZSA9IENPREVfQk9PS19TQ0ZfTEFWMTE7CiAgaG5vaXNlLT5jb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IENPREVfQk9PS19TQ0ZfTEFWMTE7CiAgaG5vaXNlLT5jb2RlQm9va1NjZkxhdlRpbWUgPSBDT0RFX0JPT0tfU0NGX0xBVjExOwogIGhub2lzZS0+Y29kZUJvb2tTY2ZMYXZGcmVxID0gQ09ERV9CT09LX1NDRl9MQVYxMTsKCiAgaG5vaXNlLT5odWZmdGFibGVMZXZlbFRpbWVMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMOwogIGhub2lzZS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUw7CiAgaG5vaXNlLT5odWZmdGFibGVUaW1lTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUw7CiAgaG5vaXNlLT5odWZmdGFibGVMZXZlbEZyZXFMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFMOwogIGhub2lzZS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUw7CiAgaG5vaXNlLT5odWZmdGFibGVGcmVxTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUw7CgoKICBobm9pc2UtPnN0YXJ0X2JpdHMgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0czsKICBobm9pc2UtPnN0YXJ0X2JpdHNfYmFsYW5jZSA9IHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzX2JhbGFuY2U7CgogIC8qIE5vIGRlbHRhIGNvZGluZyBpbiB0aW1lIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGR1ZSB0byAxLjVkQiBGSXgtRklYIHJ1bGUgKi8KICBoZW52LT51cERhdGUgPSAwOwogIGhub2lzZS0+dXBEYXRlID0gMDsKICByZXR1cm4gICgwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGluZGV4TG93MkhpZ2gKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogICBOaWNlIHNtYWxsIHBhdGNoLWZ1bmN0aW9ucyBpbiBvcmRlciB0byBjb3BlIHdpdGggbm9uLWZhY3Rvci0yCiAgICAgICAgICAgICAgICByYXRpb3MgYmV0d2VlbiBoaWdoLXJlcyBhbmQgbG93LXJlcwoKIEFyZ3VtZW50czogICAgIElOVCBvZmZzZXQsIElOVCBpbmRleCwgRlJFUV9SRVMgcmVzCgogUmV0dXJuOiAgICAgICAgSU5UCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIGluZGV4TG93MkhpZ2goSU5UIG9mZnNldCwgSU5UIGluZGV4LCBGUkVRX1JFUyByZXMpCnsKCiAgaWYocmVzID09IEZSRVFfUkVTX0xPVykKICB7CiAgICBpZiAob2Zmc2V0ID49IDApCiAgICB7CiAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQogICAgICAgICAgcmV0dXJuKGluZGV4KTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4oMippbmRleCAtIG9mZnNldCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCiAgICAgICAgICByZXR1cm4oMippbmRleCtpbmRleCk7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuKDIqaW5kZXggKyBvZmZzZXQpOwogICAgfQogIH0KICBlbHNlCiAgICByZXR1cm4oaW5kZXgpOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBtYXBMb3dSZXNFbmVyZ3lWYWwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICAgICBJTlQgY3VyclZhbCxJTlQqIHByZXZEYXRhLCBJTlQgb2Zmc2V0LCBJTlQgaW5kZXgsIEZSRVFfUkVTIHJlcwoKIFJldHVybjogICAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIG1hcExvd1Jlc0VuZXJneVZhbChTQ0hBUiBjdXJyVmFsLCBTQ0hBUiogcHJldkRhdGEsIElOVCBvZmZzZXQsIElOVCBpbmRleCwgRlJFUV9SRVMgcmVzKQp7CgogIGlmKHJlcyA9PSBGUkVRX1JFU19MT1cpCiAgewogICAgaWYgKG9mZnNldCA+PSAwKQogICAgewogICAgICAgIGlmKGluZGV4IDwgb2Zmc2V0KQogICAgICAgICAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggLSBvZmZzZXRdID0gY3VyclZhbDsKICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCsxIC0gb2Zmc2V0XSA9IGN1cnJWYWw7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CiAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleF0gPSBjdXJyVmFsOwogICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4KzFdID0gY3VyclZhbDsKICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleCsyXSA9IGN1cnJWYWw7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggKyBvZmZzZXRdID0gY3VyclZhbDsKICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCArIDEgKyBvZmZzZXRdID0gY3VyclZhbDsKICAgICAgICB9CiAgICB9CiAgfQogIGVsc2UKICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGNvbXB1dGVCaXRzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOiAgICAgSU5UIGRlbHRhLAogICAgICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2TGV2ZWwsCiAgICAgICAgICAgICAgICBJTlQgY29kZUJvb2tTY2ZMYXZCYWxhbmNlLAogICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKiBodWZmdGFibGVMZXZlbCwKICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICogaHVmZnRhYmxlQmFsYW5jZSwgSU5UIGNvdXBsaW5nLCBJTlQgY2hhbm5lbCkKCiBSZXR1cm46ICAgICAgICBJTlQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKY29tcHV0ZUJpdHMgKFNDSEFSICpkZWx0YSwKICAgICAgICAgICAgIElOVCBjb2RlQm9va1NjZkxhdkxldmVsLAogICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2QmFsYW5jZSwKICAgICAgICAgICAgIGNvbnN0IFVDSEFSICogaHVmZnRhYmxlTGV2ZWwsCiAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqIGh1ZmZ0YWJsZUJhbGFuY2UsIElOVCBjb3VwbGluZywgSU5UIGNoYW5uZWwpCnsKICBJTlQgaW5kZXg7CiAgSU5UIGRlbHRhX2JpdHMgPSAwOwoKICBpZiAoY291cGxpbmcpIHsKICAgIGlmIChjaGFubmVsID09IDEpCiAgICAgIHsKICAgICAgICBpZiAoKmRlbHRhIDwgMCkKICAgICAgICAgIGluZGV4ID0gZml4TWF4KCpkZWx0YSwgLWNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKCiAgICAgICAgaWYgKGluZGV4ICE9ICpkZWx0YSkgewogICAgICAgICAgKmRlbHRhID0gaW5kZXg7CiAgICAgICAgICByZXR1cm4gKDEwMDAwKTsKICAgICAgICB9CgogICAgICAgIGRlbHRhX2JpdHMgPSBodWZmdGFibGVCYWxhbmNlW2luZGV4ICsgY29kZUJvb2tTY2ZMYXZCYWxhbmNlXTsKICAgICAgfQogICAgZWxzZSB7CiAgICAgIGlmICgqZGVsdGEgPCAwKQogICAgICAgIGluZGV4ID0gZml4TWF4KCpkZWx0YSwgLWNvZGVCb29rU2NmTGF2TGV2ZWwpOwogICAgICBlbHNlCiAgICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCAgY29kZUJvb2tTY2ZMYXZMZXZlbCk7CgogICAgICBpZiAoaW5kZXggIT0gKmRlbHRhKSB7CiAgICAgICAgKmRlbHRhID0gaW5kZXg7CiAgICAgICAgcmV0dXJuICgxMDAwMCk7CiAgICAgIH0KICAgICAgZGVsdGFfYml0cyA9IGh1ZmZ0YWJsZUxldmVsW2luZGV4ICsgY29kZUJvb2tTY2ZMYXZMZXZlbF07CiAgICB9CiAgfQogIGVsc2UgewogICAgaWYgKCpkZWx0YSA8IDApCiAgICAgIGluZGV4ID0gZml4TWF4KCpkZWx0YSwgLWNvZGVCb29rU2NmTGF2TGV2ZWwpOwogICAgZWxzZQogICAgICBpbmRleCA9IGZpeE1pbigqZGVsdGEsICBjb2RlQm9va1NjZkxhdkxldmVsKTsKCiAgICBpZiAoaW5kZXggIT0gKmRlbHRhKSB7CiAgICAgICpkZWx0YSA9IGluZGV4OwogICAgICByZXR1cm4gKDEwMDAwKTsKICAgIH0KICAgIGRlbHRhX2JpdHMgPSBodWZmdGFibGVMZXZlbFtpbmRleCArIGNvZGVCb29rU2NmTGF2TGV2ZWxdOwogIH0KCiAgcmV0dXJuIChkZWx0YV9iaXRzKTsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19jb2RlRW52ZWxvcGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICAgICBJTlQgKnNmYl9ucmcsCiAgICAgICAgICAgICAgICBjb25zdCBGUkVRX1JFUyAqZnJlcV9yZXMsCiAgICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqIGhfc2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgSU5UICpkaXJlY3Rpb25WZWMsIElOVCBzY2FsYWJsZSwgSU5UIG5FbnZlbG9wZXMsIElOVCBjaGFubmVsLAogICAgICAgICAgICAgICAgSU5UIGhlYWRlckFjdGl2ZSkKCiBSZXR1cm46ICAgICAgICBub25lCiAgICAgICAgICAgICAgICBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2IGlzIG1vZGlmaWVkICEKICAgICAgICAgICAgICAgIHNmYl9ucmcgaXMgbW9kaWZpZWQKICAgICAgICAgICAgICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cGRhdGUgaXMgbW9kZmllZCAhCiAgICAgICAgICAgICAgICAqZGlyZWN0aW9uVmVjIGlzIG1vZGlmaWVkCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCkZES3NickVuY19jb2RlRW52ZWxvcGUoU0NIQVIgICAgICAgICAgICAgKnNmYl9ucmcsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgICAgKmZyZXFfcmVzLAogICAgICAgICAgICAgICAgICAgICAgIFNCUl9DT0RFX0VOVkVMT1BFICpoX3NickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAqZGlyZWN0aW9uVmVjLAogICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjb3VwbGluZywKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgbkVudmVsb3BlcywKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgY2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgaGVhZGVyQWN0aXZlKQp7CiAgSU5UIGksIG5vX29mX2JhbmRzLCBiYW5kOwogIEZJWFBfREJMIHRtcDEsdG1wMix0bXAzLGRGX2VkZ2VfMXN0RW52OwogIFNDSEFSICpwdHJfbnJnOwoKICBJTlQgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWU7CiAgSU5UIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxOwogIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lOwogIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOwogIGNvbnN0IFVDSEFSICpodWZmdGFibGVMZXZlbFRpbWVMOwogIGNvbnN0IFVDSEFSICpodWZmdGFibGVCYWxhbmNlVGltZUw7CiAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUxldmVsRnJlcUw7CiAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTDsKCiAgSU5UIG9mZnNldCA9IGhfc2JyQ29kZUVudmVsb3BlLT5vZmZzZXQ7CiAgSU5UIGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CgogIElOVCBkZWx0YV9GX2JpdHMgPSAwLCBkZWx0YV9UX2JpdHMgPSAwOwogIElOVCB1c2VfZFQ7CgogIFNDSEFSIGRlbHRhX0ZbTUFYX0ZSRVFfQ09FRkZTXTsKICBTQ0hBUiBkZWx0YV9UW01BWF9GUkVRX0NPRUZGU107CiAgU0NIQVIgbGFzdF9ucmcsIGN1cnJfbnJnOwoKICB0bXAxID0gRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gKERGUkFDVF9CSVRTLTE2LTEpOwogIHRtcDIgPSBoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV8xc3RFbnYgPj4gKERGUkFDVF9CSVRTLTE2KTsKICB0bXAzID0gKEZJWFBfREJMKSgoKElOVCkoTE9ORyloX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyKmhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlX2luY3JfZmFjKSA+PiAoREZSQUNUX0JJVFMtMTYpKTsKCiAgZEZfZWRnZV8xc3RFbnYgPSB0bXAxICsgdG1wMiArIHRtcDM7CgogIGlmIChjb3VwbGluZykgewogICAgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUgPSBoX3NickNvZGVFbnZlbG9wZS0+Y29kZUJvb2tTY2ZMYXZMZXZlbFRpbWU7CiAgICBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUgPSBoX3NickNvZGVFbnZlbG9wZS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZTsKICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXEgPSBoX3NickNvZGVFbnZlbG9wZS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcTsKICAgIGh1ZmZ0YWJsZUxldmVsVGltZUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlTGV2ZWxUaW1lTDsKICAgIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCA9IGhfc2JyQ29kZUVudmVsb3BlLT5odWZmdGFibGVCYWxhbmNlVGltZUw7CiAgICBodWZmdGFibGVMZXZlbEZyZXFMID0gaF9zYnJDb2RlRW52ZWxvcGUtPmh1ZmZ0YWJsZUxldmVsRnJlcUw7CiAgICBodWZmdGFibGVCYWxhbmNlRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMOwogIH0KICBlbHNlIHsKICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lID0gaF9zYnJDb2RlRW52ZWxvcGUtPmNvZGVCb29rU2NmTGF2VGltZTsKICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxID0gaF9zYnJDb2RlRW52ZWxvcGUtPmNvZGVCb29rU2NmTGF2RnJlcTsKICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUgPSBoX3NickNvZGVFbnZlbG9wZS0+Y29kZUJvb2tTY2ZMYXZUaW1lOwogICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkZyZXE7CiAgICBodWZmdGFibGVMZXZlbFRpbWVMID0gaF9zYnJDb2RlRW52ZWxvcGUtPmh1ZmZ0YWJsZVRpbWVMOwogICAgaHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gaF9zYnJDb2RlRW52ZWxvcGUtPmh1ZmZ0YWJsZVRpbWVMOwogICAgaHVmZnRhYmxlTGV2ZWxGcmVxTCA9IGhfc2JyQ29kZUVudmVsb3BlLT5odWZmdGFibGVGcmVxTDsKICAgIGh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IGhfc2JyQ29kZUVudmVsb3BlLT5odWZmdGFibGVGcmVxTDsKICB9CgogIGlmKGNvdXBsaW5nID09IDEgJiYgY2hhbm5lbCA9PSAxKQogICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9IDE7ICAgICAgIC8qc2hvdWxkIGJlIG9uZSB3aGVuIHRoZSBuZXcgaHVmZm1hbi10YWJsZXMgYXJlIHJlYWR5Ki8KICBlbHNlCiAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMDsKCgogIGlmIChoX3NickNvZGVFbnZlbG9wZS0+ZGVsdGFUQWNyb3NzRnJhbWVzID09IDApCiAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKCiAgLyogbm8gZGVsdGEgY29kaW5nIGluIHRpbWUgaW4gY2FzZSBvZiBhIGhlYWRlciAqLwogIGlmIChoZWFkZXJBY3RpdmUpCiAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKCgogIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspCiAgewogICAgaWYgKGZyZXFfcmVzW2ldID09IEZSRVFfUkVTX0hJR0gpCiAgICAgIG5vX29mX2JhbmRzID0gaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfSElHSF07CiAgICBlbHNlCiAgICAgIG5vX29mX2JhbmRzID0gaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXTsKCgogICAgcHRyX25yZyA9IHNmYl9ucmc7CiAgICBjdXJyX25yZyA9ICpwdHJfbnJnOwoKICAgIGRlbHRhX0ZbMF0gPSBjdXJyX25yZyA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOwoKICAgIGlmIChjb3VwbGluZyAmJiBjaGFubmVsID09IDEpCiAgICAgIGRlbHRhX0ZfYml0cyA9IGhfc2JyQ29kZUVudmVsb3BlLT5zdGFydF9iaXRzX2JhbGFuY2U7CiAgICBlbHNlCiAgICAgIGRlbHRhX0ZfYml0cyA9IGhfc2JyQ29kZUVudmVsb3BlLT5zdGFydF9iaXRzOwoKCiAgICBpZihoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDApCiAgICB7CiAgICAgIGRlbHRhX1RbMF0gPSAoY3Vycl9ucmcgLSBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2WzBdKSA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOwoKICAgICAgZGVsdGFfVF9iaXRzID0gY29tcHV0ZUJpdHMgKCZkZWx0YV9UWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYmxlTGV2ZWxUaW1lTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCwgY291cGxpbmcsIGNoYW5uZWwpOwogICAgfQoKCiAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoY3Vycl9ucmcsIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXYsIG9mZnNldCwgMCwgZnJlcV9yZXNbaV0pOwoKICAgIC8qIGVuc3VyZSB0aGF0IG5yZyBkaWZmZXJlbmNlIGlzIG5vdCBoaWdoZXIgdGhhbiBjb2RlQm9va1NjZkxhdlhYWEZyZXEgKi8KICAgIGlmICggY291cGxpbmcgJiYgY2hhbm5lbCA9PSAxICkgewogICAgICBmb3IgKGJhbmQgPSBub19vZl9iYW5kcyAtIDE7IGJhbmQgPiAwOyBiYW5kLS0pIHsKICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZF0gLSBwdHJfbnJnW2JhbmQtMV0gPiBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxICkgewogICAgICAgICAgcHRyX25yZ1tiYW5kLTFdID0gcHRyX25yZ1tiYW5kXSAtIGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoYmFuZCA9IDE7IGJhbmQgPCBub19vZl9iYW5kczsgYmFuZCsrKSB7CiAgICAgICAgaWYgKCBwdHJfbnJnW2JhbmQtMV0gLSBwdHJfbnJnW2JhbmRdID4gY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSApIHsKICAgICAgICAgIHB0cl9ucmdbYmFuZF0gPSBwdHJfbnJnW2JhbmQtMV0gLSBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGZvciAoYmFuZCA9IG5vX29mX2JhbmRzIC0gMTsgYmFuZCA+IDA7IGJhbmQtLSkgewogICAgICAgIGlmICggcHRyX25yZ1tiYW5kXSAtIHB0cl9ucmdbYmFuZC0xXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxICkgewogICAgICAgICAgcHRyX25yZ1tiYW5kLTFdID0gcHRyX25yZ1tiYW5kXSAtIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykgewogICAgICAgIGlmICggcHRyX25yZ1tiYW5kLTFdIC0gcHRyX25yZ1tiYW5kXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxICkgewogICAgICAgICAgcHRyX25yZ1tiYW5kXSA9IHB0cl9ucmdbYmFuZC0xXSAtIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxOwogICAgICAgIH0KICAgICAgfQogICAgfQoKCiAgICAvKiBDb2RpbmcgbG9vcCovCiAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykKICAgIHsKICAgICAgbGFzdF9ucmcgPSAoKnB0cl9ucmcpOwogICAgICBwdHJfbnJnKys7CiAgICAgIGN1cnJfbnJnID0gKCpwdHJfbnJnKTsKCiAgICAgIGRlbHRhX0ZbYmFuZF0gPSAoY3Vycl9ucmcgLSBsYXN0X25yZykgPj4gZW52RGF0YVRhYmxlQ29tcEZhY3RvcjsKCiAgICAgIGRlbHRhX0ZfYml0cyArPSBjb21wdXRlQml0cyAoJmRlbHRhX0ZbYmFuZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVMZXZlbEZyZXFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCwgY291cGxpbmcsIGNoYW5uZWwpOwoKICAgICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQogICAgICB7CiAgICAgICAgZGVsdGFfVFtiYW5kXSA9IGN1cnJfbnJnIC0gaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldltpbmRleExvdzJIaWdoKG9mZnNldCwgYmFuZCwgZnJlcV9yZXNbaV0pXTsKICAgICAgICBkZWx0YV9UW2JhbmRdID0gZGVsdGFfVFtiYW5kXSA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOwogICAgICB9CgogICAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoY3Vycl9ucmcsIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXYsIG9mZnNldCwgYmFuZCwgZnJlcV9yZXNbaV0pOwoKICAgICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQogICAgICB7CiAgICAgICAgZGVsdGFfVF9iaXRzICs9IGNvbXB1dGVCaXRzICgmZGVsdGFfVFtiYW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUxldmVsVGltZUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVCYWxhbmNlVGltZUwsIGNvdXBsaW5nLCBjaGFubmVsKTsKICAgICAgfQogICAgfQoKICAgIC8qIFJlcGxhY2Ugc2ZiX25yZyB3aXRoIGRlbHRhY29kZWQgc2FtcGxlcyBhbmQgc2V0IGZsYWcgKi8KICAgIGlmIChpID09IDApIHsKICAgICAgSU5UIHRtcF9iaXRzOwogICAgICB0bXBfYml0cyA9ICgoKGRlbHRhX1RfYml0cyAqIGRGX2VkZ2VfMXN0RW52KSA+PiAoREZSQUNUX0JJVFMtMTgpKSArIChGSVhQX0RCTCkxKSA+PiAxOwogICAgICB1c2VfZFQgPSAoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwICYmIChkZWx0YV9GX2JpdHMgPiB0bXBfYml0cykpOwogICAgfQogICAgZWxzZQogICAgICB1c2VfZFQgPSAoZGVsdGFfVF9iaXRzIDwgZGVsdGFfRl9iaXRzICYmIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCk7CgogICAgaWYgKHVzZV9kVCkKICAgIHsKICAgICAgZGlyZWN0aW9uVmVjW2ldID0gVElNRTsKICAgICAgRkRLbWVtY3B5IChzZmJfbnJnLCBkZWx0YV9ULCBub19vZl9iYW5kcyAqIHNpemVvZiAoU0NIQVIpKTsKICAgIH0KICAgIGVsc2UgewogICAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKICAgICAgZGlyZWN0aW9uVmVjW2ldID0gRlJFUTsKICAgICAgRkRLbWVtY3B5IChzZmJfbnJnLCBkZWx0YV9GLCBub19vZl9iYW5kcyAqIHNpemVvZiAoU0NIQVIpKTsKICAgIH0KICAgIHNmYl9ucmcgKz0gbm9fb2ZfYmFuZHM7CiAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMTsKICB9Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOgoKIFJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVApGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFICBoX3NickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRlbHRhVEFjcm9zc0ZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudiwKICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlX2luY3IpCnsKCiAgRkRLbWVtY2xlYXIoaF9zYnJDb2RlRW52ZWxvcGUsc2l6ZW9mKFNCUl9DT0RFX0VOVkVMT1BFKSk7CgogIGhfc2JyQ29kZUVudmVsb3BlLT5kZWx0YVRBY3Jvc3NGcmFtZXMgPSBkZWx0YVRBY3Jvc3NGcmFtZXM7CiAgaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfMXN0RW52ID0gZEZfZWRnZV8xc3RFbnY7CiAgaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfaW5jciA9IGRGX2VkZ2VfaW5jcjsKICBoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyX2ZhYyA9IDA7CiAgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSA9IDA7CiAgaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXSA9IG5TZmJbRlJFUV9SRVNfTE9XXTsKICBoX3NickNvZGVFbnZlbG9wZS0+blNmYltGUkVRX1JFU19ISUdIXSA9IG5TZmJbRlJFUV9SRVNfSElHSF07CiAgaF9zYnJDb2RlRW52ZWxvcGUtPm9mZnNldCA9IDIqaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXSAtIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdOwoKICByZXR1cm4gKDApOwp9Cg==