Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCiAgIERlc2NyaXB0aW9uOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCgojaW5jbHVkZSAiYWFjX3JhbS5oIgojaW5jbHVkZSAiYWFjZGVjb2Rlci5oIgojaW5jbHVkZSAidHBkZWNfbGliLmgiCiNpbmNsdWRlICJGREtfY29yZS5oIiAvKiBGREtfdG9vbHMgdmVyc2lvbiBpbmZvICovCgoKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCgoKCgojaW5jbHVkZSAiY29uY2VhbC5oIgoKICNpbmNsdWRlICJhYWNkZWNfZHJjLmgiCgoKCi8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCiNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwwIDIKI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDEgNQojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMiAxMAojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1RJVExFICJBQUMgRGVjb2RlciBMaWIiCiNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfREFURSBfX0RBVEVfXwojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX1RJTUUgX19USU1FX18KCnN0YXRpYyBBQUNfREVDT0RFUl9FUlJPUgpzZXRDb25jZWFsTWV0aG9kICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgbWV0aG9kICk7CgoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfR2V0RnJlZUJ5dGVzICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsIFVJTlQgKnBGcmVlQnl0ZXMpewoKICAvKiByZXNldCBmcmVlIGJ5dGVzICovCiAgKnBGcmVlQnl0ZXMgPSAwOwoKICAvKiBjaGVjayBoYW5kbGUgKi8KICBpZighc2VsZikKICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwoKICAvKiByZXR1cm4gbnIgb2YgZnJlZSBieXRlcyAqLwogIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9IHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oc2VsZi0+aElucHV0LCAwKTsKICAqcEZyZWVCeXRlcyA9IEZES2dldEZyZWVCaXRzKGhCcykgPj4gMzsKCiAgLyogc3VjY2VzcyAqLwogIHJldHVybiBBQUNfREVDX09LOwp9CgovKioKICogQ29uZmlnIERlY29kZXIgdXNpbmcgYSBDU0F1ZGlvU3BlY2lmaWNDb25maWcgc3RydWN0LgogKi8Kc3RhdGljCkxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0NvbmZpZyhIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2NTdHJ1Y3QpCnsKICBBQUNfREVDT0RFUl9FUlJPUiBlcnI7CgogIC8qIEluaXRpYWxpemUgQUFDIGNvcmUgZGVjb2RlciwgYW5kIHVwZGF0ZSBzZWxmLT5zdHJlYW1pbmZvICovCiAgZXJyID0gQ0FhY0RlY29kZXJfSW5pdChzZWxmLCBwQXNjU3RydWN0KTsKCiAgcmV0dXJuIGVycjsKfQoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnUmF3ICgKICAgICAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAogICAgICAgIFVDSEFSICpjb25mW10sCiAgICAgICAgY29uc3QgVUlOVCBsZW5ndGhbXSApCnsKICBBQUNfREVDT0RFUl9FUlJPUiBlcnIgPSBBQUNfREVDX09LOwogIFRSQU5TUE9SVERFQ19FUlJPUiAgIGVyclRwOwogIFVJTlQgbGF5ZXIsIG5yT2ZMYXllcnMgPSBzZWxmLT5uck9mTGF5ZXJzOwoKICBmb3IobGF5ZXIgPSAwOyBsYXllciA8IG5yT2ZMYXllcnM7IGxheWVyKyspewogICAgaWYobGVuZ3RoW2xheWVyXSA+IDApewogICAgICBlcnJUcCA9IHRyYW5zcG9ydERlY19PdXRPZkJhbmRDb25maWcoc2VsZi0+aElucHV0LCBjb25mW2xheWVyXSwgbGVuZ3RoW2xheWVyXSwgbGF5ZXIpOwogICAgICBpZiAoZXJyVHAgIT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgc3dpdGNoIChlcnJUcCkgewogICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVDoKICAgICAgICAgIGVyciA9IEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOgogICAgICAgICAgZXJyID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgZXJyID0gQUFDX0RFQ19VTktOT1dOOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIGlmIGJhc2VsYXllciBpcyBPSyB3ZSBjb250aW51ZSBkZWNvZGluZyAqLwogICAgICAgIGlmKGxheWVyICA+PSAxKXsKICAgICAgICAgIHNlbGYtPm5yT2ZMYXllcnMgPSBsYXllcjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBlcnI7Cn0KCgoKc3RhdGljIElOVCBhYWNEZWNvZGVyX0NvbmZpZ0NhbGxiYWNrKHZvaWQgKmhhbmRsZSwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0KQp7CiAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiA9IChIQU5ETEVfQUFDREVDT0RFUiloYW5kbGU7CiAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHA7CgogIHsKICAgIHsKICAgICAgZXJyID0gYWFjRGVjb2Rlcl9Db25maWcoc2VsZiwgcEFzY1N0cnVjdCk7CiAgICB9CiAgfQogIGlmIChlcnIgPT0gQUFDX0RFQ19PSykgewogICAgaWYgKCBzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19MRHxBQ19FTEQpCiAgICAgICYmIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpID4gMCApCiAgICB7CiAgICAgIC8qIFJldmVydCB0byBlcnJvciBjb25jZWFsbWVudCBtZXRob2QgTm9pc2UgU3Vic3RpdHV0aW9uLgogICAgICAgICBCZWNhdXNlIGludGVycG9sYXRpb24gaXMgbm90IGltcGxlbWVudGVkIGZvciBVU0FDL1JTVkQ1MCBvcgogICAgICAgICB0aGUgYWRkaXRpb25hbCBkZWxheSBpcyB1bndhbnRlZCBmb3IgbG93IGRlbGF5IGNvZGVjcy4gKi8KICAgICAgc2V0Q29uY2VhbE1ldGhvZChzZWxmLCAxKTsKI2lmZGVmIERFQlVHCiAgICAgIEZES3ByaW50ZigiICBDb25jZWFsbWVudCBtZXRob2Qgd2FzIHJldmVydGVkIHRvIDEgIVxuIik7CiNlbmRpZgogICAgfQogICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfT0s7CiAgfSBlbHNlIHsKICAgIGlmIChJU19JTklUX0VSUk9SKGVycikpIHsKICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOwogICAgfSAvKiBGYXRhbCBlcnJvcnMgKi8KICAgIGVsc2UgaWYgKGVyciA9PSBBQUNfREVDX05FRURfVE9fUkVTVEFSVCkgewogICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ7CiAgICB9IGVsc2UgewogICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CiAgICB9CiAgfQoKICByZXR1cm4gZXJyVHA7Cn0KCgoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfQW5jRGF0YUluaXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplICkKewogIENBbmNEYXRhICphbmNEYXRhID0gJnNlbGYtPmFuY0RhdGE7CgogIHJldHVybiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChhbmNEYXRhLCBidWZmZXIsIHNpemUpOwp9CgoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfQW5jRGF0YUdldCAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICoqcHRyLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgKnNpemUgKQp7CiAgQ0FuY0RhdGEgKmFuY0RhdGEgPSAmc2VsZi0+YW5jRGF0YTsKCiAgcmV0dXJuIENBYWNEZWNvZGVyX0FuY0RhdGFHZXQoYW5jRGF0YSwgaW5kZXgsIHB0ciwgc2l6ZSk7Cn0KCgpzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IKc2V0Q29uY2VhbE1ldGhvZCAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLCAgIC8qITwgSGFuZGxlIG9mIHRoZSBkZWNvZGVyIGluc3RhbmNlICovCiAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgbWV0aG9kICkKewogIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKICBDQ29uY2VhbFBhcmFtcyAgKnBDb25jZWFsRGF0YSA9IE5VTEw7CiAgSEFORExFX1NCUkRFQ09ERVIgaFNickRlYyA9IE5VTEw7CiAgSEFORExFX0FBQ19EUkMgaERyY0luZm8gPSBOVUxMOwogIEhBTkRMRV9QQ01fRE9XTk1JWCBoUGNtRG14ID0gTlVMTDsKICBDQ29uY2VhbG1lbnRNZXRob2QgYmFja3VwTWV0aG9kID0gQ29uY2VhbE1ldGhvZE5vbmU7CiAgaW50IGJhY2t1cERlbGF5ID0gMDsKICBpbnQgYnNEZWxheSA9IDA7CgogIC8qIGNoZWNrIGRlY29kZXIgaGFuZGxlICovCiAgaWYgKHNlbGYgIT0gTlVMTCkgewogICAgcENvbmNlYWxEYXRhID0gJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhOwogICAgaFNickRlYyA9IHNlbGYtPmhTYnJEZWNvZGVyOwogICAgaERyY0luZm8gPSBzZWxmLT5oRHJjSW5mbzsKICAgIGhQY21EbXggPSBzZWxmLT5oUGNtVXRpbHM7CiAgfQoKCiAgLyogR2V0IGN1cnJlbnQgbWV0aG9kL2RlbGF5ICovCiAgYmFja3VwTWV0aG9kID0gQ0NvbmNlYWxtZW50X0dldE1ldGhvZChwQ29uY2VhbERhdGEpOwogIGJhY2t1cERlbGF5ICA9IENDb25jZWFsbWVudF9HZXREZWxheShwQ29uY2VhbERhdGEpOwoKICAvKiBCZSBzdXJlIHRvIHNldCBBQUMgYW5kIFNCUiBjb25jZWFsbWVudCBtZXRob2Qgc2ltdWx0YW5lb3VzbHkhICovCiAgZXJyb3JTdGF0dXMgPQogICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcygKICAgICAgcENvbmNlYWxEYXRhLAogICAgICAoaW50KW1ldGhvZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2VhbE1ldGhvZAogICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbEZhZGVPdXRTbG9wZQogICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbEZhZGVJblNsb3BlCiAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsICAvLyBjb25jZWFsTXV0ZVJlbGVhc2UKICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCAgIC8vIGNvbmNlYWxDb21mTm9pc2VMZXZlbAogICAgKTsKICBpZiAoIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKQogICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkgewogICAgZ290byBiYWlsOwogIH0KCiAgLyogR2V0IG5ldyBkZWxheSAqLwogIGJzRGVsYXkgPSBDQ29uY2VhbG1lbnRfR2V0RGVsYXkocENvbmNlYWxEYXRhKTsKCiAgewogICAgU0JSX0VSUk9SIHNickVyciA9IFNCUkRFQ19PSzsKCiAgICAvKiBzZXQgU0JSIGJpdHN0cmVhbSBkZWxheSAqLwogICAgc2JyRXJyID0gc2JyRGVjb2Rlcl9TZXRQYXJhbSAoCiAgICAgIGhTYnJEZWMsCiAgICAgIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAogICAgICBic0RlbGF5CiAgICApOwoKICAgIHN3aXRjaCAoc2JyRXJyKSB7CiAgICBjYXNlIFNCUkRFQ19PSzoKICAgIGNhc2UgU0JSREVDX05PVF9JTklUSUFMSVpFRDoKICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgewogICAgICAgIC8qIHNhdmUgdGhlIHBhcmFtIHZhbHVlIGFuZCBzZXQgbGF0ZXIKICAgICAgICAgICAod2hlbiBTQlIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQpICovCiAgICAgICAgc2VsZi0+c2JyUGFyYW1zLmJzRGVsYXkgPSBic0RlbGF5OwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgICBnb3RvIGJhaWw7CiAgICB9CiAgfQoKICBlcnJvclN0YXR1cyA9CiAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKICAgICAgaERyY0luZm8sCiAgICAgIERSQ19CU19ERUxBWSwKICAgICAgYnNEZWxheQogICAgKTsKICBpZiAoIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKQogICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkgewogICAgZ290byBiYWlsOwogIH0KCiAgaWYgKGVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKICAgIFBDTURNWF9FUlJPUiBlcnIgPQogICAgICBwY21EbXhfU2V0UGFyYW0gKAogICAgICAgIGhQY21EbXgsCiAgICAgICAgRE1YX0JTX0RBVEFfREVMQVksCiAgICAgICAgYnNEZWxheQogICAgICApOwogICAgc3dpdGNoIChlcnIpIHsKICAgIGNhc2UgUENNRE1YX0lOVkFMSURfSEFORExFOgogICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICBjYXNlIFBDTURNWF9PSzoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KICB9CgoKYmFpbDoKICBpZiAoIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKQogICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkKICB7CiAgICAvKiBSZXZlcnQgdG8gdGhlIGluaXRpYWwgc3RhdGUgKi8KICAgIENDb25jZWFsbWVudF9TZXRQYXJhbXMgKAogICAgICAgIHBDb25jZWFsRGF0YSwKICAgICAgICAoaW50KWJhY2t1cE1ldGhvZCwKICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELAogICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCiAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVECiAgICAgICk7CiAgICAvKiBSZXZlcnQgU0JSIGJpdHN0cmVhbSBkZWxheSAqLwogICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoCiAgICAgICAgaFNickRlYywKICAgICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKICAgICAgICBiYWNrdXBEZWxheQogICAgICApOwogICAgLyogUmV2ZXJ0IERSQyBiaXRzdHJlYW0gZGVsYXkgKi8KICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAogICAgICAgIGhEcmNJbmZvLAogICAgICAgIERSQ19CU19ERUxBWSwKICAgICAgICBiYWNrdXBEZWxheQogICAgICApOwogICAgLyogUmV2ZXJ0IFBDTSBtaXhkb3duIGJpdHN0cmVhbSBkZWxheSAqLwogICAgcGNtRG14X1NldFBhcmFtICgKICAgICAgICBoUGNtRG14LAogICAgICAgIERNWF9CU19EQVRBX0RFTEFZLAogICAgICAgIGJhY2t1cERlbGF5CiAgICAgICk7CiAgfQoKICByZXR1cm4gZXJyb3JTdGF0dXM7Cn0KCgpMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9TZXRQYXJhbSAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLCAgIC8qITwgSGFuZGxlIG9mIHRoZSBkZWNvZGVyIGluc3RhbmNlICovCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNERUNfUEFSQU0gICAgICAgcGFyYW0sICAvKiE8IFBhcmFtZXRlciB0byBzZXQgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIHZhbHVlKSAgLyohPCBQYXJhbWV0ZXIgdmFsdWVkICAgICAgICAgICAgICAgKi8KewogIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKICBDQ29uY2VhbFBhcmFtcyAgKnBDb25jZWFsRGF0YSA9IE5VTEw7CiAgSEFORExFX0FBQ19EUkMgaERyY0luZm8gPSBOVUxMOwogIEhBTkRMRV9QQ01fRE9XTk1JWCBoUGNtRG14ID0gTlVMTDsKICBURExpbWl0ZXJQdHIgaFBjbVRkbCA9IE5VTEw7CgogIC8qIGNoZWNrIGRlY29kZXIgaGFuZGxlICovCiAgaWYgKHNlbGYgIT0gTlVMTCkgewogICAgcENvbmNlYWxEYXRhID0gJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhOwogICAgaERyY0luZm8gPSBzZWxmLT5oRHJjSW5mbzsKICAgIGhQY21EbXggPSBzZWxmLT5oUGNtVXRpbHM7CiAgICBoUGNtVGRsID0gc2VsZi0+aExpbWl0ZXI7CiAgfSBlbHNlIHsKICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICB9CgogIC8qIGNvbmZpZ3VyZSB0aGUgc3Vic3lzdGVtcyAqLwogIHN3aXRjaCAocGFyYW0pCiAgewogIGNhc2UgQUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQ6CiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMSkgewogICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICB9CiAgICBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZCA9IHZhbHVlOwogICAgYnJlYWs7CgogIGNhc2UgQUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTOgogICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAoOCkpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICB7CiAgICAgIFBDTURNWF9FUlJPUiBlcnI7CgogICAgICBlcnIgPSBwY21EbXhfU2V0UGFyYW0gKAogICAgICAgICAgICAgIGhQY21EbXgsCiAgICAgICAgICAgICAgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsCiAgICAgICAgICAgICAgdmFsdWUgKTsKCiAgICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgIGNhc2UgUENNRE1YX09LOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgfQogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTOgogICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAoOCkpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICB7CiAgICAgIFBDTURNWF9FUlJPUiBlcnI7CgogICAgICBlcnIgPSBwY21EbXhfU2V0UGFyYW0gKAogICAgICAgICAgICAgIGhQY21EbXgsCiAgICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsCiAgICAgICAgICAgICAgdmFsdWUgKTsKCiAgICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgIGNhc2UgUENNRE1YX09LOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgfQogICAgfQogICAgYnJlYWs7CgogIGNhc2UgQUFDX1BDTV9EVUFMX0NIQU5ORUxfT1VUUFVUX01PREU6CiAgICB7CiAgICAgIFBDTURNWF9FUlJPUiBlcnI7CgogICAgICBlcnIgPSBwY21EbXhfU2V0UGFyYW0gKAogICAgICAgICAgICAgIGhQY21EbXgsCiAgICAgICAgICAgICAgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFLAogICAgICAgICAgICAgIHZhbHVlICk7CgogICAgICBzd2l0Y2ggKGVycikgewogICAgICBjYXNlIFBDTURNWF9PSzoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6CiAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwoKCiAgY2FzZSBBQUNfUENNX0xJTUlURVJfRU5BQkxFOgogICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAxKSB7CiAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgIH0KICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyID0gdmFsdWU7CiAgICBicmVhazsKCiAgY2FzZSBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUU6CiAgICBpZiAodmFsdWUgPD0gMCkgeyAgLyogbW9kdWxlIGZ1bmN0aW9uIGNvbnZlcnRzIHZhbHVlIHRvIHVuc2lnbmVkICovCiAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgfQogICAgc3dpdGNoIChzZXRMaW1pdGVyQXR0YWNrKGhQY21UZGwsIHZhbHVlKSkgewogICAgY2FzZSBURExJTUlUX09LOgogICAgICBicmVhazsKICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX0hBTkRMRToKICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIEFBQ19QQ01fTElNSVRFUl9SRUxFQVNfVElNRToKICAgIGlmICh2YWx1ZSA8PSAwKSB7ICAvKiBtb2R1bGUgZnVuY3Rpb24gY29udmVydHMgdmFsdWUgdG8gdW5zaWduZWQgKi8KICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICBzd2l0Y2ggKHNldExpbWl0ZXJSZWxlYXNlKGhQY21UZGwsIHZhbHVlKSkgewogICAgY2FzZSBURExJTUlUX09LOgogICAgICBicmVhazsKICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX0hBTkRMRToKICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORzoKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICAgICAgIHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nID0gY2hhbm5lbE1hcHBpbmdUYWJsZVBhc3N0aHJvdWdoOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICAgICAgIHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nID0gY2hhbm5lbE1hcHBpbmdUYWJsZVdBVjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgICAgIGJyZWFrOwogICAgfQogICAgYnJlYWs7CgoKICBjYXNlIEFBQ19RTUZfTE9XUE9XRVI6CiAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDEpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IFFNRiBtb2RlIChtaWdodCBiZSBvdmVycmlkZW4pCiAgICAgKiAgMDpIUSAoY29tcGxleCkKICAgICAqICAxOkxQIChwYXJ0aWFsbHkgY29tcGxleCkKICAgICAqLwogICAgc2VsZi0+cW1mTW9kZVVzZXIgPSAoUU1GX01PREUpdmFsdWU7CiAgICBicmVhazsKCgogIGNhc2UgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1I6CiAgICAvKiBEUkMgY29tcHJlc3Npb24gZmFjdG9yICh3aGVyZSAwIGlzIG5vIGFuZCAxMjcgaXMgbWF4IGNvbXByZXNzaW9uKSAqLwogICAgZXJyb3JTdGF0dXMgPQogICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKICAgICAgICBoRHJjSW5mbywKICAgICAgICBEUkNfQ1VUX1NDQUxFLAogICAgICAgIHZhbHVlCiAgICAgICk7CiAgICBicmVhazsKCiAgY2FzZSBBQUNfRFJDX0JPT1NUX0ZBQ1RPUjoKICAgIC8qIERSQyBib29zdCBmYWN0b3IgKHdoZXJlIDAgaXMgbm8gYW5kIDEyNyBpcyBtYXggYm9vc3QpICovCiAgICBlcnJvclN0YXR1cyA9CiAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAogICAgICAgIGhEcmNJbmZvLAogICAgICAgIERSQ19CT09TVF9TQ0FMRSwKICAgICAgICB2YWx1ZQogICAgICApOwogICAgYnJlYWs7CgogIGNhc2UgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUw6CiAgICAvKiBEUkMgcmVmZXJlbmNlIGxldmVsIHF1YW50aXplZCBpbiAwLjI1ZEIgc3RlcHMgdXNpbmcgdmFsdWVzIFswLi4xMjddIGl0IGlzICctJyBmb3IgYW5hbG9nIHNjYWxpbmcgKi8KICAgIGVycm9yU3RhdHVzID0KICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCiAgICAgICAgaERyY0luZm8sCiAgICAgICAgVEFSR0VUX1JFRl9MRVZFTCwKICAgICAgICB2YWx1ZQogICAgICApOwogICAgYnJlYWs7CgogIGNhc2UgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTjoKICAgIC8qIERvbid0IG5lZWQgdG8gb3ZlcndyaXRlIGN1dC9ib29zdCB2YWx1ZXMgKi8KICAgIGVycm9yU3RhdHVzID0KICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCiAgICAgICAgaERyY0luZm8sCiAgICAgICAgQVBQTFlfSEVBVllfQ09NUFJFU1NJT04sCiAgICAgICAgdmFsdWUKICAgICAgKTsKICAgIGJyZWFrOwoKCiAgY2FzZSBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSOgogICAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHNlbGYtPmhJbnB1dCwgVFBERUNfUEFSQU1fUkVTRVQsIDEpOwogICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOwogICAgc2VsZi0+c3RyZWFtSW5mby5udW1CYWRCeXRlcyA9IDA7CiAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOwogICAgLyogYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oc2VsZik7ICovCiAgICBicmVhazsKCiAgY2FzZSBBQUNfQ09OQ0VBTF9NRVRIT0Q6CiAgICAvKiBDaGFuZ2luZyB0aGUgY29uY2VhbG1lbnQgbWV0aG9kIGNhbiBpbnRyb2R1Y2UgYWRkaXRpb25hbCBiaXRzdHJlYW0gZGVsYXkuIEFuZAogICAgICAgdGhhdCBpbiB0dXJuIGFmZmVjdHMgc3ViIGxpYnJhcmllcyBhbmQgbW9kdWxlcyB3aGljaCBtYWtlcyB0aGUgd2hvbGUgdGhpbmcgcXVpdGUKICAgICAgIGNvbXBsZXguICBTbyB0aGUgY29tcGxldGUgY2hhbmdpbmcgcm91dGluZSBpcyBwYWNrZWQgaW50byBhIGhlbHBlciBmdW5jdGlvbiB3aGljaAogICAgICAga2VlcHMgYWxsIG1vZHVsZXMgYW5kIGxpYnMgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGV2ZW4gaW4gdGhlIGNhc2UgYW4gZXJyb3Igb2NjdXJlcy4gKi8KICAgIGVycm9yU3RhdHVzID0gc2V0Q29uY2VhbE1ldGhvZCAoIHNlbGYsIHZhbHVlICk7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KCiAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cn0KCgpMSU5LU1BFQ19DUFAgSEFORExFX0FBQ0RFQ09ERVIgYWFjRGVjb2Rlcl9PcGVuKFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwgVUlOVCBuck9mTGF5ZXJzKQp7CiAgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgKmFhY0RlYyA9IE5VTEw7CiAgSEFORExFX1RSQU5TUE9SVERFQyBwSW47CiAgaW50IGVyciA9IDA7CgogIC8qIEFsbG9jYXRlIHRyYW5zcG9ydCBsYXllciBzdHJ1Y3QuICovCiAgcEluID0gdHJhbnNwb3J0RGVjX09wZW4odHJhbnNwb3J0Rm10LCBUUF9GTEFHX01QRUc0KTsKICBpZiAocEluID09IE5VTEwpIHsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHBJbiwgVFBERUNfUEFSQU1fSUdOT1JFX0JVRkZFUkZVTExORVNTLCAxKTsKCiAgLyogQWxsb2NhdGUgQUFDIGRlY29kZXIgY29yZSBzdHJ1Y3QuICovCiAgYWFjRGVjID0gQ0FhY0RlY29kZXJfT3Blbih0cmFuc3BvcnRGbXQpOwoKICBpZiAoYWFjRGVjID09IE5VTEwpIHsKICAgIHRyYW5zcG9ydERlY19DbG9zZSgmcEluKTsKICAgIGdvdG8gYmFpbDsKICB9CiAgYWFjRGVjLT5oSW5wdXQgPSBwSW47CgogIGFhY0RlYy0+bnJPZkxheWVycyA9IG5yT2ZMYXllcnM7CgogIGFhY0RlYy0+Y2hhbm5lbE91dHB1dE1hcHBpbmcgPSBjaGFubmVsTWFwcGluZ1RhYmxlV0FWOwoKICAvKiBSZWdpc3RlciBDb25maWcgVXBkYXRlIGNhbGxiYWNrLiAqLwogIHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrKHBJbiwgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjaywgKHZvaWQqKWFhY0RlYyk7CgogIC8qIG9wZW4gU0JSIGRlY29kZXIgKi8KICBpZiAoIFNCUkRFQ19PSyAhPSBzYnJEZWNvZGVyX09wZW4gKCAmYWFjRGVjLT5oU2JyRGVjb2RlciApKSB7CiAgICBlcnIgPSAtMTsKICAgIGdvdG8gYmFpbDsKICB9CiAgYWFjRGVjLT5xbWZNb2RlVXNlciA9IE5PVF9ERUZJTkVEOwogIHRyYW5zcG9ydERlY19SZWdpc3RlclNickNhbGxiYWNrKGFhY0RlYy0+aElucHV0LCAoY2JTYnJfdClzYnJEZWNvZGVyX0hlYWRlciwgKHZvaWQqKWFhY0RlYy0+aFNickRlY29kZXIpOwoKCiAgcGNtRG14X09wZW4oICZhYWNEZWMtPmhQY21VdGlscyApOwogIGlmIChhYWNEZWMtPmhQY21VdGlscyA9PSBOVUxMKSB7CiAgICBlcnIgPSAtMTsKICAgIGdvdG8gYmFpbDsKICB9CgogIGFhY0RlYy0+aExpbWl0ZXIgPSBjcmVhdGVMaW1pdGVyKFRETF9BVFRBQ0tfREVGQVVMVF9NUywgVERMX1JFTEVBU0VfREVGQVVMVF9NUywgU0FNUExFX01BWCwgKDgpLCA5NjAwMCk7CiAgaWYgKE5VTEwgPT0gYWFjRGVjLT5oTGltaXRlcikgewogICAgZXJyID0gLTE7CiAgICBnb3RvIGJhaWw7CiAgfQogIGFhY0RlYy0+bGltaXRlckVuYWJsZVVzZXIgPSAoVUNIQVIpLTE7CiAgYWFjRGVjLT5saW1pdGVyRW5hYmxlQ3VyciA9IDA7CgoKCiAgLyogQXNzdXJlIHRoYXQgYWxsIG1vZHVsZXMgaGF2ZSBzYW1lIGRlbGF5ICovCiAgaWYgKCBzZXRDb25jZWFsTWV0aG9kKGFhY0RlYywgQ0NvbmNlYWxtZW50X0dldE1ldGhvZCgmYWFjRGVjLT5jb25jZWFsQ29tbW9uRGF0YSkpICkgewogICAgZXJyID0gLTE7CiAgICBnb3RvIGJhaWw7CiAgfQoKYmFpbDoKICBpZiAoZXJyID09IC0xKSB7CiAgICBhYWNEZWNvZGVyX0Nsb3NlKGFhY0RlYyk7CiAgICBhYWNEZWMgPSBOVUxMOwogIH0KICByZXR1cm4gYWFjRGVjOwp9CgpMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9GaWxsKAogICAgICAgIEhBTkRMRV9BQUNERUNPREVSICAgc2VsZiwKICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKnBCdWZmZXJbXSwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgIGJ1ZmZlclNpemVbXSwKICAgICAgICBVSU5UICAgICAgICAgICAgICAgKnBCeXRlc1ZhbGlkCiAgICAgICAgKQp7CiAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOwogIC8qIGxvb3AgY291bnRlciBmb3IgbGF5ZXJzOyBpZiBub3QgVFRfTVA0X1JBV1BBQ0tFVFMgdXNlZCBhcyBpbmRleCBmb3Igb25seSAKICAgICBhdmFpbGFibGUgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgSU5UIGxheWVyICAgICAgPSAwOwogIElOVCBuck9mTGF5ZXJzID0gc2VsZi0+bnJPZkxheWVyczsKCiAgewogICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgbnJPZkxheWVyczsgbGF5ZXIrKyl7CiAgICAgIHsKICAgICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19GaWxsRGF0YSggc2VsZi0+aElucHV0LCBwQnVmZmVyW2xheWVyXSwgYnVmZmVyU2l6ZVtsYXllcl0sICZwQnl0ZXNWYWxpZFtsYXllcl0sIGxheWVyICk7CiAgICAgICAgaWYgKHRwRXJyICE9IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsgIC8qIE11c3QgYmUgYW4gaW50ZXJuYWwgZXJyb3IgKi8KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBBQUNfREVDX09LOwp9CgoKc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKewogIENBYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsKCiAgaWYgKCBzZWxmLT5oU2JyRGVjb2RlciAhPSBOVUxMICkgewogICAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX0JTX0lOVEVSUlVQVElPTiwgMCk7CiAgfQp9CgpzdGF0aWMgdm9pZCBhYWNEZWNvZGVyX1VwZGF0ZUJpdFN0cmVhbUNvdW50ZXJzKENTdHJlYW1JbmZvICpwU2ksIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IG5CaXRzLCBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1cykKewogIC8qIGNhbGN1bGF0ZSBiaXQgZGlmZmVyZW5jZSAoYW1vdW50IG9mIGJpdHMgbW92ZWQgZm9yd2FyZCkgKi8KICBuQml0cyA9IG5CaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CgogIC8qIE5vdGU6IFRoZSBhbW91bnQgb2YgYml0cyBjb25zdW1lZCBtaWdodCBiZWNvbWUgbmVnYXRpdmUgd2hlbiBwYXJzaW5nIGEKICAgICBiaXQgc3RyZWFtIHdpdGggc2V2ZXJhbCBzdWIgZnJhbWVzLCBhbmQgd2UgZmluZCBvdXQgYXQgdGhlIGxhc3Qgc3ViIGZyYW1lCiAgICAgdGhhdCB0aGUgdG90YWwgZnJhbWUgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBzdW0gb2Ygc3ViIGZyYW1lIGxlbmd0aC4gCiAgICAgSWYgdGhpcyBoYXBwZW5zLCB0aGUgdHJhbnNwb3J0IGRlY29kZXIgbWlnaHQgd2FudCB0byByZXdpbmQgdG8gdGhlIHN1cHBvc2VkCiAgICAgZW5kaW5nIG9mIHRoZSB0cmFuc3BvcnQgZnJhbWUsIGFuZCB0aGlzIHBvc2l0aW9uIG1pZ2h0IGJlIGJlZm9yZSB0aGUgbGFzdAogICAgIGFjY2VzcyB1bml0IGJlZ2lubmluZy4gKi8KCiAgLyogQ2FsYyBiaXRyYXRlLiAqLwogIGlmIChwU2ktPmZyYW1lU2l6ZSA+IDApIHsKICAgIHBTaS0+Yml0UmF0ZSA9IChuQml0cyAqIHBTaS0+c2FtcGxlUmF0ZSkvcFNpLT5mcmFtZVNpemU7CiAgfQoKICAvKiBiaXQvYnl0ZSBjb3VudGVycyAqLwogIHsKICAgIGludCBuQnl0ZXM7CgogICAgbkJ5dGVzID0gbkJpdHM+PjM7CiAgICBwU2ktPm51bVRvdGFsQnl0ZXMgKz0gbkJ5dGVzOwogICAgaWYgKElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKICAgICAgcFNpLT5udW1Ub3RhbEFjY2Vzc1VuaXRzKys7CiAgICB9CiAgICBpZiAoSVNfREVDT0RFX0VSUk9SKEVycm9yU3RhdHVzKSkgewogICAgICBwU2ktPm51bUJhZEJ5dGVzICs9IG5CeXRlczsKICAgICAgcFNpLT5udW1CYWRBY2Nlc3NVbml0cysrOwogICAgfQogIH0KfQoKc3RhdGljIElOVCBhYWNEZWNvZGVyX0VzdGltYXRlTnVtYmVyT2ZMb3N0RnJhbWVzKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCnsKICBJTlQgbjsKCiAgdHJhbnNwb3J0RGVjX0dldE1pc3NpbmdBY2Nlc3NVbml0Q291bnQoICZuLCBzZWxmLT5oSW5wdXQpOwoKICByZXR1cm4gbjsKfQoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoCiAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgSU5UX1BDTSAgICAgICAgICAgKnBUaW1lRGF0YSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncykKewogICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgICBJTlQgbGF5ZXI7CiAgICBJTlQgbkJpdHM7CiAgICBJTlQgaW50ZXJsZWF2ZWQgPSBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZDsKICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCczsKICAgIGludCBmVHBJbnRlcnJ1cHRpb24gPSAwOyAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgaW50ZXJydXB0aW9uIGRldGVjdGlvbi4gKi8KICAgIGludCBmVHBDb25jZWFsID0gMDsgICAgICAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgY29uY2VhbG1lbnQuICovCgoKICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICB9CgogICAgaWYgKGZsYWdzICYgQUFDREVDX0lOVFIpIHsKICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOwogICAgfQoKICAgIGhCcyA9IHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oc2VsZi0+aElucHV0LCAwKTsKCiAgICAvKiBHZXQgY3VycmVudCBiaXRzIHBvc2l0aW9uIGZvciBiaXRyYXRlIGNhbGN1bGF0aW9uLiAqLwogICAgbkJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgIGlmICghIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkgKSApCiAgICB7CiAgICAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnI7CgogICAgICBmb3IobGF5ZXIgPSAwOyBsYXllciA8IHNlbGYtPm5yT2ZMYXllcnM7IGxheWVyKyspCiAgICAgIHsKICAgICAgICBlcnIgPSB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQoc2VsZi0+aElucHV0LCBsYXllcik7CiAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM6CiAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFM7CiAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX1NZTkNfRVJST1I6CiAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gYWFjRGVjb2Rlcl9Fc3RpbWF0ZU51bWJlck9mTG9zdEZyYW1lcyhzZWxmKTsKICAgICAgICAgICAgZlRwSW50ZXJydXB0aW9uID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ6CiAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ORUVEX1RPX1JFU1RBUlQ7CiAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX0NSQ19FUlJPUjoKICAgICAgICAgICAgZlRwQ29uY2VhbCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOS05PV047CiAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA+IDApIHsKICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cy0tOwogICAgICB9CiAgICB9CgogICAgLyogU2lnbmFsIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uIHRvIG90aGVyIG1vZHVsZXMgaWYgcmVxdWlyZWQuICovCiAgICBpZiAoIGZUcEludGVycnVwdGlvbiB8fCAoZmxhZ3MgJiAoQUFDREVDX0lOVFJ8QUFDREVDX0NMUkhJU1QpKSApCiAgICB7CiAgICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9DTEVBUl9ISVNUT1JZLCAoZmxhZ3MmQUFDREVDX0NMUkhJU1QpKTsKICAgICAgYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oc2VsZik7CiAgICAgIGlmICggISAoZmxhZ3MgJiBBQUNERUNfSU5UUikgKSB7CiAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1RSQU5TUE9SVF9TWU5DX0VSUk9SOwogICAgICAgIGdvdG8gYmFpbDsKICAgICAgfQogICAgfQoKICAgIC8qIEVtcHR5IGJpdCBidWZmZXIgaW4gY2FzZSBvZiBmbHVzaCByZXF1ZXN0LiAqLwogICAgaWYgKGZsYWdzICYgQUFDREVDX0ZMVVNIKQogICAgewogICAgICB0cmFuc3BvcnREZWNfU2V0UGFyYW0oc2VsZi0+aElucHV0LCBUUERFQ19QQVJBTV9SRVNFVCwgMSk7CiAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1CYWRCeXRlcyA9IDA7CiAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtVG90YWxCeXRlcyA9IDA7CiAgICB9CiAgICAvKiBSZXNldCB0aGUgb3V0cHV0IGRlbGF5IGZpZWxkLiBUaGUgbW9kdWxlcyB3aWxsIGFkZCB0aGVpciBmaWd1cmVzIG9uZSBhZnRlciBhbm90aGVyLiAqLwogICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9IDA7CgogICAgaWYgKHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyPT0oVUNIQVIpLTEpIHsKICAgICAgLyogRW5iYWxlIGxpbWl0ZXIgZm9yIGFsbCBub24tbG93ZGVsYXkgQU9UJ3MuICovCiAgICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyID0gKCBzZWxmLT5mbGFncyAmIChBQ19MRHxBQ19FTEQpICkgPyAwIDogMTsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiBVc2UgbGltaXRlciBjb25maWd1cmF0aW9uIGFzIHJlcXVlc3RlZC4gKi8KICAgICAgc2VsZi0+bGltaXRlckVuYWJsZUN1cnIgPSBzZWxmLT5saW1pdGVyRW5hYmxlVXNlcjsKICAgIH0KICAgIC8qIHJlc2V0IGxpbWl0ZXIgZ2FpbiBvbiBhIHBlciBmcmFtZSBiYXNpcyAqLwogICAgc2VsZi0+ZXh0R2FpblswXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKGZsb2F0KSgxPDxURExfR0FJTl9TQ0FMSU5HKSk7CgoKICAgIEVycm9yU3RhdHVzID0gQ0FhY0RlY29kZXJfRGVjb2RlRnJhbWUoc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfCAoZlRwQ29uY2VhbCA/IEFBQ0RFQ19DT05DRUFMIDogMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZURhdGFTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCk7CgogICAgaWYgKCEoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUx8QUFDREVDX0ZMVVNIKSkpIHsKICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOwogICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCk7CiAgICAgIGlmICh0cEVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgfQogICAgfQoKICAgIC8qIElmIHRoZSBjdXJyZW50IHBUaW1lRGF0YSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc2lnbmFsLCB0aGVyZSBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvLCBzbyBiYWlsLiAqLwogICAgaWYgKCAhIElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykgKSB7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICB7CiAgICAgIC8qIEV4cG9ydCBkYXRhIGludG8gc3RyZWFtaW5mbyBzdHJ1Y3R1cmUgKi8KICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlOwogICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKICAgIH0KICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzOwoKCgogICAgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoc2VsZik7CgovKiBzYnIgZGVjb2RlciAqLwoKICAgIGlmIChFcnJvclN0YXR1cyB8fCAoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkgfHwgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1swXS0+Y29uY2VhbG1lbnRJbmZvLmNvbmNlYWxTdGF0ZSA+IENvbmNlYWxTdGF0ZV9GYWRlSW4pCiAgICB7CiAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOyAgLyogaWYgYW4gZXJyb3IgaGFzIG9jY3VyZWQgZG8gY29uY2VhbG1lbnQgaW4gdGhlIFNCUiBkZWNvZGVyIHRvbyAqLwogICAgfQoKICAgIGlmIChzZWxmLT5zYnJFbmFibGVkKQogICAgewogICAgICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CiAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM8NykpID8gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA6IHNlbGYtPmNoTWFwSW5kZXg7CgogICAgICAvKiBzZXQgcGFyYW1zICovCiAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c2JyUGFyYW1zLmJzRGVsYXkpOwogICAgICBzYnJEZWNvZGVyX1NldFBhcmFtICggc2VsZi0+aFNickRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRkxVU0hfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgKTsKCiAgICAgIGlmICggc2VsZi0+c3RyZWFtSW5mby5hb3QgPT0gQU9UX0VSX0FBQ19FTEQgKSB7CiAgICAgICAgLyogQ29uZmlndXJlIFFNRiAqLwogICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0xEX1FNRl9USU1FX0FMSUdOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi0+ZmxhZ3MgJiBBQ19MRF9NUFMpID8gMSA6IDAgKTsKICAgICAgfQoKICAgICAgewogICAgICAgIFBDTURNWF9FUlJPUiBkbXhFcnI7CiAgICAgICAgSU5UICBtYXhPdXRDaCA9IDA7CgogICAgICAgIGRteEVyciA9IHBjbURteF9HZXRQYXJhbShzZWxmLT5oUGNtVXRpbHMsIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAmbWF4T3V0Q2gpOwogICAgICAgIGlmICggKGRteEVyciA9PSBQQ01ETVhfT0spICYmIChtYXhPdXRDaCA9PSAxKSApIHsKICAgICAgICAgIC8qIERpc2FibGUgUFMgcHJvY2Vzc2luZyBpZiB3ZSBoYXZlIHRvIGNyZWF0ZSBhIG1vbm8gb3V0cHV0IHNpZ25hbC4gKi8KICAgICAgICAgIHNlbGYtPnBzUG9zc2libGUgPSAwOwogICAgICAgIH0KICAgICAgfQoKCiAgICAgIC8qIGFwcGx5IFNCUiBwcm9jZXNzaW5nICovCiAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9BcHBseSAoIHNlbGYtPmhTYnJEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmdbY2hPdXRNYXBJZHhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cHNQb3NzaWJsZSk7CgoKICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB7CiAgICAgICAjZGVmaW5lIFVQU19TQ0FMRSAgMiAgLyogTWF4aW11bSB1cHNhbXBsaW5nIGZhY3RvciBpcyA0IChDRUxQK1NCUikgKi8KICAgICAgIEZJWFBfREJMICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PFVQU19TQ0FMRSkpOwoKICAgICAgIC8qIFVwZGF0ZSBkYXRhIGluIHN0cmVhbWluZm8gc3RydWN0dXJlLiBBc3N1bWUgdGhhdCB0aGUgU0JSIHVwc2FtcGxpbmcgZmFjdG9yIGlzIGVpdGhlciAxIG9yIDIgKi8KICAgICAgIHNlbGYtPmZsYWdzIHw9IEFDX1NCUl9QUkVTRU5UOwogICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSAhPSBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUpIHsKICAgICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID09IDc2OCkgewogICAgICAgICAgIHVwc2FtcGxlRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoOC4wZi8oMzw8VVBTX1NDQUxFKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdXBzYW1wbGVGYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgyLjBmLygxPDxVUFNfU0NBTEUpKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgLyogQXBwbHkgdXBzYW1wbGluZyBmYWN0b3IgdG8gYm90aCB0aGUgY29yZSBmcmFtZSBsZW5ndGggYW5kIHRoZSBjb3JlIGRlbGF5ICovCiAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAgICA9ICAgICAgIChJTlQpZk11bHQoKEZJWFBfREJMKXNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lPDxVUFNfU0NBTEUsIHVwc2FtcGxlRmFjdG9yKTsKICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgID0gKFVJTlQpKElOVClmTXVsdCgoRklYUF9EQkwpc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheTw8VVBTX1NDQUxFLCB1cHNhbXBsZUZhY3Rvcik7CiAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IHNickRlY29kZXJfR2V0RGVsYXkoIHNlbGYtPmhTYnJEZWNvZGVyICk7CgogICAgICAgaWYgKHNlbGYtPnBzUG9zc2libGUpIHsKICAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gQUNfUFNfUFJFU0VOVDsKICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbMF0gPSBBQ1RfRlJPTlQ7CiAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlWzFdID0gQUNUX0ZST05UOwogICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1swXSA9IDA7CiAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzFdID0gMTsKICAgICAgIH0KICAgICB9CiAgIH0KCgogICAgewogICAgSU5UIHBjbUxpbWl0ZXJTY2FsZSA9IDA7CiAgICBQQ01ETVhfRVJST1IgZG14RXJyID0gUENNRE1YX09LOwogICAgaWYgKCBmbGFncyAmIChBQUNERUNfSU5UUiB8IEFBQ0RFQ19DTFJISVNUKSApIHsKICAgICAgLyogZGVsZXRlIGRhdGEgZnJvbSB0aGUgcGFzdCAoZS5nLiBtaXhkb3duIGNvZWZpY2llbnRzKSAqLwogICAgICBwY21EbXhfUmVzZXQoIHNlbGYtPmhQY21VdGlscywgUENNRE1YX1JFU0VUX0JTX0RBVEEgKTsKICAgIH0KICAgIC8qIGRvIFBDTSBwb3N0IHByb2Nlc3NpbmcgKi8KICAgIGRteEVyciA9IHBjbURteF9BcHBseUZyYW1lICgKICAgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLAogICAgICAgICAgICBwVGltZURhdGEsCiAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLAogICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAogICAgICAgICAgICBpbnRlcmxlYXZlZCwKICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsCiAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZywKICAgICAgICAgICAgKHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyKSA/ICZwY21MaW1pdGVyU2NhbGUgOiBOVUxMCiAgICAgICk7CiAgICBpZiAoZG14RXJyID09IFBDTURNWF9JTlZBTElEX01PREUpIHsKICAgICAgLyogQW5ub3VuY2UgdGhlIGZyYW1ld29yayB0aGF0IHRoZSBjdXJyZW50IGNvbWJpbmF0aW9uIG9mIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZG93bm1peAogICAgICAgKiBzZXR0aW5ncyBhcmUgbm90IGtub3cgdG8gcHJvZHVjZSBhIHByZWRpY3RhYmxlIGJlaGF2aW9yIGFuZCB0aHVzIG1heWJlIHByb2R1Y2Ugc3RyYW5nZSBvdXRwdXQuICovCiAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CiAgICB9CgogICAgaWYgKCBmbGFncyAmIEFBQ0RFQ19DTFJISVNUICkgewogICAgICAvKiBEZWxldGUgdGhlIGRlbGF5ZWQgc2lnbmFsLiAqLwogICAgICByZXNldExpbWl0ZXIoc2VsZi0+aExpbWl0ZXIpOwogICAgfQogICAgaWYgKHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyKQogICAgewogICAgICAvKiBTZXQgYWN0dWFsIHNpZ25hbCBwYXJhbWV0ZXJzICovCiAgICAgIHNldExpbWl0ZXJOQ2hhbm5lbHMoc2VsZi0+aExpbWl0ZXIsIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMpOwogICAgICBzZXRMaW1pdGVyU2FtcGxlUmF0ZShzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKTsKCiAgICAgIGFwcGx5TGltaXRlcigKICAgICAgICAgICAgICBzZWxmLT5oTGltaXRlciwKICAgICAgICAgICAgICBwVGltZURhdGEsCiAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbiwKICAgICAgICAgICAgICZwY21MaW1pdGVyU2NhbGUsCiAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICBzZWxmLT5leHRHYWluRGVsYXksCiAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUKICAgICAgICAgICAgICApOwoKICAgICAgLyogQW5ub3VuY2UgdGhlIGFkZGl0aW9uYWwgbGltaXRlciBvdXRwdXQgZGVsYXkgKi8KICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSArPSBnZXRMaW1pdGVyRGVsYXkoc2VsZi0+aExpbWl0ZXIpOwogICAgfQogICAgfQoKCiAgICAvKiBTaWduYWwgaW50ZXJydXB0aW9uIHRvIHRha2UgZWZmZWN0IGluIG5leHQgZnJhbWUuICovCiAgICBpZiAoIGZsYWdzICYgQUFDREVDX0ZMVVNIICkgewogICAgICBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsKICAgIH0KCiAgICAvKiBVcGRhdGUgZXh0ZXJuYWxseSB2aXNpYmxlIGNvcHkgb2YgZmxhZ3MgKi8KICAgIHNlbGYtPnN0cmVhbUluZm8uZmxhZ3MgPSBzZWxmLT5mbGFnczsKCmJhaWw6CgogICAgLyogVXBkYXRlIFN0YXRpc3RpY3MgKi8KICAgIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoJnNlbGYtPnN0cmVhbUluZm8sIGhCcywgbkJpdHMsIEVycm9yU3RhdHVzKTsKCiAgICByZXR1cm4gRXJyb3JTdGF0dXM7Cn0KCkxJTktTUEVDX0NQUCB2b2lkIGFhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICkKewogIGlmIChzZWxmID09IE5VTEwpCiAgICByZXR1cm47CgoKICBpZiAoc2VsZi0+aExpbWl0ZXIgIT0gTlVMTCkgewogICAgZGVzdHJveUxpbWl0ZXIoc2VsZi0+aExpbWl0ZXIpOwogIH0KCiAgaWYgKHNlbGYtPmhQY21VdGlscyAhPSBOVUxMKSB7CiAgICBwY21EbXhfQ2xvc2UoICZzZWxmLT5oUGNtVXRpbHMgKTsKICB9CgoKCiAgaWYgKHNlbGYtPmhTYnJEZWNvZGVyICE9IE5VTEwpIHsKICAgIHNickRlY29kZXJfQ2xvc2UoJnNlbGYtPmhTYnJEZWNvZGVyKTsKICB9CgogIGlmIChzZWxmLT5oSW5wdXQgIT0gTlVMTCkgewogICAgdHJhbnNwb3J0RGVjX0Nsb3NlKCZzZWxmLT5oSW5wdXQpOwogIH0KCiAgQ0FhY0RlY29kZXJfQ2xvc2Uoc2VsZik7Cn0KCgpMSU5LU1BFQ19DUFAgQ1N0cmVhbUluZm8qIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKQp7CiAgcmV0dXJuIENBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oc2VsZik7Cn0KCkxJTktTUEVDX0NQUCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvICggTElCX0lORk8gKmluZm8gKQp7CiAgaW50IGk7CgogIGlmIChpbmZvID09IE5VTEwpIHsKICAgIHJldHVybiAtMTsKICB9CgogIHNickRlY29kZXJfR2V0TGliSW5mbyggaW5mbyApOwogIHRyYW5zcG9ydERlY19HZXRMaWJJbmZvKCBpbmZvICk7CiAgRkRLX3Rvb2xzR2V0TGliSW5mbyggaW5mbyApOwogIHBjbURteF9HZXRMaWJJbmZvKCBpbmZvICk7CgogIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwogIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewogICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKICB9CiAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIGluZm8gKz0gaTsKCiAgaW5mby0+bW9kdWxlX2lkID0gRkRLX0FBQ0RFQzsKICAvKiBidWlsZCBvd24gbGlicmFyeSBpbmZvICovCiAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKEFBQ0RFQ09ERVJfTElCX1ZMMCwgQUFDREVDT0RFUl9MSUJfVkwxLCBBQUNERUNPREVSX0xJQl9WTDIpOwogIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKICBpbmZvLT5idWlsZF9kYXRlID0gQUFDREVDT0RFUl9MSUJfQlVJTERfREFURTsKICBpbmZvLT5idWlsZF90aW1lID0gQUFDREVDT0RFUl9MSUJfQlVJTERfVElNRTsKICBpbmZvLT50aXRsZSA9IEFBQ0RFQ09ERVJfTElCX1RJVExFOwoKICAvKiBTZXQgZmxhZ3MgKi8KICBpbmZvLT5mbGFncyA9IDAKICAgICAgfCBDQVBGX0FBQ19MQwogICAgICB8IENBUEZfQUFDX1ZDQjExCiAgICAgIHwgQ0FQRl9BQUNfSENSCiAgICAgIHwgQ0FQRl9BQUNfUlZMQwogICAgICB8IENBUEZfRVJfQUFDX0xECiAgICAgIHwgQ0FQRl9FUl9BQUNfRUxECiAgICAgIHwgQ0FQRl9BQUNfQ09OQ0VBTE1FTlQKICAgICAgfCBDQVBGX0FBQ19EUkMKCiAgICAgIHwgQ0FQRl9BQUNfTVBFRzQKCgogICAgICB8IENBUEZfQUFDXzEwMjQKICAgICAgfCBDQVBGX0FBQ185NjAKCiAgICAgIHwgQ0FQRl9BQUNfNTEyCgogICAgICB8IENBUEZfQUFDXzQ4MAoKICAgICAgOwogIC8qIEVuZCBvZiBmbGFncyAqLwoKICByZXR1cm4gMDsKfQoKCgoK