Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgogICBEZXNjcmlwdGlvbjogTVBFRyBUcmFuc3BvcnQgZGF0YSB0YWJsZXMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX19UUF9EQVRBX0hfXwojZGVmaW5lIF9fVFBfREFUQV9IX18KCiNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKI2luY2x1ZGUgIkZES19hdWRpby5oIgojaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgoKLyoKICogQ29uZmlndXJhdGlvbgogKi8KI2RlZmluZSBUUF9HQV9FTkFCTEUKLyogI2RlZmluZSBUUF9DRUxQX0VOQUJMRSAqLwovKiAjZGVmaW5lIFRQX0hWWENfRU5BQkxFICovCi8qICNkZWZpbmUgVFBfU0xTX0VOQUJMRSAqLwojZGVmaW5lIFRQX0VMRF9FTkFCTEUKLyogI2RlZmluZSBUUF9VU0FDX0VOQUJMRSAqLwovKiAjZGVmaW5lIFRQX1JTVkQ1MF9FTkFCTEUgKi8KCiNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9TTFNfRU5BQkxFKQojZGVmaW5lIFRQX1BDRV9FTkFCTEUgICAgICAgLyoqPCBFbmFibGUgZnVsbCBQQ0Ugc3VwcG9ydCAqLwojZW5kaWYKCi8qKgogKiBQcm9ncmFtQ29uZmlnIHN0cnVjdC4KICovCi8qIElTTy9JRUMgMTQ0OTYtMyA0LjQuMS4xIFRhYmxlIDQuMiBQcm9ncmFtIGNvbmZpZyBlbGVtZW50ICovCiNkZWZpbmUgUENfRlNCX0NIQU5ORUxTX01BWCAxNiAvKiBGcm9udC9TaWRlL0JhY2sgY2hhbm5lbHMgKi8KI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYICAgIDgKI2RlZmluZSBQQ19DQ0VMX01BWCAgICAgICAgIDE2IC8qIENDIGVsZW1lbnRzICovCiNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKCnR5cGVkZWYgc3RydWN0CnsKI2lmZGVmIFRQX1BDRV9FTkFCTEUKICAvKiBQQ0UgYml0c3RyZWFtIGVsZW1lbnRzOiAqLwogIFVDSEFSIEVsZW1lbnRJbnN0YW5jZVRhZzsKICBVQ0hBUiBQcm9maWxlOwogIFVDSEFSIFNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7CiAgVUNIQVIgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7CiAgVUNIQVIgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsKICBVQ0hBUiBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOwogIFVDSEFSIE51bUxmZUNoYW5uZWxFbGVtZW50czsKICBVQ0hBUiBOdW1Bc3NvY0RhdGFFbGVtZW50czsKICBVQ0hBUiBOdW1WYWxpZENjRWxlbWVudHM7CgogIFVDSEFSIE1vbm9NaXhkb3duUHJlc2VudDsKICBVQ0hBUiBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXI7CgogIFVDSEFSIFN0ZXJlb01peGRvd25QcmVzZW50OwogIFVDSEFSIFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyOwoKICBVQ0hBUiBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50OwogIFVDSEFSIE1hdHJpeE1peGRvd25JbmRleDsKICBVQ0hBUiBQc2V1ZG9TdXJyb3VuZEVuYWJsZTsKCiAgVUNIQVIgRnJvbnRFbGVtZW50SXNDcGVbUENfRlNCX0NIQU5ORUxTX01BWF07CiAgVUNIQVIgRnJvbnRFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOwoKICBVQ0hBUiBTaWRlRWxlbWVudElzQ3BlW1BDX0ZTQl9DSEFOTkVMU19NQVhdOwogIFVDSEFSIFNpZGVFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOwoKICBVQ0hBUiBCYWNrRWxlbWVudElzQ3BlW1BDX0ZTQl9DSEFOTkVMU19NQVhdOwogIFVDSEFSIEJhY2tFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOwoKICBVQ0hBUiBMZmVFbGVtZW50VGFnU2VsZWN0W1BDX0xGRV9DSEFOTkVMU19NQVhdOwoKICBVQ0hBUiBBc3NvY0RhdGFFbGVtZW50VGFnU2VsZWN0W1BDX0FTU09DREFUQV9NQVhdOwoKICBVQ0hBUiBDY0VsZW1lbnRJc0luZFN3W1BDX0NDRUxfTUFYXTsKICBVQ0hBUiBWYWxpZENjRWxlbWVudFRhZ1NlbGVjdFtQQ19DQ0VMX01BWF07CgogIFVDSEFSIENvbW1lbnRGaWVsZEJ5dGVzOwogIFVDSEFSIENvbW1lbnRbUENfQ09NTUVOVExFTkdUSF07CiNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCgogIC8qIEhlbHBlciB2YXJpYWJsZXMgZm9yIGFkbWluaXN0cmF0aW9uOiAqLwogIFVDSEFSIGlzVmFsaWQ7ICAgICAgICAgICAgICAgLyohPCBGbGFnIHNob3dpbmcgaWYgUENFIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LiAqLwogIFVDSEFSIE51bUNoYW5uZWxzOyAgICAgICAgICAgLyohPCBBbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMgc3VtbWluZyBhbGwgY2hhbm5lbCBlbGVtZW50cyBpbmNsdWRpbmcgTEZFcyAqLwogIFVDSEFSIE51bUVmZmVjdGl2ZUNoYW5uZWxzOyAgLyohPCBBbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMgc3VtbWluZyBvbmx5IFNDRXMgYW5kIENQRXMgKi8KICBVQ0hBUiBlbENvdW50ZXI7Cgp9IENQcm9ncmFtQ29uZmlnOwoKdHlwZWRlZiBlbnVtIHsKICBBU0NFWFRfVU5LT1dOID0gLTEsCiAgQVNDRVhUX1NCUiAgICA9IDB4MmI3LAogIEFTQ0VYVF9QUyAgICAgPSAweDU0OCwKICBBU0NFWFRfTVBTICAgID0gMHg3NmEsCiAgQVNDRVhUX1NBT0MgICA9IDB4N2NiLAogIEFTQ0VYVF9MRE1QUyAgPSAweDdjYwoKfSBUUF9BU0NfRVhURU5TSU9OX0lEOwoKI2lmZGVmIFRQX0dBX0VOQUJMRQovKioKICogR2FTcGVjaWZpY0NvbmZpZyBzdHJ1Y3QKICovCnR5cGVkZWYgc3RydWN0IHsKICBVSU5UIG1fZnJhbWVMZW5ndGhGbGFnIDsKICBVSU5UIG1fZGVwZW5kc09uQ29yZUNvZGVyIDsKICBVSU5UIG1fY29yZUNvZGVyRGVsYXkgOwoKICBVSU5UIG1fZXh0ZW5zaW9uRmxhZyA7CiAgVUlOVCBtX2V4dGVuc2lvbkZsYWczIDsKCiAgVUlOVCBtX2xheWVyOwogIFVJTlQgbV9udW1PZlN1YkZyYW1lOwogIFVJTlQgbV9sYXllckxlbmd0aDsKCn0gQ1NHYVNwZWNpZmljQ29uZmlnOwojZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCgoKCgojaWZkZWYgVFBfRUxEX0VOQUJMRQoKdHlwZWRlZiBlbnVtIHsKICBFTERFWFRfVEVSTSAgPSAweDAsICAgLyogVGVybWluYXRpb24gdGFnICovCiAgRUxERVhUX1NBT0MgID0gMHgxLCAgIC8qIFNBT0MgY29uZmlnICovCiAgRUxERVhUX0xEU0FDID0gMHgyICAgIC8qIExEIE1QRUcgU3Vycm91bmQgY29uZmlnICovCiAgLyogcmVzZXJ2ZWQgKi8KfSBBU0NfRUxEX0VYVF9UWVBFOwoKdHlwZWRlZiBzdHJ1Y3QgewogIFVDSEFSIG1fZnJhbWVMZW5ndGhGbGFnOwoKICBVQ0hBUiBtX3NiclByZXNlbnRGbGFnOwogIFVDSEFSIG1fdXNlTGRRbWZUaW1lQWxpZ247ICAvKiBVc2UgTEQtTVBTIFFNRiBpbiBTQlIgdG8gYWNoaXZlIHRpbWUgYWxpZ25tZW50ICovCiAgVUNIQVIgbV9zYnJTYW1wbGluZ1JhdGU7CiAgVUNIQVIgbV9zYnJDcmNGbGFnOwoKfSBDU0VsZFNwZWNpZmljQ29uZmlnOwojZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLwoKCgoKLyoqCiAqIEF1ZGlvIGNvbmZpZ3VyYXRpb24gc3RydWN0LCBzdWl0YWJsZSBmb3IgZW5jb2RlciBhbmQgZGVjb2RlciBjb25maWd1cmF0aW9uLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoKICAvKiBYWVogU3BlY2lmaWMgRGF0YSAqLwogIHVuaW9uIHsKI2lmZGVmIFRQX0dBX0VOQUJMRQogICAgQ1NHYVNwZWNpZmljQ29uZmlnICAgIG1fZ2FTcGVjaWZpY0NvbmZpZzsgICAgICAgLyoqPCBHZW5lcmFsIGF1ZGlvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICAgICAgICAgKi8KI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwojaWZkZWYgVFBfRUxEX0VOQUJMRQogICAgQ1NFbGRTcGVjaWZpY0NvbmZpZyAgIG1fZWxkU3BlY2lmaWNDb25maWc7ICAgICAgLyoqPCBFTEQgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KICB9IG1fc2M7CiAgCiAgLyogQ29tbW9uIEFTQyBwYXJhbWV0ZXJzICovCiNpZmRlZiBUUF9QQ0VfRU5BQkxFCiAgQ1Byb2dyYW1Db25maWcgICAgICAgIG1fcHJvZ3JDb25maWdFbGVtZW50OyAgICAgLyoqPCBQcm9ncmFtIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwoKICBBVURJT19PQkpFQ1RfVFlQRSAgICAgbV9hb3Q7ICAgICAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgVUlOVCAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgLyoqPCBTYW1wbGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFVJTlQgICAgICAgICAgICAgICAgICBtX3NhbXBsZXNQZXJGcmFtZTsgICAgICAgIC8qKjwgQW1vdW50IG9mIHNhbXBsZXMgcGVyIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgKi8KICBVSU5UICAgICAgICAgICAgICAgICAgbV9kaXJlY3RNYXBwaW5nOyAgICAgICAgICAvKio8IERvY3VtZW50IHRoaXMgcGxlYXNlICEhICAgICAgICAgICAgICAgICAgICAgICAgICovCgogIEFVRElPX09CSkVDVF9UWVBFICAgICBtX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZTsgICAgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KICBVSU5UICAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeTsgICAgICAvKio8IFNhbXBsZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAKCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAqLwoKICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9lcENvbmZpZzsgICAgICAgICAgICAgICAvKio8IEVycm9yIHByb3RlY3Rpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFNDSEFSICAgICAgICAgICAgICAgICBtX3ZjYjExRmxhZzsgICAgICAgICAgICAgIC8qKjwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgICovCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1fcnZsY0ZsYWc7ICAgICAgICAgICAgICAgLyoqPCBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgKi8KICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9oY3JGbGFnOyAgICAgICAgICAgICAgICAvKio8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAqLwoKICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9zYnJQcmVzZW50RmxhZzsgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgU0JSIGRhdGEgaW4gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICovCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1fcHNQcmVzZW50RmxhZzsgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHBhcmFtZXRyaWMgc3RlcmVvIGRhdGEgaW4gdGhlIGJpdHN0cmVhbSAqLwogIFVDSEFSICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgVUNIQVIgICAgICAgICAgICAgICAgIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleDsgLyoqPCBTYW1wbGVyYXRlIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICAgICAgICAgICAqLwoKfSBDU0F1ZGlvU3BlY2lmaWNDb25maWc7Cgp0eXBlZGVmIElOVCAoKmNiVXBkYXRlQ29uZmlnX3QpKHZvaWQqLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcqKTsKdHlwZWRlZiBJTlQgKCpjYlNzY190KSgKICAgICAgICB2b2lkKiwgSEFORExFX0ZES19CSVRTVFJFQU0sCiAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAogICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ0ZyZXF1ZW5jeSwKICAgICAgICBjb25zdCBJTlQgbXV4TW9kZSwKICAgICAgICBjb25zdCBJTlQgY29uZmlnQnl0ZXMKICAgICAgICApOwp0eXBlZGVmIElOVCAoKmNiU2JyX3QpKAogICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJzLAogICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sCiAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCiAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCiAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleAogICAgICAgICk7Cgp0eXBlZGVmIHN0cnVjdCAgewogIGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWc7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgQ29uZmlnIGNoYW5nZSBub3RpZnkgY2FsbGJhY2suICAqLwogIHZvaWQgKmNiVXBkYXRlQ29uZmlnRGF0YTsgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAqLwogIGNiU3NjX3QgY2JTc2M7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU1NDIHBhcnNlciBjYWxsYmFjay4gKi8KICB2b2lkICpjYlNzY0RhdGE7ICAgICAgICAgICAgICAgICAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBTU0MgcGFyc2VyIGNhbGxiYWNrLiAqLwogIGNiU2JyX3QgY2JTYnI7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCiAgdm9pZCAqY2JTYnJEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCn0gQ1NUcENhbGxCYWNrczsKCnN0YXRpYyBjb25zdCBVSU5UIFNhbXBsaW5nUmF0ZVRhYmxlW10gPSAKeyA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsCiAgMAp9OwoKc3RhdGljIGlubGluZQppbnQgZ2V0U2FtcGxpbmdSYXRlSW5kZXgoIFVJTlQgc2FtcGxpbmdSYXRlICkKewogIFVJTlQgc2ZfaW5kZXgsIHRhYmxlU2l6ZT1zaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihVSU5UKTsKCiAgZm9yIChzZl9pbmRleD0wOyBzZl9pbmRleDx0YWJsZVNpemU7IHNmX2luZGV4KyspIHsKICAgIGlmKCBTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlICkgYnJlYWs7CiAgfQoKICBpZiAoc2ZfaW5kZXg+dGFibGVTaXplLTEpIHsKICAgIHJldHVybiB0YWJsZVNpemUtMTsKICB9CgogIHJldHVybiBzZl9pbmRleDsKfQoKLyoKICogR2V0IENoYW5uZWwgY291bnQgZnJvbSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KICovCnN0YXRpYyBpbmxpbmUgaW50IGdldE51bWJlck9mVG90YWxDaGFubmVscyhpbnQgY2hhbm5lbENvbmZpZykKewogIGlmIChjaGFubmVsQ29uZmlnID4gMCAmJiBjaGFubmVsQ29uZmlnIDwgOCkKICAgIHJldHVybiAoY2hhbm5lbENvbmZpZyA9PSA3KT84OmNoYW5uZWxDb25maWc7CiAgZWxzZQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUKaW50IGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoY29uc3QgaW50IGNoYW5uZWxDb25maWcpCnsKICBjb25zdCBpbnQgbltdID0gezAsMSwyLDMsNCw1LDUsN307CiAgcmV0dXJuIG5bY2hhbm5lbENvbmZpZ107Cn0KCiNlbmRpZiAvKiBfX1RQX0RBVEFfSF9fICovCg==