Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLTQgSEUtQUFDIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogXGZpbGUgICBhYWNlbmNfbGliLmgKICogXGJyaWVmICBGREsgQUFDIEVuY29kZXIgbGlicmFyeSBpbnRlcmZhY2UgaGVhZGVyIGZpbGUuCiAqClxtYWlucGFnZSAgSW50cm9kdWN0aW9uCgpcc2VjdGlvbiBTY29wZQoKVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80IEFBQyBFbmNvZGVyCmxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KClRoZSBsaWJyYXJ5IGltcGxlbWVudHMgZW5jb2Rpbmcgb24gdGhlIGJhc2lzIG9mIHRoZSBNUEVHLTIgYW5kIE1QRUctNCBBQUMgTG93LUNvbXBsZXhpdHkKc3RhbmRhcmQsIGFuZCBkZXBlbmRpbmcgb24gdGhlIGxpYnJhcnkncyBjb25maWd1cmF0aW9uLCBNUEVHLTQgSGlnaC1FZmZpY2llbmN5IEFBQyB2MiBhbmQvb3IgQUFDLUVMRCBzdGFuZGFyZC4KCkFsbCByZWZlcmVuY2VzIHRvIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMgb3IgQUFDLUVMRCB2ZXJzaW9ucwpvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyB2Mgp2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KClxzZWN0aW9uIGVuY0Jhc2ljcyBFbmNvZGVyIEJhc2ljcwoKVGhpcyBkb2N1bWVudCBjYW4gb25seSBnaXZlIGEgcm91Z2ggb3ZlcnZpZXcgYWJvdXQgdGhlIElTTy9NUEVHLTIgYW5kIElTTy9NUEVHLTQgQUFDIGF1ZGlvIGNvZGluZwpzdGFuZGFyZC4gVG8gdW5kZXJzdGFuZCBhbGwgdGhlIHRlcm1zIGluIHRoaXMgZG9jdW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLgoKLSBJU08vSUVDIDEzODE4LTcgKE1QRUctMiBBQUMpLCB3aGljaCBkZWZpbmVzIHRoZSBzeW50YXggb2YgTVBFRy0yIEFBQyBhdWRpbyBiaXRzdHJlYW1zLgotIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IEFBQywgc3VicGFydHMgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAoKTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mIHRoZSBzaWduYWwuIFRoZSBzaWduYWwgaXMKcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwgY29tcG9uZW50cwphcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLiBcbgpBbiBNUEVHLTIgb3IgTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW0gaXMgY29tcG9zZWQgb2YgZnJhbWVzLiBDb250cmFyeSB0byBNUEVHLTEvMiBMYXllci0zIChtcDMpLCB0aGUKbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24gYW55IGxlbmd0aApiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KCgpccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQoKXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpcHRpb24gQVBJIEZpbGVzCgpBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIEFsbCBoZWFkZXIgZmlsZXMKYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBlbmNvZGVyIGxpYnJhcnkgQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBhdAphYWNlbmNfbGliLmguCgpJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGVuY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZQpsaWJBQUNlbmMuYS9saWJGREsuYSAoTElOVVgpIG9yIEZES19mYXN0YWFjbGliLmxpYiAoTVMgVmlzdWFsIEMrKykgZm9yIHRoZSBwbGFpbiBBQUMtTEMgY29yZSBlbmNvZGVyCmFuZCBsaWJTQlJlbmMuYSAoTElOVVgpIG9yIEZES19zYnJFbmNMaWIubGliIChNUyBWaXN1YWwgQysrKSBmb3IgdGhlIFNCUiAoU3BlY3RyYWwgQmFuZApSZXBsaWNhdGlvbikgYW5kIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgbW9kdWxlcy4KClxzZWN0aW9uIENhbGxpbmdTZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCgpGb3IgZW5jb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBiaXRzdHJlYW1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgbWFuZGF0b3J5LiBJbnB1dCByZWFkIGFuZCBvdXRwdXQKd3JpdGUgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgb3BlbiBhbmQgY2xvc2UgZnVuY3Rpb25zIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUKaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbgptYWluLmNwcCB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LgoKLSMgQ2FsbCBhYWNFbmNPcGVuKCkgdG8gYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHJlcXVpcmVkIFxyZWYgZW5jT3BlbiAiY29uZmlndXJhdGlvbiIuXG4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBoQWFjRW5jb2RlciA9Clxza2lwbGluZSBhYWNFbmNPcGVuCi0jIENhbGwgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGZvciBlYWNoIHBhcmFtZXRlciB0byBiZSBzZXQuIEFPVCwgc2FtcGxpbmdyYXRlLCBjaGFubmVsTW9kZSwgYml0cmF0ZSBhbmQgdHJhbnNwb3J0IHR5cGUgYXJlIFxyZWYgZW5jUGFyYW1zICJtYW5kYXRvcnkiLgpcY29kZQogICAgRXJyb3JTdGF0dXMgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBwYXJhbWV0ZXIsIHZhbHVlKTsKXGVuZGNvZGUKLSMgQ2FsbCBhYWNFbmNFbmNvZGUoKSB3aXRoIE5VTEwgcGFyYW1ldGVycyB0byBccmVmIGVuY1JlY29uZiAiaW5pdGlhbGl6ZSIgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHByZXNlbnQgcGFyYW1ldGVyIHNldC4KXHNraXBsaW5lIGFhY0VuY0VuY29kZQotIyBDYWxsIGFhY0VuY0luZm8oKSB0byByZXRyaWV2ZSBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayB0byBiZSB0cmFuc21pdHRlZCBvdXQgb2YgYmFuZC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFJGQzM2NDAgb3IgUkZDMzAxNiBsaWtlIHRyYW5zcG9ydC4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBlbmNJbmZvClxza2lwbGluZSBhYWNFbmNJbmZvCi0jIEVuY29kZSBpbnB1dCBhdWRpbyBkYXRhIGluIGxvb3AuClxza2lwIEVuY29kZSBhcyBsb25nIGFzClxza2lwbGluZSBkbwpcdW50aWwgewpGZWVkIFxyZWYgZmVlZEluQnVmICJpbnB1dCBidWZmZXIiIHdpdGggbmV3IGF1ZGlvIGRhdGEgYW5kIHByb3ZpZGUgaW5wdXQvb3V0cHV0IFxyZWYgYnVmRGVzICJhcmd1bWVudHMiIHRvIGFhY0VuY0VuY29kZSgpLgpcc2tpcGxpbmUgYWFjRW5jRW5jb2RlClx1bnRpbCA7CldyaXRlIFxyZWYgd3JpdGVPdXREYXRhICJvdXRwdXQgZGF0YSIgdG8gZmlsZSBvciBhdWRpbyBkZXZpY2UuIFxza2lwbGluZSB3aGlsZQotIyBDYWxsIGFhY0VuY0Nsb3NlKCkgYW5kIGRlc3Ryb3kgZW5jb2RlciBpbnN0YW5jZS4KXHNraXBsaW5lIGFhY0VuY0Nsb3NlCgpcc2VjdGlvbiBlbmNPcGVuIEVuY29kZXIgSW5zdGFuY2UgQWxsb2NhdGlvbgoKVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGFhY0VuY09wZW4oKSBmdW5jdGlvbiBpcyB2ZXJ5IGZsZXhpYmxlIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KLSBJZiB0aGUgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1wdGlvbiBpcyBub3QgYW4gaXNzdWUsIHRoZSBlbmNvZGVyIGluc3RhbmNlIGNhbiBiZSBhbGxvY2F0ZWQKZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBhdWRpbyBjaGFubmVscyAoZm9yIGV4YW1wbGUgNiBvciA4KSB3aXRoIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgpUaGlzIGlzIHRoZSBkZWZhdWx0IG9wZW4gcHJvY2VkdXJlIGZvciB0aGUgQUFDIGVuY29kZXIgaWYgbWVtb3J5IGNvbnN1bXB0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgbWluaW1pemVkLgpcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDApIFxlbmRjb2RlCi0gSWYgdGhlIHJlcXVpcmVkIE1QRUctNCBBT1RzIGRvIG5vdCBjYWxsIGZvciB0aGUgZnVsbCBmdW5jdGlvbmFsIHJhbmdlIG9mIHRoZSBsaWJyYXJ5LCBlbmNvZGVyIG1vZHVsZXMgY2FuIGJlIGFsbG9jYXRlZCBzZWxlY3RpdmVseS4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQUFDIHwgU0JSIHwgIFBTIHwgTUQgfCAgICAgICAgIEZMQUdTICAgICAgICAgfCB2YWx1ZQotLS0tLSstLS0tLSstLS0tLSstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KICBYICB8ICAtICB8ICAtICB8ICAtIHwgKDB4MDEpICAgICAgICAgICAgICAgIHwgIDB4MDEKICBYICB8ICBYICB8ICAtICB8ICAtIHwgKDB4MDF8MHgwMikgICAgICAgICAgIHwgIDB4MDMKICBYICB8ICBYICB8ICBYICB8ICAtIHwgKDB4MDF8MHgwMnwweDA0KSAgICAgIHwgIDB4MDcKICBYICB8ICAtICB8ICAtICB8ICBYIHwgKDB4MDEgICAgICAgICAgfDB4MTApIHwgIDB4MTEKICBYICB8ICBYICB8ICAtICB8ICBYIHwgKDB4MDF8MHgwMiAgICAgfDB4MTApIHwgIDB4MTMKICBYICB8ICBYICB8ICBYICB8ICBYIHwgKDB4MDF8MHgwMnwweDA0fDB4MTApIHwgIDB4MTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtIEFBQzogQWxsb2NhdGUgQUFDIENvcmUgRW5jb2RlciBtb2R1bGUuCiAtIFNCUjogQWxsb2NhdGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBtb2R1bGUuCiAtIFBTOiBBbGxvY2F0ZSBQYXJhbWV0cmljIFN0ZXJlbyBtb2R1bGUuCiAtIE1EOiBBbGxvY2F0ZSBNZXRhIERhdGEgbW9kdWxlIHdpdGhpbiBBQUMgZW5jb2Rlci4KXGVuZHZlcmJhdGltClxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLHZhbHVlLDApIFxlbmRjb2RlCi0gU3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgc3VwcG9ydGVkIGluIHRoZSBlbmNvZGVyIGluc3RhbmNlIGNhbiBiZSBkb25lIGFzIGZvbGxvd3MuCiAtIEZvciBleGFtcGxlIGFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2hpY2ggc3VwcG9ydHMgMiBjaGFubmVscyBmb3IgYWxsIHN1cHBvcnRlZCBBT1RzLgogICBUaGUgbGlicmFyeSBpdHNlbGYgbWF5IGJlIGNhcGFibGUgb2YgZW5jb2RpbmcgdXAgdG8gNiBvciA4IGNoYW5uZWxzIGJ1dCBpbiB0aGlzIGV4YW1wbGUgb25seSAyIGNoYW5uZWwgZW5jb2RpbmcgaXMgcmVxdWlyZWQgYW5kIHRodXMgb25seSBidWZmZXJzIGZvciAyIGNoYW5uZWxzIGFyZSBhbGxvY2F0ZWQgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KXGNvZGUgYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwyKSBcZW5kY29kZQogLSBBZGRpdGlvbmFsbHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscyBpbiB0aGUgU0JSIG1vZHVsZSBjYW4gYmUgZGVub3RlZCBzZXBhcmF0ZWx5LlxuCiAgIEluIHRoaXMgZXhhbXBsZSB0aGUgZW5jb2RlciBpbnN0YW5jZSBwcm92aWRlcyBhIG1heGltdW0gb2YgNiBjaGFubmVscyBvdXQgb2Ygd2hpY2ggdXAgdG8gMiBjaGFubmVscyBzdXBwb3J0IFNCUi4KICAgVGhpcyBlbmNvZGVyIGluc3RhbmNlIGNhbiBwcm9kdWNlIGZvciBleGFtcGxlIDUuMSBjaGFubmVsIEFBQy1MQyBzdHJlYW1zIG9yIHN0ZXJlbyBIRS1BQUMgKHYyKSBzdHJlYW1zLgogICBIRS1BQUMgNS4xIG11bHRpIGNoYW5uZWwgaXMgbm90IHBvc3NpYmxlIHNpbmNlIG9ubHkgMiBvdXQgb2YgNiBjaGFubmVscyBzdXBwb3J0IFNCUiwgd2hpY2ggc2F2ZXMgZGF0YSBtZW1vcnkuClxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsNnwoMjw8OCkpIFxlbmRjb2RlClxuCgpcc2VjdGlvbiBidWZEZXMgSW5wdXQvT3V0cHV0IEFyZ3VtZW50cwoKXHN1YnNlY3Rpb24gYWxsb2NJT0J1ZnMgUHJvdmlkZSBCdWZmZXIgRGVzY3JpcHRvcnMKSW4gdGhlIHByZXNlbnQgZW5jb2RlciBBUEksIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCB3aXRoIFxyZWYgQUFDRU5DX0J1ZkRlc2MgImJ1ZmZlciBkZXNjcmlwdG9ycyIuIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBhIGZsZXhpYmxlIGhhbmRsaW5nCm9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB3aXRob3V0IGltcGFjdCB0byB0aGUgYWN0dWFsIGVuY29kaW5nIGNhbGwuIE9wdGlvbmFsIGJ1ZmZlcnMgYXJlIG5lY2Vzc2FyeSBlLmcuIGZvciBhbmNpbGxhcnkgZGF0YSwgbWV0YSBkYXRhIGlucHV0IG9yIGFkZGl0aW9uYWwgb3V0cHV0CmJ1ZmZlcnMgZGVzY3JpYmluZyBzdXBlcmZyYW1pbmcgZGF0YSBpbiBEQUIrIG9yIERSTSsuXG4KQXQgbGVhc3Qgb25lIGlucHV0IGJ1ZmZlciBmb3IgYXVkaW8gaW5wdXQgZGF0YSBhbmQgb25lIG91dHB1dCBidWZmZXIgZm9yIGJpdHN0cmVhbSBkYXRhIG11c3QgYmUgYWxsb2NhdGVkLiBUaGUgaW5wdXQgYnVmZmVyIHNpemUgY2FuIGJlIGEgdXNlciBkZWZpbmVkIG11bHRpcGxlCm9mIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIHVzZXIgZGVmaW5lZCBQQ00gYnVmZmVyIHRvIGFuIGludGVybmFsIGlucHV0IGJ1ZmZlciBhbmQgc28gaW5wdXQgZGF0YSBjYW4gYmUgbGVzcyB0aGFuIG9uZSBBQUMgYXVkaW8gZnJhbWUuClRoZSBvdXRwdXQgYnVmZmVyIHNpemUgc2hvdWxkIGJlIDYxNDQgYml0cyBwZXIgY2hhbm5lbCBleGNsdWRpbmcgdGhlIExGRSBjaGFubmVsLgpJZiB0aGUgb3V0cHV0IGRhdGEgZG9lcyBub3QgZml0IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlciwgYW4gQUFDRU5DX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQgYnkgYWFjRW5jRW5jb2RlKCkuClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcGxpbmUgaW5wdXRCdWZmZXIKXHVudGlsIG91dHB1dEJ1ZmZlcgpBbGwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgbXVzdCBiZSBjbHVzdGVyZWQgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgYXJyYXlzLgpcc2tpcGxpbmUgaW5CdWZmZXIKXHVudGlsIG91dEJ1ZmZlckVsU2l6ZQpBbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMKXHNraXBsaW5lIEFBQ0VOQ19CdWZEZXNjClxza2lwbGluZSBBQUNFTkNfQnVmRGVzYwpJbml0aWFsaXplIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yClxza2lwbGluZSBpbkJ1ZkRlc2MKXHVudGlsIGJ1ZkVsU2l6ZXMKSW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IKXHNraXBsaW5lIG91dEJ1ZkRlc2MKXHVudGlsIGJ1ZkVsU2l6ZXMKClxzdWJzZWN0aW9uIGFyZ0xpc3RzIFByb3ZpZGUgSW5wdXQvT3V0cHV0IEFyZ3VtZW50IExpc3RzClRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cyBvZiBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsIGFyZSBkZXNjcmliZWQgaW4gYXJndW1lbnQgc3RydWN0dXJlcy4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBBQUNFTkNfSW5BcmdzClxza2lwbGluZSBBQUNFTkNfT3V0QXJncwoKXHNlY3Rpb24gZmVlZEluQnVmIEZlZWQgSW5wdXQgQnVmZmVyClRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBtb2R1bG8gYnVmZmVyLiBOZXcgYXVkaW8gZGF0YSBpbiB0aGUgZm9ybSBvZiBwdWxzZS1jb2RlLQptb2R1bGF0ZWQgc2FtcGxlcyAoUENNKSBtdXN0IGJlIHJlYWQgZnJvbSBleHRlcm5hbCBhbmQgYmUgZmVkIHRvIHRoZSBpbnB1dCBidWZmZXIgZGVwZW5kaW5nIG9uIGl0cwpmaWxsIGxldmVsLiBUaGUgcmVxdWlyZWQgc2FtcGxlIGJpdHJhdGUgKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhIHR5cGUgSU5UX1BDTSB3aGljaCBpcyAxNiwgMjQgb3IgMzIKYml0cyB3aWRlKSBpcyBmaXhlZCBhbmQgZGVwZW5kcyBvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgMTYgYml0KS4KClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcGxpbmUgV0FWX0lucHV0UmVhZApcdW50aWwgOwpBZnRlciB0aGUgZW5jb2RlcidzIGludGVybmFsIGJ1ZmZlciBpcyBmZWQgd2l0aCBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLCBhbmQgYWFjRW5jRW5jb2RlKCkKcHJvY2Vzc2VkIHRoZSBuZXcgaW5wdXQgZGF0YSwgdXBkYXRlL21vdmUgcmVtYWluaW5nIHNhbXBsZXMgaW4gaW5wdXQgYnVmZmVyLCBzaW11bGF0aW5nIGEgbW9kdWxvIGJ1ZmZlcjoKXHNraXBsaW5lIG91dGFyZ3MubnVtSW5TYW1wbGVzPjAKXHVudGlsIH0KClxzZWN0aW9uIHdyaXRlT3V0RGF0YSBPdXRwdXQgQml0c3RyZWFtIERhdGEKSWYgYW55IEFBQyBiaXRzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUsIHdyaXRlIGl0IHRvIG91dHB1dCBmaWxlIG9yIGRldmljZS4gVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHRoZQpmb2xsb3dpbmcgY29uZGl0aW9uIGlzIHRydWU6Clxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcCBWYWxpZCBiaXRzdHJlYW0gYXZhaWxhYmxlClxza2lwbGluZSBvdXRhcmdzCgpcc2tpcGxpbmUgb3V0Qnl0ZXM+MAoKSWYgeW91IHVzZSBmaWxlIEkvTyB0aGVuIGZvciBleGFtcGxlIGNhbGwgbXBlZ0ZpbGVXcml0ZV9Xcml0ZSgpIGZyb20gdGhlIGxpYnJhcnkgbGliTXBlZ0ZpbGVXcml0ZQoKXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBtcGVnRmlsZVdyaXRlX1dyaXRlCgpcc2VjdGlvbiBjZmdNZXRhRGF0YSBNZXRhIERhdGEgQ29uZmlndXJhdGlvbgoKSWYgdGhlIHByZXNlbnQgbGlicmFyeSBpcyBjb25maWd1cmVkIHdpdGggTWV0YWRhdGEgc3VwcG9ydCwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IG1ldGEgZGF0YSBzaWRlIGluZm8gaW50byB0aGUgZ2VuZXJhdGVkCmF1ZGlvIGJpdHN0cmVhbSB3aGlsZSBlbmNvZGluZy4KClRvIHdvcmsgd2l0aCBtZXRhIGRhdGEgdGhlIGVuY29kZXIgaW5zdGFuY2UgaGFzIHRvIGJlIFxyZWYgZW5jT3BlbiAiYWxsb2NhdGVkIiB3aXRoIG1ldGEgZGF0YSBzdXBwb3J0LiBUaGUgbWV0YSBkYXRhIG1vZGUgbXVzdCBiZSBiZSBjb25maWd1cmVkIHdpdGgKdGhlIDo6QUFDRU5DX01FVEFEQVRBX01PREUgcGFyYW1ldGVyIGFuZCBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24uClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19NRVRBREFUQV9NT0RFLCAwLTIpOyBcZW5kY29kZQoKVGhpcyBjb25maWd1cmF0aW9uIGluZGljYXRlcyBob3cgdG8gZW1iZWQgbWV0YSBkYXRhIGludG8gYml0c3RyZW0uIEVpdGhlciBubyBpbnNlcnRpb24sIE1QRUcgb3IgRVRTSSBzdHlsZS4KVGhlIG1ldGEgZGF0YSBpdHNlbGYgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aGluIHRoZSBtZXRhIGRhdGEgc2V0dXAgc3RydWN0dXJlIEFBQ0VOQ19NZXRhRGF0YS4KCkNoYW5naW5nIG9uZSBvZiB0aGUgQUFDRU5DX01ldGFEYXRhIHNldHVwIHBhcmFtZXRlcnMgY2FuIGJlIGFjaGlldmVkIGZyb20gb3V0c2lkZSB0aGUgbGlicmFyeSB3aXRoaW4gOjpJTl9NRVRBREFUQV9TRVRVUCBpbnB1dApidWZmZXIuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgZXZlcnkgZnJhbWUuIElmIHRoZXJlIGlzIG5vIG5ldyBtZXRhIHNldHVwIGRhdGEgYXZhaWxhYmxlLCB0aGUKZW5jb2RlciB1c2VzIHRoZSBwcmV2aW91cyBzZXR1cCBvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGluaXRpYWwgc3RhdGUuCgpJbiBnZW5lcmFsIHRoZSBhdWRpbyBjb21wcmVzc29yIGFuZCBsaW1pdGVyIHdpdGhpbiB0aGUgZW5jb2RlciBsaWJyYXJ5IGNhbiBiZSBjb25maWd1cmVkIHdpdGggdGhlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIHBhcmFtZXRlcgpBQUNFTkNfTWV0YURhdGE6OmRyY19wcm9maWxlIGFuZCBhbmQgQUFDRU5DX01ldGFEYXRhOjpjb21wX3Byb2ZpbGUuClxuCgpcc2VjdGlvbiBlbmNSZWNvbmYgRW5jb2RlciBSZWNvbmZpZ3VyYXRpb24KClRoZSBlbmNvZGVyIGxpYnJhcnkgYWxsb3dzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIG5ldyBzZXR0aW5ncwpjb250aW51b3VzbHkgYmV0d2VlbiBlbmNvZGluZyBmcmFtZXMuIEVhY2ggcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQgbXVzdCBiZSBzZXQgd2l0aAphIHNpbmdsZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gVGhlIGludGVybmFsIHN0YXR1cyBvZiBlYWNoIHBhcmFtZXRlciBjYW4gYmUKcmV0cmlldmVkIHdpdGggYW4gYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGNhbGwuXG4KVGhlcmUgaXMgbm8gc3RhbmQtYWxvbmUgcmVjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGF2YWlsYWJsZS4gV2hlbiBwYXJhbWV0ZXJzIHdlcmUKbW9kaWZpZWQgZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5LCBhbiBpbnRlcm5hbCBjb250cm9sIG1lY2hhbmlzbSB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5CnJlY29uZmlndXJhdGlvbiBwcm9jZXNzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb2xsb3dpbmcKYWFjRW5jRW5jb2RlKCkgY2FsbC4gVGhpcyBzdGF0ZSBjYW4gYmUgb2JzZXJ2ZWQgZnJvbSBleHRlcm5hbCB2aWEgdGhlIEFBQ0VOQ19JTklUX1NUQVRVUwphbmQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uLiBUaGUgcmVjb25maWd1cmF0aW9uIHByb2Nlc3MgY2FuIGFsc28gYmUgYXBwbGllZAppbW1lZGlhdGVseSB3aGVuIGFsbCBwYXJhbWV0ZXJzIG9mIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwgYXJlIE5VTEwgd2l0aCBhIHZhbGlkIGVuY29kZXIKaGFuZGxlLlxuXG4KVGhlIGludGVybmFsIHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIGZyb20gZXh0ZXJuIHdpdGggdGhlIGZvbGxvd2luZyBhY2Nlc3MuClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DT05UUk9MX1NUQVRFLCBBQUNFTkNfQ1RSTEZMQUdTKTsgXGVuZGNvZGUKCgpcc2VjdGlvbiBlbmNQYXJhbXMgRW5jb2RlciBQYXJhbWV0cml6YXRpb24KCkFsbCBwYXJhbWV0ZXJlcyBsaXN0ZWQgaW4gOjpBQUNFTkNfUEFSQU0gY2FuIGJlIG1vZGlmaWVkIHdpdGhpbiBhbiBlbmNvZGVyIGluc3RhbmNlLgoKXHN1YnNlY3Rpb24gZW5jTWFuZGF0b3J5IE1hbmRhdG9yeSBFbmNvZGVyIFBhcmFtZXRlcnMKVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQuClxjb2RlCmFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BT1QsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIHZhbHVlKTsKYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLCB2YWx1ZSk7ClxlbmRjb2RlCkJleW9uZCB0aGF0IGlzIGFuIGludGVybmFsIGF1dG8gbW9kZSB3aGljaCBwcmVpbml0aXppYWxpemVzIHRoZSA6OkFBQ0VOQ19CSVRSQVRFIHBhcmFtZXRlcgppZiB0aGUgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGZyb20gZXh0ZXJuLiBUaGUgYml0cmF0ZSBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZWZmZWN0aXZlCmNoYW5uZWxzIGFuZCBzYW1wbGluZyByYXRlIGFuZCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuClxjb2RlCkFBQy1MQyAoQU9UX0FBQ19MQyk6IDEuNSBiaXRzIHBlciBzYW1wbGUKSEUtQUFDIChBT1RfU0JSKTogMC42MjUgYml0cyBwZXIgc2FtcGxlIChkdWFscmF0ZSBzYnIpCkhFLUFBQyAoQU9UX1NCUik6IDEuMTI1IGJpdHMgcGVyIHNhbXBsZSAoZG93bnNhbXBsZWQgc2JyKQpIRS1BQUMgdjIgKEFPVF9QUyk6IDAuNSBiaXRzIHBlciBzYW1wbGUKXGVuZGNvZGUKClxzdWJzZWN0aW9uIGNoYW5uZWxNb2RlIENoYW5uZWwgTW9kZSBDb25maWd1cmF0aW9uClRoZSBpbnB1dCBhdWRpbyBkYXRhIGlzIGRlc2NyaWJlZCB3aXRoIHRoZSA6OkFBQ0VOQ19DSEFOTkVMTU9ERSBwYXJhbWV0ZXIgaW4gdGhlCmFhY0VuY29kZXJfU2V0UGFyYW0oKSBjYWxsLiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggYSAnbnVtYmVyIG9mCmlucHV0IGNoYW5uZWxzJyBhcmd1bWVudC4gSW5zdGVhZCwgdGhlIGNoYW5uZWxNb2RlIG11c3QgYmUgc2V0IGFzIGZvbGxvd3MuClxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwgdmFsdWUpOyBcZW5kY29kZQpUaGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiA6OkNIQU5ORUxfTU9ERSBhbmQgY2FuIGJlIG1hcHBlZCBmcm9tIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKaW4gdGhlIGZvbGxvd2luZyB3YXkuClxkb250aW5jbHVkZSBtYWluLmNwcApcc2tpcCBDSEFOTkVMX01PREUgY2hNb2RlID0gTU9ERV9JTlZBTElEOwpcdW50aWwgcmV0dXJuCgpcc3Vic2VjdGlvbiBlbmNRdWFsIEF1ZGlvIFF1YWxpdHkgQ29uc2lkZXJhdGlvbnMKVGhlIGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uIGlzIHN1Z2dlc3RlZCB0byBiZSB1c2VkLiBFbmNvZGVyIHRvb2xzIHN1Y2ggYXMgVE5TIGFuZCBQTlMKYXJlIGFjdGl2YXRlZCBieSBkZWZhdWx0IGFuZCBhcmUgaW50ZXJuYWxseSBjb250cm9sbGVkIChzZWUgXHJlZiBCRUhBVklPVVJfVE9PTFMpLgoKVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBxdWFsaXR5IHBhcmFtZXRlciBjYWxsZWQgOjpBQUNFTkNfQUZURVJCVVJORVIuIEluIHRoZSBkZWZhdWx0CmNvbmZpZ3VyYXRpb24gdGhpcyBxdWFsaXR5IHN3aXRjaCBpcyBkZWFjdGl2YXRlZCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIGEgd29ya2xvYWQKaW5jcmVhc2Ugd2hpY2ggbWlnaHQgYmUgc2lnbmlmaWNhbnQuIElmIHdvcmtsb2FkIGlzIG5vdCBhbiBpc3N1ZSBpbiB0aGUgYXBwbGljYXRpb24Kd2UgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLgpcY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQUZURVJCVVJORVIsIDEpOyBcZW5kY29kZQoKXHN1YnNlY3Rpb24gZW5jRUxEIEVMRCBBdXRvIENvbmZpZ3VyYXRpb24gTW9kZQpGb3IgRUxEIGNvbmZpZ3VyYXRpb24gYSBzbyBjYWxsZWQgYXV0byBjb25maWd1cmF0b3IgaXMgYXZhaWxhYmxlIHdoaWNoIGNvbmZpZ3VyZXMgU0JSIGFuZCB0aGUgU0JSIHJhdGlvIGJ5IGl0c2VsZi4KVGhlIGNvbmZpZ3VyYXRvciBpcyB1c2VkIHdoZW4gdGhlIGVuY29kZXIgcGFyYW1ldGVyIDo6QUFDRU5DX1NCUl9NT0RFIGFuZCA6OkFBQ0VOQ19TQlJfUkFUSU8gYXJlIG5vdCBzZXQgZXhwbGljaXRlbHkuCgpCYXNlZCBvbiBzYW1wbGluZyByYXRlIGFuZCBjaG9zZW4gYml0cmF0ZSBwZXIgY2hhbm5lbCBhIHJlYXNvbmFibGUgU0JSIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkLgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgU2FtcGxpbmcgUmF0ZSAgfCBDaGFubmVsIEJpdHJhdGUgfCAgU0JSIHwgICAgICAgU0JSIFJhdGlvCi0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQogXW1pbiwgMTZdIGtIeiAgIHwgICAgIG1pbiAtIDI3OTk5IHwgICBvbiB8IGRvd25zYW1wbGVkIFNCUgogICAgICAgICAgICAgICAgIHwgICAyODAwMCAtICAgbWF4IHwgIG9mZiB8ICAgICAgICAgICAgIC0tLQotLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KIF0xNiAtIDI0XSBrSHogICB8ICAgICBtaW4gLSAzOTk5OSB8ICAgb24gfCBkb3duc2FtcGxlZCBTQlIKICAgICAgICAgICAgICAgICB8ICAgNDAwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCiBdMjQgLSAzMl0ga0h6ICAgfCAgICAgbWluIC0gMjc5OTkgfCAgIG9uIHwgICAgZHVhbHJhdGUgU0JSCiAgICAgICAgICAgICAgICAgfCAgIDI4MDAwIC0gNTU5OTkgfCAgIG9uIHwgZG93bnNhbXBsZWQgU0JSCiAgICAgICAgICAgICAgICAgfCAgIDU2MDAwIC0gICBtYXggfCAgb2ZmIHwgICAgICAgICAgICAgLS0tCi0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQogXTMyIC0gNDQuMV0ga0h6IHwgICAgIG1pbiAtIDYzOTk5IHwgICBvbiB8ICAgIGR1YWxyYXRlIFNCUgogICAgICAgICAgICAgICAgIHwgICA2NDAwMCAtICAgbWF4IHwgIG9mZiB8ICAgICAgICAgICAgIC0tLQotLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KIF00NC4xIC0gNDhdIGtIeiB8ICAgICBtaW4gLSA2Mzk5OSB8ICAgb24gfCAgICBkdWFscmF0ZSBTQlIKICAgICAgICAgICAgICAgICB8ICAgNjQwMDAgLSBtYXggICB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClxlbmR2ZXJiYXRpbQoKClxzZWN0aW9uIGF1ZGlvY2hDZmcgQXVkaW8gQ2hhbm5lbCBDb25maWd1cmF0aW9uClRoZSBNUEVHIHN0YW5kYXJkIHJlZmVycyBvZnRlbiB0byB0aGUgc28tY2FsbGVkIENoYW5uZWwgQ29uZmlndXJhdGlvbi4gVGhpcyBDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgdXNlZCBmb3IgYSBmaXhlZCBDaGFubmVsCk1hcHBpbmcuIFRoZSBjb25maWd1cmF0aW9ucyAxLTcgYXJlIHByZWRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBhbmQgdXNlZCBmb3IgaW1wbGljaXQgc2lnbmFsbGluZyB3aXRoaW4gdGhlIGVuY29kZWQgYml0c3RyZWFtLgpGb3IgdXNlciBkZWZpbmVkIENvbmZpZ3VyYXRpb25zIHRoZSBDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgc2V0IHRvIDAgYW5kIHRoZSBDaGFubmVsIE1hcHBpbmcgbXVzdCBiZSBleHBsZWNpdGx5IGRlc2NyaWJlZCB3aXRoIGFuIGFwcHJvcHJpYXRlClByb2dyYW0gQ29uZmlnIEVsZW1lbnQuIFRoZSBwcmVzZW50IEVuY29kZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gY29uZmlndXJlIHRoaXMgQ2hhbm5lbCBDb25maWd1cmF0aW9uIGZyb20KZXh0ZXJuLiBUaGUgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmaXhlZCBDaGFubmVsIE1vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gQ2hhbm5lbCBDb25maWd1cmF0aW9uIGFzIGZvbGxvdy4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENoYW5uZWxNb2RlICAgICAgICAgICB8IENoQ2ZnICB8IGZyb250X0VsICAgICAgfCBzaWRlX0VsICB8IGJhY2tfRWwgIHwgbGZlX0VsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0KTU9ERV8xICAgICAgICAgICAgICAgICB8ICAgICAgMSB8IFNDRSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKTU9ERV8yICAgICAgICAgICAgICAgICB8ICAgICAgMiB8IENQRSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKTU9ERV8xXzIgICAgICAgICAgICAgICB8ICAgICAgMyB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKTU9ERV8xXzJfMSAgICAgICAgICAgICB8ICAgICAgNCB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IFNDRSAgICAgIHwKTU9ERV8xXzJfMiAgICAgICAgICAgICB8ICAgICAgNSB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IENQRSAgICAgIHwKTU9ERV8xXzJfMl8xICAgICAgICAgICB8ICAgICAgNiB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IENQRSAgICAgIHwgTEZFCk1PREVfMV8yXzJfMl8xICAgICAgICAgfCAgICAgIDcgfCBTQ0UsIENQRSwgQ1BFIHwgICAgICAgICAgfCBDUEUgICAgICB8IExGRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tCk1PREVfN18xX1JFQVJfU1VSUk9VTkQgfCAgICAgIDAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUsIENQRSB8IExGRQpNT0RFXzdfMV9GUk9OVF9DRU5URVIgIHwgICAgICAwIHwgU0NFLCBDUEUsIENQRSB8ICAgICAgICAgIHwgQ1BFICAgICAgfCBMRkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLSBTQ0U6IFNpbmdsZSBDaGFubmVsIEVsZW1lbnQuCiAtIENQRTogQ2hhbm5lbCBQYWlyLgogLSBTQ0U6IExvdyBGcmVxdWVuY3kgRWxlbWVudC4KXGVuZHZlcmJhdGltCgpNb3Jlb3ZlciwgdGhlIFRhYmxlIGRlc2NyaWJlcyBhbGwgZml4ZWQgQ2hhbm5lbCBFbGVtZW50cyBmb3IgZWFjaCBDaGFubmVsIE1vZGUgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGEgc3BlYWtlciBhcnJhbmdlbWVudC4gVGhlCmFycmFuZ2VtZW50IGluY2x1ZGVzIGZyb250LCBzaWRlLCBiYWNrIGFuZCBsZmUgQXVkaW8gQ2hhbm5lbCBFbGVtZW50cy5cbgpUaGlzIG1hcHBpbmcgb2YgQXVkaW8gQ2hhbm5lbCBFbGVtZW50cyBpcyBkZWZpbmVkIGluIE1QRUcgc3RhbmRhcmQgZm9yIENoYW5uZWwgQ29uZmlnIDEtNy4gVGhlIENoYW5uZWwgYXNzaWdubWVudCBmb3IgTU9ERV8xXzEsCk1PREVfMl8yIGFuZCBNT0RFXzJfMSBpcyB1c2VkIGZyb20gdGhlIEFSSUIgc3RhbmRhcmQuIEFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCBhcyBzdWdnZXN0ZWQgaW4gTVBFRy5cbgpJbiBjYXNlIG9mIENoYW5uZWwgQ29uZmlnIDAgb3Igd3JpdGluZyBtYXRyaXggbWl4ZG93biBjb2VmZmljaWVudHMsIHRoZSBlbmNvZGVyIGVuYWJsZXMgdGhlIHdyaXRpbmcgb2YgUHJvZ3JhbSBDb25maWcgRWxlbWVudAppdHNlbGYgYXMgZGVzY3JpYmVkIGluIFxyZWYgZW5jUENFLiBUaGUgY29uZmlndXJhdGlvbiB1c2VkIGluIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgcmVmZXJzIHRvIHRoZSBkZW5vdGVkIFRhYmxlLlxuCkJlc2lkZSB0aGUgQ2hhbm5lbCBFbGVtZW50IGFzc2lnbm1lbnQgdGhlIENoYW5uZWwgTW9kZXMgYXJlIHJlc3Bvc2libGUgZm9yIGF1ZGlvIGlucHV0IGRhdGEgY2hhbm5lbCBtYXBwaW5nLiBUaGUgQ2hhbm5lbCBNYXBwaW5nCm9mIHRoZSBhdWRpbyBkYXRhIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIDo6QUFDRU5DX0NIQU5ORUxPUkRFUiB3aGljaCBjYW4gYmUgTVBFRyBvciBXQVYgbGlrZSBvcmRlci5cbgpGb2xsb3dpbmcgVGFibGUgZGVzY3JpYmVzIHRoZSBjb21wbGV0ZSBjaGFubmVsIG1hcHBpbmcgZm9yIGJvdGggQ2hhbm5lbCBPcmRlciBjb25maWd1cmF0aW9ucy4KXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGFubmVsTW9kZSAgICAgICAgICAgIHwgIE1QRUctQ2hhbm5lbG9yZGVyICAgICAgICAgICAgfCAgV0FWLUNoYW5uZWxvcmRlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KTU9ERV8xICAgICAgICAgICAgICAgICB8IDAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMCB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8Ck1PREVfMiAgICAgICAgICAgICAgICAgfCAwIHwgMSB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8ICAgfApNT0RFXzFfMiAgICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgICB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwKTU9ERV8xXzJfMSAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCAgIHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgMyB8ICAgfCAgIHwgICB8Ck1PREVfMV8yXzIgICAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMSB8IDMgfCA0IHwgICB8ICAgfApNT0RFXzFfMl8yXzEgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgICB8ICAgfCAyIHwgMCB8IDEgfCA0IHwgNSB8IDMgfCAgIHwKTU9ERV8xXzJfMl8yXzEgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgMiB8IDYgfCA3IHwgMCB8IDEgfCA0IHwgNSB8IDMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCk1PREVfN18xX1JFQVJfU1VSUk9VTkQgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCAwIHwgMSB8IDYgfCA3IHwgNCB8IDUgfCAzCk1PREVfN18xX0ZST05UX0NFTlRFUiAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCA2IHwgNyB8IDAgfCAxIHwgNCB8IDUgfCAzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcZW5kdmVyYmF0aW0KClRoZSBkZW5vdGVkIG1hcHBpbmcgaXMgaW1wb3J0YW50IGZvciBjb3JyZWN0IGF1ZGlvIGNoYW5uZWwgYXNzaWdubWVudCB3aGVuIHVzaW5nIE1QRUcgb3IgV0FWIG9yZGVyaW5nLiBUaGUgaW5jb21pbmcgYXVkaW8KY2hhbm5lbHMgYXJlIGRpc3RyaWJ1dGVkIE1QRUcgbGlrZSBzdGFydGluZyBhdCB0aGUgZnJvbnQgY2hhbm5lbHMgYW5kIGVuZGluZyBhdCB0aGUgYmFjayBjaGFubmVscy4gVGhlIGRpc3RyaWJ1dGlvbiBpcyB1c2VkIGFzCmRlc2NyaWJlZCBpbiBUYWJsZSBjb25jZXJpbmcgQ2hhbm5lbCBDb25maWcgYW5kIGZpeCBjaGFubmVsIGVsZW1lbnRzLiBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmb3IgY2xhcmlmaWNhdGlvbi4KClx2ZXJiYXRpbQpFeGFtcGxlOiBNT0RFXzFfMl8yXzEgLSBXQVYtQ2hhbm5lbG9yZGVyIDUuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIElucHV0IENoYW5uZWwgICAgICB8IENvZGVyIENoYW5uZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAyIChmcm9udCBjZW50ZXIpICAgfCAwIChTQ0UgY2hhbm5lbCkKIDAgKGxlZnQgY2VudGVyKSAgICB8IDEgKDFzdCBvZiAxc3QgQ1BFKQogMSAocmlnaHQgY2VudGVyKSAgIHwgMiAoMm5kIG9mIDFzdCBDUEUpCiA0IChsZWZ0IHN1cnJvdW5kKSAgfCAzICgxc3Qgb2YgMm5kIENQRSkKIDUgKHJpZ2h0IHN1cnJvdW5kKSB8IDQgKDJuZCBvZiAybmQgQ1BFKQogMyAoTEZFKSAgICAgICAgICAgIHwgNSAoTEZFKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXGVuZHZlcmJhdGltCgoKXHNlY3Rpb24gc3VwcEJpdHJhdGVzIFN1cHBvcnRlZCBCaXRyYXRlcwoKVGhlIEZESyBBQUMgRW5jb2RlciBwcm92aWRlcyBhIHdpZGUgcmFuZ2Ugb2Ygc3VwcG9ydGVkIGJpdHJhdGVzLgpUaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUgQXVkaW8gT2JqZWN0IFR5cGUuIEZvciBBQUMtTEMgdGhlIG1pbmltdW0KYml0cmF0ZSBpcyB0aGUgYml0cmF0ZSB0aGF0IGlzIHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBtb3N0IGJhc2ljIGFuZCBtaW5pbWFsIHZhbGlkIGJpdHN0cmVhbS4KSXQgY29uc2lzdHMgb2YgdGhlIGJpdHN0cmVhbSBmb3JtYXQgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCBvdGhlciBzdGF0aWMvbWFuZGF0b3J5IGluZm9ybWF0aW9uCndpdGhpbiB0aGUgQUFDIHBheWxvYWQuIFRoZSBtYXhpbXVtIEFBQyBmcmFtZXNpemUgYWxsb3dlZCBieSB0aGUgTVBFRy00IHN0YW5kYXJkCmRldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlIGZvciBBQUMtTEMuIEZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiBhIGxpYnJhcnkgaW50ZXJuYWwKbG9vay11cCB0YWJsZSBpcyB1c2VkLgoKQSBnb29kIHdvcmtpbmcgcG9pbnQgaW4gdGVybXMgb2YgYXVkaW8gcXVhbGl0eSwgc2FtcGxpbmcgcmF0ZSBhbmQgYml0cmF0ZSwgaXMgYXQgMSB0byAxLjUKYml0cy9hdWRpbyBzYW1wbGUgZm9yIEFBQy1MQywgMC42MjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIGR1YWxyYXRlIEhFLUFBQywgMS4xMjUgYml0cy9hdWRpbyBzYW1wbGUKZm9yIGRvd25zYW1wbGVkIEhFLUFBQyBhbmQgMC41IGJpdHMvYXVkaW8gc2FtcGxlIGZvciBIRS1BQUMgdjIuCkZvciBleGFtcGxlIGZvciBvbmUgY2hhbm5lbCB3aXRoIGEgc2FtcGxpbmcgZnJlcXVlbmN5IG9mIDQ4IGtIeiwgdGhlIHJhbmdlIGZyb20KNDgga2JpdC9zIHRvIDcyIGtiaXQvcyBhY2hpZXZlcyByZWFzb25hYmxlIGF1ZGlvIHF1YWxpdHkgZm9yIEFBQy1MQy4KCkZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiB0aGUgbG93ZXN0IHBvc3NpYmxlIGF1ZGlvIGlucHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSBpcyAxNiBrSHogYmVjYXVzZSB0aGVuIHRoZQpBQUMtTEMgY29yZSBlbmNvZGVyIG9wZXJhdGVzIGluIGR1YWwgcmF0ZSBtb2RlIGF0IGl0cyBsb3dlc3QgcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmN5LCB3aGljaCBpcyA4IGtIei4KSEUtQUFDIHYyIHJlcXVpcmVzIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgoKUGxlYXNlIG5vdGUgdGhhdCBpbiBIRS1BQUMgb3IgSEUtQUFDIHYyIG1vZGUgdGhlIGVuY29kZXIgc3VwcG9ydHMgbXVjaCBoaWdoZXIgYml0cmF0ZXMgdGhhbiBhcmUKYXBwcm9wcmlhdGUgZm9yIEhFLUFBQyBvciBIRS1BQUMgdjIuIEZvciBleGFtcGxlLCBhdCBhIGJpdHJhdGUgb2YgbW9yZSB0aGFuIDY0IGtiaXQvcyBmb3IgYSBzdGVyZW8KYXVkaW8gc2lnbmFsIGF0IDQ0LjEga0h6IGl0IHVzdWFsbHkgbWFrZXMgc2Vuc2UgdG8gdXNlIEFBQy1MQywgd2hpY2ggd2lsbCBwcm9kdWNlIGJldHRlciBhdWRpbwpxdWFsaXR5IGF0IHRoYXQgYml0cmF0ZSB0aGFuIEhFLUFBQyBvciBIRS1BQUMgdjIuCgpcc2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnIFJlY29tbWVuZGVkIFNhbXBsaW5nIFJhdGUgYW5kIEJpdHJhdGUgQ29tYmluYXRpb25zCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCndoaWNoIHdlIGRldGVybWluZWQgYnkgdmlydHVlIG9mIG51bWVyb3VzIGxpc3RlbmluZyB0ZXN0cy4KClxzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdMQyBBQUMtTEMsIEhFLUFBQywgSEUtQUFDdjIgaW4gRHVhbHJhdGUgU0JSIG1vZGUuClx2ZXJiYXRpbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgogICAgICAgICAgICAgICAgICAgfCAgICAgICAgIFtiaXQvc10gIHwgICAgICAgU2FtcGxpbmcgUmF0ZXMgIHwgICAgU2FtcGwuICB8ICBDaGFuLgogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8CiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICsgU0JSICsgUFMgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICsgUFMgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICsgUFMgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICsgUFMgIHwgIDQwMDAwIC0gIDU2MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICsgU0JSICAgICAgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDQwMDAwIC0gIDU2MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDEKQUFDIExDICsgU0JSICAgICAgIHwgIDE2MDAwIC0gIDI3OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICAgICAgIHwgIDI4MDAwIC0gIDYzOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gMTI4MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gIDY5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKQUFDIExDICsgU0JSICAgICAgIHwgIDcwMDAwIC0gMTU5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCA1LCA1LjEKQUFDIExDICsgU0JSICAgICAgIHwgMTYwMDAwIC0gMjQ1OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDUKQUFDIExDICsgU0JSICAgICAgIHwgMTYwMDAwIC0gMjY1OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICA1LjEKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICAgICAgICAgICAgIHwgICA4MDAwIC0gIDE1OTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDI0MDAwIC0gIDMxOTk5ICB8ICAxNi4wMCwgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDU1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgIDU2MDAwIC0gMTYwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKQUFDIExDICAgICAgICAgICAgIHwgMTYwMDAxIC0gMjg4MDAwICB8ICAgICAgICAgICAgICAgIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDEKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDI0MDAwIC0gIDMxOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDM5OTk5ICB8ICAxNi4wMCwgMjIuMDUsIDI0LjAwICB8ICAgICAyMi4wNSAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDQwMDAwIC0gIDk1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgIDk2MDAwIC0gMTExOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgMTEyMDAwIC0gMzIwMDAxICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKQUFDIExDICAgICAgICAgICAgIHwgMzIwMDAyIC0gNTc2MDAwICB8ICAgICAgICAgICAgICAgIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KQUFDIExDICAgICAgICAgICAgIHwgMTYwMDAwIC0gMjM5OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKQUFDIExDICAgICAgICAgICAgIHwgMjQwMDAwIC0gMjc5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKQUFDIExDICAgICAgICAgICAgIHwgMjgwMDAwIC0gODAwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCA1LCA1LjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXGVuZHZlcmJhdGltIFxuCgpcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnTEQgQUFDLUxELCBBQUMtRUxELCBBQUMtRUxEIHdpdGggU0JSIGluIER1YWxyYXRlIFNCUiBtb2RlLgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfAogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICAxODAwMCAtICAyNDk5OSAgfCAgICAgICAgMzIuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkVMRCArIFNCUiAgICAgICAgICB8ICAyNTAwMCAtICAzMTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkVMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA1MTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkVMRCArIFNCUiAgICAgICAgICB8ICA1MjAwMCAtIDEyODAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICA3MjAwMCAtIDE2MDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAzCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICA5NjAwMCAtIDIxMjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8IDEyMDAwMCAtIDI0NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8IDEyMDAwMCAtIDI2NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgNS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8ICAxNjAwMCAtICAxOTk5OSAgfCAgICAgICAgMTYuMDAgLSAyNC4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICAyMDAwMCAtICAzOTk5OSAgfCAgICAgICAgMTYuMDAgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA0MDAwMCAtICA0OTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA1MDAwMCAtICA2MTk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA2MjAwMCAtICA4NDk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCkxELCBFTEQgICAgICAgICAgICB8ICA4NTAwMCAtIDE5MjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8ICA2NDAwMCAtICA3NTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkxELCBFTEQgICAgICAgICAgICB8ICA3NjAwMCAtICA5Nzk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCkxELCBFTEQgICAgICAgICAgICB8ICA5ODAwMCAtIDEzNTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCkxELCBFTEQgICAgICAgICAgICB8IDEzNjAwMCAtIDM4NDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8ICA5NjAwMCAtIDExMzk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAzCkxELCBFTEQgICAgICAgICAgICB8IDExNDAwMCAtIDE0Njk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAzCkxELCBFTEQgICAgICAgICAgICB8IDE0NzAwMCAtIDIwMzk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAzCkxELCBFTEQgICAgICAgICAgICB8IDIwNDAwMCAtIDU3NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAzCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8IDEyODAwMCAtIDE1MTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA0CkxELCBFTEQgICAgICAgICAgICB8IDE1MjAwMCAtIDE5NTk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICA0CkxELCBFTEQgICAgICAgICAgICB8IDE5NjAwMCAtIDI3MTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICA0CkxELCBFTEQgICAgICAgICAgICB8IDI3MjAwMCAtIDc2ODAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkxELCBFTEQgICAgICAgICAgICB8IDE2MDAwMCAtIDE4OTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA1CkxELCBFTEQgICAgICAgICAgICB8IDE5MDAwMCAtIDI0NDk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICA1CkxELCBFTEQgICAgICAgICAgICB8IDI0NTAwMCAtIDMzOTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICA1CkxELCBFTEQgICAgICAgICAgICB8IDM0MDAwMCAtIDk2MDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClxlbmR2ZXJiYXRpbSBcbgoKXHN1YnNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZ0VMRCBBQUMtRUxEIHdpdGggU0JSIGluIERvd25zYW1wbGVkIFNCUiBtb2RlLgpcdmVyYmF0aW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfAogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCkVMRCArIFNCUiAgICAgICAgICB8ICAxODAwMCAtICAyNDk5OSAgfCAgICAgICAgMTYuMDAgLSAyMi4wNSAgfCAgICAgMjIuMDUgIHwgICAgICAxCihkb3duc2FtcGxlZCBTQlIpICB8ICAyNTAwMCAtICAzNTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCiAgICAgICAgICAgICAgICAgICB8ICAzNjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClxlbmR2ZXJiYXRpbSBcbgoKClxwYWdlIEVOQ09ERVJCRUhBVklPVVIgRW5jb2RlciBCZWhhdmlvdXIKClxzZWN0aW9uIEJFSEFWSU9VUl9CQU5EV0lEVEggQmFuZHdpZHRoCgpUaGUgRkRLIEFBQyBlbmNvZGVyIHVzdWFsbHkgZG9lcyBub3QgdXNlIHRoZSBmdWxsIGZyZXF1ZW5jeSByYW5nZSBvZiB0aGUgaW5wdXQgc2lnbmFsLCBidXQgcmVzdHJpY3RzIHRoZSBiYW5kd2lkdGgKYWNjb3JkaW5nIHRvIGNlcnRhaW4gbGlicmFyeS1pbnRlcm5hbCBzZXR0aW5ncy4gVGhleSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgdGFibGUgImJhbmRXaWR0aFRhYmxlIiBpbiB0aGUKZmlsZSBiYW5kd2lkdGguY3BwIChpZiBhdmFpbGFibGUpLgoKVGhlIGVuY29kZXIgQVBJIHByb3ZpZGVzIHRoZSA6OkFBQ0VOQ19CQU5EV0lEVEggcGFyYW1ldGVyIHRvIGFkanVzdCB0aGUgYmFuZHdpZHRoIGV4cGxpY2l0bHkuClxjb2RlCmFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19CQU5EV0lEVEgsIHZhbHVlKTsKXGVuZGNvZGUKCkhvd2V2ZXIgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncywgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZCBvbiBudW1lcmlvdXMgbGlzdGVuaW5nCnRlc3RzIGFuZCBjYXJlZnVsIHR3ZWFrcyB0byBlbnN1cmUgdGhlIGJlc3Qgb3ZlcmFsbCBlbmNvZGluZyBxdWFsaXR5LgoKVGhlb3JldGljYWxseSBhIHNpZ25hbCBvZiBmb3IgZXhhbXBsZSA0OCBrSHogY2FuIGNvbnRhaW4gZnJlcXVlbmNpZXMgdXAgdG8gMjQga0h6LCBidXQgdG8gdXNlIHRoaXMgZnVsbCByYW5nZQppbiBhbiBhdWRpbyBlbmNvZGVyIHVzdWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZS4gVXN1YWxseSB0aGUgZW5jb2RlciBoYXMgYSB2ZXJ5IGxpbWl0ZWQgYW1vdW50IG9mCmJpdHMgdG8gc3BlbmQgKHR5cGljYWxseSAxMjgga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIGFuZCB0byBhbGxvdyBmdWxsIHJhbmdlIGJhbmR3aWR0aCB3b3VsZAp3YXN0ZSBhIGxvdCBvZiB0aGVzZSBiaXRzIGZvciBmcmVxdWVuY2llcyB0aGUgaHVtYW4gZWFyIGlzIGhhcmRseSBhYmxlIHRvIHBlcmNlaXZlIGFueXdheSwgaWYgYXQgYWxsLiBIZW5jZSBpdAppcyB3aXNlIHRvIHVzZSB0aGUgYXZhaWxhYmxlIGJpdHMgZm9yIHRoZSByZWFsbHkgaW1wb3J0YW50IGZyZXF1ZW5jeSByYW5nZSBhbmQganVzdCBza2lwIHRoZSByZXN0LgpBdCBsb3dlciBiaXRyYXRlcyAoZS4gZy4gPD0gODAga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIGFuIGV2ZW4gc21hbGxlcgpiYW5kd2lkdGgsIGJlY2F1c2UgYW4gZW5jb2RlZCBzaWduYWwgd2l0aCBzbWFsbGVyIGJhbmR3aWR0aCBhbmQgaGVuY2UgbGVzcyBhcnRpZmFjdHMgc291bmRzIGJldHRlciB0aGFuIGEgc2lnbmFsCndpdGggaGlnaGVyIGJhbmR3aWR0aCBidXQgdGhlbiBtb3JlIGNvZGluZyBhcnRlZmFjdHMgYWNyb3NzIGFsbCBmcmVxdWVuY2llcy4gVGhlc2UgYXJ0ZWZhY3RzIHdvdWxkIG9jY3VyIGlmCnNtYWxsIGJpdHJhdGVzIGFuZCBoaWdoIGJhbmR3aWR0aHMgYXJlIGNob3NlbiBiZWNhdXNlIHRoZSBhdmFpbGFibGUgYml0cyBhcmUganVzdCBub3QgZW5vdWdoIHRvIGVuY29kZSBhbGwKZnJlcXVlbmNpZXMgd2VsbC4KClVuZm9ydHVuYXRlbHkgc29tZSBwZW9wbGUgZXZhbHVhdGUgZW5jb2RpbmcgcXVhbGl0eSBiYXNlZCBvbiBwb3NzaWJsZSBiYW5kd2lkdGggYXMgd2VsbCwgYnV0IGl0IGlzIGEgdHdvLXNpZGVkCnN3b3JkIGNvbnNpZGVyaW5nIHRoZSB0cmFkZS1vZmYgZGVzY3JpYmVkIGFib3ZlLgoKQW5vdGhlciBhc3BlY3QgaXMgd29ya2xvYWQgY29uc3VtcHRpb24uIFRoZSBoaWdoZXIgdGhlIGFsbG93ZWQgYmFuZHdpZHRoLCB0aGUgbW9yZSBmcmVxdWVuY3kgbGluZXMgaGF2ZSB0byBiZQpwcm9jZXNzZWQsIHdoaWNoIGluIHR1cm4gaW5jcmVhc2VzIHRoZSB3b3JrbG9hZC4KClxzZWN0aW9uIEZSQU1FU0laRVNfQU5EX0JJVF9SRVNFUlZPSVIgRnJhbWUgU2l6ZXMgJiBCaXQgUmVzZXJ2b2lyCgpGb3IgQUFDIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnN0YW50IGJpdCByYXRlIGFuZCBjb25zdGFudCBmcmFtZQpsZW5ndGggZHVlIHRvIHRoZSBzby1jYWxsZWQgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUsIHdoaWNoIGFsbG93cyB0aGUgZW5jb2RlciB0byB1c2UgbGVzcwpiaXRzIGluIGFuIEFBQyBmcmFtZSBmb3IgdGhvc2UgYXVkaW8gc2lnbmFsIHNlY3Rpb25zIHdoaWNoIGFyZSBlYXN5IHRvIGVuY29kZSwKYW5kIHRoZW4gc3BlbmQgdGhlbSBhdCBhIGxhdGVyIHBvaW50IGluCnRpbWUgZm9yIG1vcmUgY29tcGxleCBhdWRpbyBzZWN0aW9ucy4gVGhlIGV4dGVudCB0byB3aGljaCB0aGlzICJiaXQgZXhjaGFuZ2UiCmlzIGRvbmUgaXMgbGltaXRlZCB0byBhbGxvdyBmb3IgcmVsaWFibGUgYW5kIHJlbGF0aXZlbHkgbG93IGRlbGF5IHJlYWwgdGltZQpzdHJlYW1pbmcuCk92ZXIgYSBsb25nZXIgcGVyaW9kIGluIHRpbWUgdGhlIGJpdHJhdGUgd2lsbCBiZSBjb25zdGFudCBpbiB0aGUgQUFDIGNvbnN0YW50CmJpdHJhdGUgbW9kZSwgZS5nLiBmb3IgSVNETiB0cmFuc21pc3Npb24uIFRoaXMgbWVhbnMgdGhhdCBpbiBBQUMgZWFjaCBiaXRzdHJlYW0KZnJhbWUgd2lsbCBpbiBnZW5lcmFsIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIGluIGJ5dGVzIGJ1dCBvdmVyIHRpbWUgaXQKd2lsbCByZWFjaCB0aGUgdGFyZ2V0IGJpdHJhdGUuIE9uZSBjb3VsZCBhbHNvIG1ha2UgYW4gTVBFRyBjb21wbGlhbnQKQUFDIGVuY29kZXIgd2hpY2ggYWx3YXlzIHByb2R1Y2VzIGNvbnN0YW50IGxlbmd0aCBwYWNrYWdlcyBmb3IgZWFjaCBBQUMgZnJhbWUsCmJ1dCB0aGUgYXVkaW8gcXVhbGl0eSB3b3VsZCBiZSBjb25zaWRlcmFibHkgd29yc2Ugc2luY2UgdGhlIGJpdCByZXNlcnZvaXIKdGVjaG5pcXVlIHdvdWxkIGhhdmUgdG8gYmUgc3dpdGNoZWQgb2ZmIGNvbXBsZXRlbHkuIEEgaGlnaGVyIGJpdCByYXRlIHdvdWxkIGhhdmUKdG8gYmUgdXNlZCB0byBnZXQgdGhlIHNhbWUgYXVkaW8gcXVhbGl0eSBhcyB3aXRoIGFuIGVuYWJsZWQgYml0IHJlc2Vydm9pci4KClRoZSBtYXhpbXVtIEFBQyBmcmFtZSBsZW5ndGgsIHJlZ2FyZGxlc3Mgb2YgdGhlIGF2YWlsYWJsZSBiaXQgcmVzZXJ2b2lyLCBpcyBkZWZpbmVkCmFzIDYxNDQgYml0cyBwZXIgY2hhbm5lbC4KCkZvciBtcDMgYnkgdGhlIHdheSwgdGhlIHNhbWUgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUgZXhpc3RzLCBidXQgdGhlcmUgZWFjaCBiaXQKc3RyZWFtIGZyYW1lIGhhcyBhIGNvbnN0YW50IGxlbmd0aCBmb3IgYSBnaXZlbiBiaXQgcmF0ZSAoaWdub3JpbmcgdGhlCnBhZGRpbmcgYnl0ZSkuIEluIG1wMyB0aGVyZSBpcyBhIHNvLWNhbGxlZCAiYmFjayBwb2ludGVyIiB3aGljaCB0ZWxscwp0aGUgZGVjb2RlciB3aGljaCBiaXRzIGJlbG9uZyB0byB0aGUgY3VycmVudCBtcDMgZnJhbWUgLSBhbmQgaW4gZ2VuZXJhbCBzb21lIG9yCm1hbnkgYml0cyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgaW4gYW4gZWFybGllciBtcDMgZnJhbWUuIEJhc2ljYWxseSB0aGlzIGxlYWRzIHRvCnRoZSBzYW1lICJiaXQgZXhjaGFuZ2UgYmV0d2VlbiBtcDMgZnJhbWVzIiBhcyBpbiBBQUMgYnV0IHdpdGggdmlydHVhbGx5IGNvbnN0YW50Cmxlbmd0aCBmcmFtZXMuCgpUaGlzIHZhcmlhYmxlIGZyYW1lIGxlbmd0aCBhdCAiY29uc3RhbnQgYml0IHJhdGUiIGlzIG5vdCBzb21ldGhpbmcgc3BlY2lhbAppbiB0aGlzIEZyYXVuaG9mZXIgSUlTIEFBQyBlbmNvZGVyLiBBQUMgaGFzIGJlZW4gZGVzaWduZWQgaW4gdGhhdCB3YXkuCgpcc3Vic2VjdGlvbiBCRUhBVklPVVJfRVNUSU1fQVZHX0ZSQU1FU0laRVMgRXN0aW1hdGluZyBBdmVyYWdlIEZyYW1lIFNpemVzCgpBIEhFLUFBQyB2MSBvciB2MiBhdWRpbyBmcmFtZSBjb250YWlucyAyMDQ4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICh0aGVyZSBpcwphbHNvIG9uZSBtb2RlIHdpdGggMTkyMCBzYW1wbGVzIHBlciBjaGFubmVsIGJ1dCB0aGlzIGlzIG9ubHkgZm9yIHNwZWNpYWwgcHVycG9zZXMKc3VjaCBhcyBEQUIrIGRpZ2l0YWwgcmFkaW8pLgoKVGhlIG51bWJlciBvZiBIRS1BQUMgZnJhbWVzIFxmJE5cX0ZSQU1FU1xmJCBwZXIgc2Vjb25kIGF0IDQ0LjEga0h6IGlzOgoKXGZbCk5cX0ZSQU1FUyA9IDQ0MTAwIC8gMjA0OCA9IDIxLjUzMzIKXGZdCgpBdCBhIGJpdCByYXRlIG9mIDgga2JwcyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYml0cyBwZXIgZnJhbWUgXGYkTlxfQklUU1xfUEVSXF9GUkFNRVxmJCBpczoKClxmWwpOXF9CSVRTXF9QRVJcX0ZSQU1FID0gODAwMCAvIDIxLjUzMzIgPSAzNzEuNTIKXGZdCgp3aGljaCBpcyBhYm91dCA0Ni40NCBieXRlcyBwZXIgZW5jb2RlZCBmcmFtZS4KCkF0IGEgYml0IHJhdGUgb2YgMzIga2Jwcywgd2hpY2ggaXMgcXVpdGUgaGlnaCBmb3Igc2luZ2xlIGNoYW5uZWwgSEUtQUFDIHYxLCBpdCBpczoKClxmWwpOXF9CSVRTXF9QRVJcX0ZSQU1FID0gMzIwMDAgLyAyMS41MzMyID0gMTQ4NgpcZl0KCndoaWNoIGlzIGFib3V0IDE4NS43NiBieXRlcyBwZXIgZW5jb2RlZCBmcmFtZS4KClRoZXNlIGJpdHMvZnJhbWUgZmlndXJlcyBhcmUgYXZlcmFnZSBmaWd1cmVzIHdoZXJlIGVhY2ggQUFDIGZyYW1lIGdlbmVyYWxseSBoYXMgYSBkaWZmZXJlbnQKc2l6ZSBpbiBieXRlcy4gVG8gY2FsY3VsYXRlIHRoZSBzYW1lIGZvciBBQUMtTEMganVzdCB1c2UgMTAyNCBpbnN0ZWFkIG9mIDIwNDggUENNIHNhbXBsZXMgcGVyCmZyYW1lIGFuZCBjaGFubmVsLgpGb3IgQUFDLUxEL0VMRCBpdCBpcyBlaXRoZXIgNDgwIG9yIDUxMiBQQ00gc2FtcGxlcyBwZXIgZnJhbWUgYW5kIGNoYW5uZWwuCgoKXHNlY3Rpb24gQkVIQVZJT1VSX1RPT0xTIEVuY29kZXIgVG9vbHMKClRoZSBBQUMgZW5jb2RlciBzdXBwb3J0cyBUTlMsIFBOUywgTVMsIEludGVuc2l0eSBhbmQgYWN0aXZhdGVzIHRoZXNlIHRvb2xzIGRlcGVuZGluZyBvbiB0aGUgYXVkaW8gc2lnbmFsIGFuZAp0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIChpLmUuIGJpdHJhdGUgb3IgQU9UKS4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGVzZSB0b29scyBtYW51YWxseS4KClBOUyBpbXByb3ZlcyBlbmNvZGluZyBxdWFsaXR5IG9ubHkgZm9yIGNlcnRhaW4gYml0cmF0ZXMuIFRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBhY3RpdmF0ZSBQTlMgb25seSBmb3IKdGhlc2UgYml0cmF0ZXMgYW5kIHNhdmUgdGhlIHByb2Nlc3NpbmcgcG93ZXIgcmVxdWlyZWQgZm9yIFBOUyAoYWJvdXQgMTAgJSBvZiB0aGUgZW5jb2Rlcikgd2hlbiB1c2luZyBvdGhlcgpiaXRyYXRlcy4gVGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW5zaWRlIHRoZSBlbmNvZGVyIGxpYnJhcnkuIFBOUyBpcyBkaXNhYmxlZCBpbnNpZGUgdGhlIGVuY29kZXIgbGlicmFyeSBpZgphbiBNUEVHLTIgQU9UIGlzIGNob29zZW4gc2luY2UgUE5TIGlzIGFuIE1QRUctNCBBQUMgZmVhdHVyZS4KCklmIFNCUiBpcyBhY3RpdmF0ZWQsIHRoZSBlbmNvZGVyIGF1dG9tYXRpY2FsbHkgZGVhY3RpdmF0ZXMgUE5TIGludGVybmFsbHkuIElmIFROUyBpcyBkaXNhYmxlZCBidXQgUE5TIGlzIGFsbG93ZWQsCnRoZSBlbmNvZGVyIGRlYWN0aXZhdGVzIFBOUyBjYWxjdWxhdGlvbiBpbnRlcm5hbGx5LgoKKi8KCiNpZm5kZWYgX0FBQ19FTkNfTElCX0hfCiNkZWZpbmUgX0FBQ19FTkNfTElCX0hfCgojaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiNpbmNsdWRlICJGREtfYXVkaW8uaCIKCgovKioKICogIEFBQyBlbmNvZGVyIGVycm9yIGNvZGVzLgogKi8KdHlwZWRlZiBlbnVtIHsKICAgIEFBQ0VOQ19PSyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCgogICAgQUFDRU5DX0lOVkFMSURfSEFORExFICAgICAgICAgPSAweDAwMjAsICAvKiE8IEhhbmRsZSBwYXNzZWQgdG8gZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZC4gKi8KICAgIEFBQ0VOQ19NRU1PUllfRVJST1IgICAgICAgICAgID0gMHgwMDIxLCAgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCiAgICBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSICA9IDB4MDAyMiwgIC8qITwgUGFyYW1ldGVyIG5vdCBhdmFpbGFibGUuICovCiAgICBBQUNFTkNfSU5WQUxJRF9DT05GSUcgICAgICAgICA9IDB4MDAyMywgIC8qITwgQ29uZmlndXJhdGlvbiBub3QgcHJvdmlkZWQuICovCgogICAgQUFDRU5DX0lOSVRfRVJST1IgICAgICAgICAgICAgPSAweDAwNDAsICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCiAgICBBQUNFTkNfSU5JVF9BQUNfRVJST1IgICAgICAgICA9IDB4MDA0MSwgIC8qITwgQUFDIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCiAgICBBQUNFTkNfSU5JVF9TQlJfRVJST1IgICAgICAgICA9IDB4MDA0MiwgIC8qITwgU0JSIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCiAgICBBQUNFTkNfSU5JVF9UUF9FUlJPUiAgICAgICAgICA9IDB4MDA0MywgIC8qITwgVHJhbnNwb3J0IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCiAgICBBQUNFTkNfSU5JVF9NRVRBX0VSUk9SICAgICAgICA9IDB4MDA0NCwgIC8qITwgTWV0YSBkYXRhIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCgogICAgQUFDRU5DX0VOQ09ERV9FUlJPUiAgICAgICAgICAgPSAweDAwNjAsICAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLiAqLwoKICAgIEFBQ0VOQ19FTkNPREVfRU9GICAgICAgICAgICAgID0gMHgwMDgwICAgLyohPCBFbmQgb2YgZmlsZSByZWFjaGVkLiAqLwoKfSBBQUNFTkNfRVJST1I7CgoKLyoqCiAqICBBQUMgZW5jb2RlciBidWZmZXIgZGVzY3JpcHRvcnMgaWRlbnRpZmllci4KICogIFRoaXMgaWRlbnRpZmllciBhcmUgdXNlZCB3aXRoaW4gYnVmZmVyIGRlc2NyaXB0b3JzIEFBQ0VOQ19CdWZEZXNjOjpidWZmZXJJZGVudGlmaWVycy4KICovCnR5cGVkZWYgZW51bSB7CiAgICAvKiBJbnB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KICAgIElOX0FVRElPX0RBVEEgICAgICA9IDAsICAgICAgICAgICAgICAgICAgLyohPCBBdWRpbyBpbnB1dCBidWZmZXIsIGludGVybGVhdmVkIElOVF9QQ00gc2FtcGxlcy4gKi8KICAgIElOX0FOQ0lMTFJZX0RBVEEgICA9IDEsICAgICAgICAgICAgICAgICAgLyohPCBBbmNpbGxhcnkgZGF0YSB0byBiZSBlbWJlZGRlZCBpbnRvIGJpdHN0cmVhbS4gKi8KICAgIElOX01FVEFEQVRBX1NFVFVQICA9IDIsICAgICAgICAgICAgICAgICAgLyohPCBTZXR1cCBzdHJ1Y3R1cmUgZm9yIGVtYmVkZGluZyBtZXRhIGRhdGEuICovCgogICAgLyogT3V0cHV0IGJ1ZmZlciBpZGVudGlmaWVyLiAqLwogICAgT1VUX0JJVFNUUkVBTV9EQVRBID0gMywgICAgICAgICAgICAgICAgICAvKiE8IEJ1ZmZlciBob2xkcyBiaXRzdHJlYW0gb3V0cHV0IGRhdGEuICovCiAgICBPVVRfQVVfU0laRVMgICAgICAgPSA0ICAgICAgICAgICAgICAgICAgIC8qITwgQnVmZmVyIGNvbnRhaW5zIHNpemVzIG9mIGVhY2ggYWNjZXNzIHVuaXQuIFRoaXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBuZWNlc3NhcnkgZm9yIHN1cGVyZnJhbWluZy4gKi8KCn0gQUFDRU5DX0J1ZmZlcklkZW50aWZpZXI7CgoKLyoqCiAqICBBQUMgZW5jb2RlciBoYW5kbGUuCiAqLwp0eXBlZGVmIHN0cnVjdCBBQUNFTkNPREVSICpIQU5ETEVfQUFDRU5DT0RFUjsKCgovKioKICogIFByb3ZpZGVzIHNvbWUgaW5mbyBhYm91dCB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoKICAgIFVJTlQgICAgICAgICAgICAgICAgbWF4T3V0QnVmQnl0ZXM7ICAgICAgLyohPCBNYXhpbXVtIG51bWJlciBvZiBlbmNvZGVyIGJpdHN0cmVhbSBieXRlcyB3aXRoaW4gb25lIGZyYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgZGVwZW5kcyBvbiBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgaW4gZW5jb2RlciBpbnN0YW5jZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igc3VwZXJmcmFtaW5nIChhcyB1c2VkIGZvciBleGFtcGxlIGluIERBQispLCBzaXplIGhhcyB0byBiZSBhIG11bHRpcGxlIGFjY29yZGluZ2x5LiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgbWF4QW5jQnl0ZXM7ICAgICAgICAgLyohPCBNYXhpbXVtIG51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyB3aGljaCBjYW4gYmUgaW5zZXJ0ZWQgaW50bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSB3aXRoaW4gb25lIGZyYW1lLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgaW5CdWZGaWxsTGV2ZWw7ICAgICAgLyohPCBJbnRlcm5hbCBpbnB1dCBidWZmZXIgZmlsbCBsZXZlbCBpbiBzYW1wbGVzIHBlciBjaGFubmVsLiBUaGlzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbGVhcmVkIGlmIHNhbXBsaW5ncmF0ZSBvciBjaGFubmVsKE1vZGUvT3JkZXIpIGNoYW5nZXMuICovCgogICAgVUlOVCAgICAgICAgICAgICAgICBpbnB1dENoYW5uZWxzOyAgICAgICAvKiE8IE51bWJlciBvZiBpbnB1dCBjaGFubmVscyBleHBlY3RlZCBpbiBlbmNvZGluZyBwcm9jZXNzLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg7ICAgICAgICAgLyohPCBBbW91bnQgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBlYWNoIGZyYW1lIHBlciBjaGFubmVsLCBkZXBlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhdWRpbyBvYmplY3QgdHlwZSBjb25maWd1cmF0aW9uLiAqLwoKICAgIFVJTlQgICAgICAgICAgICAgICAgZW5jb2RlckRlbGF5OyAgICAgICAgLyohPCBDb2RlYyBkZWxheSBpbiBQQ00gc2FtcGxlcy9jaGFubmVsLiBEZXBlbmRzIG9uIGZyYW1lbGVuZ3RoIGFuZCBBT1QuIERvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBmcmFtaW5nIGRlbGF5IGZvciBmaWxsaW5nIHVwIGVuY29kZXIgUENNIGlucHV0IGJ1ZmZlci4gKi8KCiAgICBVQ0hBUiAgICAgICAgICAgICAgIGNvbmZCdWZbNjRdOyAgICAgICAgIC8qITwgQ29uZmlndXJhdGlvbiBidWZmZXIgaW4gYmluYXJ5IGZvcm1hdCBhcyBhbiBBdWRpb1NwZWNpZmljQ29uZmlnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgU3RyZWFtTXV4Q29uZmlnIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgdHJhbnNwb3J0IHR5cGUuICovCgogICAgVUlOVCAgICAgICAgICAgICAgICBjb25mU2l6ZTsgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBjb25mQnVmLiAqLwoKfSBBQUNFTkNfSW5mb1N0cnVjdDsKCgovKioKICogIERlc2NyaWJlcyB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGZvciBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgSU5UICAgICAgICAgICAgICAgICBudW1CdWZzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBidWZmZXJzLiAqLwogICAgdm9pZCAgICAgICAgICAgICAgKipidWZzOyAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdmVjdG9yIGNvbnRhaW5pbmcgYnVmZmVyIGFkZHJlc3Nlcy4gKi8KICAgIElOVCAgICAgICAgICAgICAgICAqYnVmZmVySWRlbnRpZmllcnM7ICAgLyohPCBJZGVudGlmaWVyIG9mIGVhY2ggYnVmZmVyIGVsZW1lbnQuIFNlZSA6OkFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICpidWZTaXplczsgICAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgaW4gOC1iaXQgYnl0ZXMuICovCiAgICBJTlQgICAgICAgICAgICAgICAgKmJ1ZkVsU2l6ZXM7ICAgICAgICAgIC8qITwgU2l6ZSBvZiBlYWNoIGJ1ZmZlciBlbGVtZW50IGluIGJ5dGVzLiAqLwoKfSBBQUNFTkNfQnVmRGVzYzsKCgovKioKICogIERlZmluZXMgdGhlIGlucHV0IGFyZ3VtZW50cyBmb3IgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbC4KICovCnR5cGVkZWYgc3RydWN0IHsKICAgIElOVCAgICAgICAgICAgICAgICAgbnVtSW5TYW1wbGVzOyAgICAgICAgLyohPCBOdW1iZXIgb2YgdmFsaWQgaW5wdXQgYXVkaW8gc2FtcGxlcyAobXVsdGlwbGUgb2YgaW5wdXQgY2hhbm5lbHMpLiAqLwogICAgSU5UICAgICAgICAgICAgICAgICBudW1BbmNCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyB0byBiZSBlbmNvZGVkLiAqLwoKfSBBQUNFTkNfSW5BcmdzOwoKCi8qKgogKiAgRGVmaW5lcyB0aGUgb3V0cHV0IGFyZ3VtZW50cyBmb3IgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbC4KICovCnR5cGVkZWYgc3RydWN0IHsKICAgIElOVCAgICAgICAgICAgICAgICAgbnVtT3V0Qnl0ZXM7ICAgICAgICAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0c3RyZWFtIGJ5dGVzIGdlbmVyYXRlZCBkdXJpbmcgYWFjRW5jRW5jb2RlKCkuICovCiAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgYnkgdGhlIGVuY29kZXIuICovCiAgICBJTlQgICAgICAgICAgICAgICAgIG51bUFuY0J5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBlbmNvZGVyLiAqLwoKfSBBQUNFTkNfT3V0QXJnczsKCgovKioKICogIE1ldGEgRGF0YSBDb21wcmVzc2lvbiBQcm9maWxlcy4KICovCnR5cGVkZWYgZW51bSB7CiAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkUgICAgICAgICAgPSAwLCAgIC8qITwgTm9uZS4gKi8KICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTVNUQU5EQVJEICA9IDEsICAgLyohPCBGaWxtIHN0YW5kYXJkLiAqLwogICAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQgICAgID0gMiwgICAvKiE8IEZpbG0gbGlnaHQuICovCiAgICBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDU1RBTkRBUkQgPSAzLCAgIC8qITwgTXVzaWMgc3RhbmRhcmQuICovCiAgICBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDTElHSFQgICAgPSA0LCAgIC8qITwgTXVzaWMgbGlnaHQuICovCiAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1NQRUVDSCAgICAgICAgPSA1ICAgIC8qITwgU3BlZWNoLiAqLwoKfSBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEU7CgoKLyoqCiAqICBNZXRhIERhdGEgc2V0dXAgc3RydWN0dXJlLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoKICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgZHJjX3Byb2ZpbGU7ICAgICAgICAgICAgIC8qITwgTVBFRyBEUkMgY29tcHJlc3Npb24gcHJvZmlsZS4gU2VlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFLiAqLwogIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBjb21wX3Byb2ZpbGU7ICAgICAgICAgICAgLyohPCBFVFNJIGhlYXZ5IGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KCiAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19UYXJnZXRSZWZMZXZlbDsgICAgICAvKiE8IFVzZWQgdG8gZGVmaW5lIGV4cGVjdGVkIGxldmVsIHRvOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4gKi8KICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9UYXJnZXRSZWZMZXZlbDsgICAgIC8qITwgQWRqdXN0IGxpbWl0ZXIgdG8gYXZvaWQgb3ZlcmxvYWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiAqLwoKICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsgIC8qITwgRmxhZywgaWYgcHJvZ19yZWZfbGV2ZWwgaXMgcHJlc2VudCAqLwogIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX3JlZl9sZXZlbDsgICAgICAgICAgLyohPCBQcm9ncmFtbWUgUmVmZXJlbmNlIExldmVsID0gRGlhbG9ndWUgTGV2ZWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMS43NWRCIC4uIDAgZEIgOyBzdGVwc2l6ZTogMC4yNWRCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiovCgogIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBQQ0VfbWl4ZG93bl9pZHhfcHJlc2VudDsgLyohPCBGbGFnLCBpZiBkbXgtaWR4IHNob3VsZCBiZSB3cml0dGVuIGluIHByb2dyYW1tZSBjb25maWcgZWxlbWVudCAqLwogIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBFVFNJX0RteEx2bF9wcmVzZW50OyAgICAgLyohPCBGbGFnLCBpZiBkbXgtbHZsIHNob3VsZCBiZSB3cml0dGVuIGluIEVUU0ktYW5jRGF0YSAqLwoKICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyTWl4TGV2ZWw7ICAgICAgICAgIC8qITwgQ2VudGVyIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpICovCiAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgIHN1cnJvdW5kTWl4TGV2ZWw7ICAgICAgICAvKiE8IFN1cnJvdW5kIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpICovCgogIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBkb2xieVN1cnJvdW5kTW9kZTsgICAgICAgLyohPCBJbmRpY2F0aW9uIGZvciBEb2xieSBTdXJyb3VuZCBFbmNvZGluZyBNb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERvbGJ5IFN1cnJvdW5kIG1vZGUgbm90IGluZGljYXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IDItY2ggYXVkaW8gcGFydCBpcyBub3QgRG9sYnkgc3Vycm91bmQgZW5jb2RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IDItY2ggYXVkaW8gcGFydCBpcyBEb2xieSBzdXJyb3VuZCBlbmNvZGVkICovCn0gQUFDRU5DX01ldGFEYXRhOwoKCi8qKgogKiBBQUMgZW5jb2RlciBjb250cm9sIGZsYWdzLgogKgogKiBJbiBpbnRlcmFjdGlvbiB3aXRoIHRoZSA6OkFBQ0VOQ19DT05UUk9MX1NUQVRFIHBhcmFtZXRlciBpdCBpcyBwb3NzaWJsZSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsCiAqIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcndyaXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBmcm9tIGV4dGVybiB3aGVuIG5lY2Vzc2FyeS4KICovCnR5cGVkZWYgZW51bQp7CiAgICBBQUNFTkNfSU5JVF9OT05FICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgRG8gbm90IHRyaWdnZXIgaW5pdGlhbGl6YXRpb24uICovCiAgICBBQUNFTkNfSU5JVF9DT05GSUcgICAgICAgICAgICA9IDB4MDAwMSwgIC8qITwgSW5pdGlhbGl6ZSBhbGwgZW5jb2RlciBtb2R1bGVzIGNvbmZpZ3VyYXRpb24uICovCiAgICBBQUNFTkNfSU5JVF9TVEFURVMgICAgICAgICAgICA9IDB4MDAwMiwgIC8qITwgUmVzZXQgYWxsIGVuY29kZXIgbW9kdWxlcyBoaXN0b3J5IGJ1ZmZlci4gKi8KICAgIEFBQ0VOQ19JTklUX1RSQU5TUE9SVCAgICAgICAgID0gMHgxMDAwLCAgLyohPCBJbml0aWFsaXplIHRyYW5zcG9ydCBsaWIgd2l0aCBuZXcgcGFyYW1ldGVycy4gKi8KICAgIEFBQ0VOQ19SRVNFVF9JTkJVRkZFUiAgICAgICAgID0gMHgyMDAwLCAgLyohPCBSZXNldCBmaWxsIGxldmVsIG9mIGludGVybmFsIGlucHV0IGJ1ZmZlci4gKi8KICAgIEFBQ0VOQ19JTklUX0FMTCAgICAgICAgICAgICAgID0gMHhGRkZGICAgLyohPCBJbml0aWFsaXplIGFsbC4gKi8KfQpBQUNFTkNfQ1RSTEZMQUdTOwoKCi8qKgogKiBcYnJpZWYgIEFBQyBlbmNvZGVyIHNldHRpbmcgcGFyYW1ldGVycy4KICoKICogVXNlIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmdW5jdGlvbiB0byBjb25maWd1cmUsIG9yIHVzZSBhYWNFbmNvZGVyX0dldFBhcmFtKCkgZnVuY3Rpb24gdG8gcmVhZAogKiB0aGUgaW50ZXJuYWwgc3RhdHVzIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycy4KICovCnR5cGVkZWYgZW51bQp7CiAgQUFDRU5DX0FPVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwgIC8qITwgQXVkaW8gb2JqZWN0IHR5cGUuIFNlZSA6OkFVRElPX09CSkVDVF9UWVBFIGluIEZES19hdWRpby5oLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDU6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIChIRS1BQUMpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjk6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGFuZCBQYXJhbWV0cmljIFN0ZXJlbyAoSEUtQUFDIHYyKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgb25seSB3aXRoIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjM6IE1QRUctNCBBQUMgTG93LURlbGF5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzk6IE1QRUctNCBBQUMgRW5oYW5jZWQgTG93LURlbGF5LiBTaW5jZSB0aGVyZSBpcyBubyA6OkFVRElPX09CSkVDVF9UWVBFIGZvciBFTEQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3aXRoIFNCUiBkZWZpbmVkLCBlbmFibGUgU0JSIGV4cGxpY2l0ZWx5IGJ5IDo6QUFDRU5DX1NCUl9NT0RFIHBhcmFtZXRlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEyOTogTVBFRy0yIEFBQyBMb3cgQ29tcGxleGl0eS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEzMjogTVBFRy0yIEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gKEhFLUFBQykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxNTY6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGFuZCBQYXJhbWV0cmljIFN0ZXJlbyAoSEUtQUFDIHYyKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBzdGVyZW8gaW5wdXQgYXVkaW8gZGF0YS4gKi8KCiAgQUFDRU5DX0JJVFJBVEUgICAgICAgICAgICAgICAgICA9IDB4MDEwMSwgIC8qITwgVG90YWwgZW5jb2RlciBiaXRyYXRlLiBUaGlzIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgYW5kIGludGVyYWN0cyB3aXRoIDo6QUFDRU5DX0JJVFJBVEVNT0RFLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ0JSOiBCaXRyYXRlIGluIGJpdHMvc2Vjb25kLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIFxyZWYgc3VwcEJpdHJhdGVzIGZvciBkZXRhaWxzLiAqLwoKICBBQUNFTkNfQklUUkFURU1PREUgICAgICAgICAgICAgID0gMHgwMTAyLCAgLyohPCBCaXRyYXRlIG1vZGUuIENvbmZpZ3VyYXRpb24gY2FuIGJlIGRpZmZlcmVudCBraW5kIG9mIGJpdHJhdGUgY29uZmlndXJhdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBDb25zdGFudCBiaXRyYXRlLCB1c2UgYml0cmF0ZSBhY2NvcmRpbmcgdG8gOjpBQUNFTkNfQklUUkFURS4gKGRlZmF1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXRoaW4gbm9uZSBMRC9FTEQgOjpBVURJT19PQkpFQ1RfVFlQRSwgdGhlIENCUiBtb2RlIG1ha2VzIHVzZSBvZiBmdWxsIGFsbG93ZWQgYml0cmVzZXJ2b2lyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gY29udHJhc3QsIGF0IExvdy1EZWxheSA6OkFVRElPX09CSkVDVF9UWVBFIHRoZSBiaXRyZXNlcnZvaXIgaXMga2VwdCB2ZXJ5IHNtYWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gODogTEQvRUxEIGZ1bGwgYml0cmVzZXJ2b2lyIGZvciBwYWNrZXQgYmFzZWQgdHJhbnNtaXNzaW9uLiAqLwoKICBBQUNFTkNfU0FNUExFUkFURSAgICAgICAgICAgICAgID0gMHgwMTAzLCAgLyohPCBBdWRpbyBpbnB1dCBkYXRhIHNhbXBsaW5nIHJhdGUuIEVuY29kZXIgc3VwcG9ydHMgZm9sbG93aW5nIHNhbXBsaW5nIHJhdGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsIDg4MjAwLCA5NjAwMCAqLwoKICBBQUNFTkNfU0JSX01PREUgICAgICAgICAgICAgICAgID0gMHgwMTA0LCAgLyohPCBDb25maWd1cmUgU0JSIGluZGVwZW5kZW50bHkgb2YgdGhlIGNob3NlbiBBdWRpbyBPYmplY3QgVHlwZSA6OkFVRElPX09CSkVDVF9UWVBFLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGZvciBFTEQgYXVkaW8gb2JqZWN0IHR5cGUgb25seS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC0xOiBVc2UgRUxEIFNCUiBhdXRvIGNvbmZpZ3VyYXRvciAoZGVmYXVsdCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEaXNhYmxlIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbmFibGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4gKi8KCiAgQUFDRU5DX0dSQU5VTEVfTEVOR1RIICAgICAgICAgICA9IDB4MDEwNSwgIC8qITwgQ29yZSBlbmNvZGVyIChBQUMpIGF1ZGlvIGZyYW1lIGxlbmd0aCBpbiBzYW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTAyNDogRGVmYXVsdCBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNTEyOiBEZWZhdWx0IExEL0VMRCBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNDgwOiBPcHRpb25hbCBsZW5ndGggaW4gTEQvRUxEIGNvbmZpZ3VyYXRpb24uICovCgogIEFBQ0VOQ19DSEFOTkVMTU9ERSAgICAgICAgICAgICAgPSAweDAxMDYsICAvKiE8IFNldCBleHBsaWNpdCBjaGFubmVsIG1vZGUuIENoYW5uZWwgbW9kZSBtdXN0IG1hdGNoIHdpdGggbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMS03IGFuZCAzMywzNDogTVBFRyBjaGFubmVsIG1vZGVzIHN1cHBvcnRlZCwgc2VlIDo6Q0hBTk5FTF9NT0RFIGluIEZES19hdWRpby5oLiAqLwoKICBBQUNFTkNfQ0hBTk5FTE9SREVSICAgICAgICAgICAgID0gMHgwMTA3LCAgLyohPCBJbnB1dCBhdWRpbyBkYXRhIGNoYW5uZWwgb3JkZXJpbmcgc2NoZW1lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTVBFRyBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEMsIEwsIFIsIFNMLCBTUiwgTEZFKS4gKGRlZmF1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBXQVZFIGZpbGUgZm9ybWF0IGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogTCwgUiwgQywgTEZFLCBTTCwgU1IpLiAqLwoKICBBQUNFTkNfU0JSX1JBVElPICAgICAgICAgICAgICAgID0gMHgwMTA4LCAgLyohPCAgQ29udHJvbHMgYWN0aXZhdGlvbiBvZiBkb3duc2FtcGxlZCBTQlIuIFdpdGggZG93bnNhbXBsZWQgU0JSLCB0aGUgZGVsYXkgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGVyLiBPbiB0aGUgb3RoZXIgaGFuZCwgZm9yIGFjaGlldmluZyB0aGUgc2FtZSBxdWFsaXR5IGxldmVsLCBkb3duc2FtcGxlZCBTQlIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgbW9yZSBiaXRzIHRoYW4gZHVhbC1yYXRlIFNCUi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aCBkb3duc2FtcGxlZCBTQlIsIHRoZSBBQUMgZW5jb2RlciB3aWxsIHdvcmsgYXQgdGhlIHNhbWUgc2FtcGxpbmcgcmF0ZSBhcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSIGVuY29kZXIgKHNpbmdsZSByYXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bnNhbXBsZWQgU0JSIGlzIHN1cHBvcnRlZCBmb3IgQUFDLUVMRCBhbmQgSEUtQUFDdjEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogRG93bnNhbXBsZWQgU0JSIChkZWZhdWx0IGZvciBFTEQpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IER1YWwtcmF0ZSBTQlIgICAoZGVmYXVsdCBmb3IgSEUtQUFDKS4gKi8KCiAgQUFDRU5DX0FGVEVSQlVSTkVSICAgICAgICAgICAgICA9IDB4MDIwMCwgIC8qITwgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHVzZSBvZiB0aGUgYWZ0ZXJidXJuZXIgZmVhdHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYWZ0ZXJidXJuZXIgaXMgYSB0eXBlIG9mIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyBhbGdvcml0aG0gd2hpY2ggaW5jcmVhc2VzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHF1YWxpdHkgYnV0IGFsc28gdGhlIHJlcXVpcmVkIHByb2Nlc3NpbmcgcG93ZXIuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlIHRoaXMgaWYgYWRkaXRpb25hbCBtZW1vcnkgY29uc3VtcHRpb24gYW5kIHByb2Nlc3NpbmcgcG93ZXIgY29uc3VtcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYSBwcm9ibGVtLiBJZiBpbmNyZWFzZWQgTUh6IGFuZCBtZW1vcnkgY29uc3VtcHRpb24gYXJlIGFuIGlzc3VlIHRoZW4gdGhlIE1IegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBtZW1vcnkgY29zdCBvZiB0aGlzIG9wdGlvbmFsIG1vZHVsZSBuZWVkIHRvIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBpbXByb3ZlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGF1ZGlvIHF1YWxpdHkgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEaXNhYmxlIGFmdGVyYnVybmVyIChkZWZhdWx0KS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBhZnRlcmJ1cm5lci4gKi8KCiAgQUFDRU5DX0JBTkRXSURUSCAgICAgICAgICAgICAgICA9IDB4MDIwMywgIC8qITwgQ29yZSBlbmNvZGVyIGF1ZGlvIGJhbmR3aWR0aDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERldGVybWluZSBiYW5kd2lkdGggaW50ZXJuYWxseSAoZGVmYXVsdCwgc2VlIGNoYXB0ZXIgXHJlZiBCRUhBVklPVVJfQkFORFdJRFRIKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgdG8gZnMvMjogRnJlcXVlbmN5IGJhbmR3aWR0aCBpbiBIZXJ0ei4gKEV4cGVydHMgb25seSwgYmV0dGVyIGRvIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaCB0aGlzIHZhbHVlIHRvIGF2b2lkIGRlZ3JhZGVkIGF1ZGlvIHF1YWxpdHkpICovCgogIEFBQ0VOQ19UUkFOU01VWCAgICAgICAgICAgICAgICAgPSAweDAzMDAsICAvKiE8IFRyYW5zcG9ydCB0eXBlIHRvIGJlIHVzZWQuIFNlZSA6OlRSQU5TUE9SVF9UWVBFIGluIEZES19hdWRpby5oLiBGb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBjYW4gYmUgY29uZmlndXJlZCBpbiBlbmNvZGVyIGxpYnJhcnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiByYXcgYWNjZXNzIHVuaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBBRElGIGJpdHN0cmVhbSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEFEVFMgYml0c3RyZWFtIGZvcm1hdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNjogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA3OiBBdWRpbyBNdXggRWxlbWVudHMgKExBVE0pIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTA6IEF1ZGlvIFN5bmMgU3RyZWFtIChMT0FTKSAqLwoKICBBQUNFTkNfSEVBREVSX1BFUklPRCAgICAgICAgICAgID0gMHgwMzAxLCAgLyohPCBGcmFtZSBjb3VudCBwZXJpb2QgZm9yIHNlbmRpbmcgaW4tYmFuZCBjb25maWd1cmF0aW9uIGJ1ZmZlcnMgd2l0aGluIExBVE0vTE9BUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBsYXllci4gQWRkaXRpb25hbGx5IHRoaXMgcGFyYW1ldGVyIGNvbmZpZ3VyZXMgdGhlIFBDRSByZXBldGl0aW9uIHBlcmlvZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHJhd19kYXRhX2Jsb2NrKCkuIFNlZSBccmVmIGVuY1BDRS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4RkY6IGF1dG8tbW9kZSBkZWZhdWx0IDEwIGZvciBUVF9NUDRfQURUUywgVFRfTVA0X0xPQVMgYW5kIFRUX01QNF9MQVRNX01DUDEsIG90aGVyd2lzZSAwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbjogRnJhbWUgY291bnQgcGVyaW9kLiAqLwoKICBBQUNFTkNfU0lHTkFMSU5HX01PREUgICAgICAgICAgID0gMHgwMzAyLCAgLyohPCBTaWduYWxpbmcgbW9kZSBvZiB0aGUgZXh0ZW5zaW9uIEFPVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IEltcGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nIChkZWZhdWx0IGZvciBub24tTVBFRy00IGJhc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBT1QncyBhbmQgZm9yIHRoZSB0cmFuc3BvcnQgZm9ybWF0cyBBRElGIGFuZCBBRFRTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIHN0cmVhbSB0aGF0IHVzZXMgaW1wbGljaXQgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIGJ5IGV2ZXJ5IEFBQyBkZWNvZGVyLCBldmVuIEFBQy1MQy1vbmx5IGRlY29kZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIEFBQy1MQy1vbmx5IGRlY29kZXIgd2lsbCBvbmx5IGRlY29kZSB0aGUgbG93LWZyZXF1ZW5jeSBwYXJ0IG9mIHRoZSBzdHJlYW0sIHJlc3VsdGluZyBpbiBhIGJhbmQtbGltaXRlZCBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2Qgd29ya3Mgd2l0aCBhbGwgdHJhbnNwb3J0IGZvcm1hdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogRXhwbGljaXQgYmFja3dhcmQgY29tcGF0aWJsZSBzaWduYWxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIGJ5IGV2ZXJ5IEFBQyBkZWNvZGVyLCBldmVuIEFBQy1MQy1vbmx5IGRlY29kZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIEFBQy1MQy1vbmx5IGRlY29kZXIgd2lsbCBvbmx5IGRlY29kZSB0aGUgbG93LWZyZXF1ZW5jeSBwYXJ0IG9mIHRoZSBzdHJlYW0sIHJlc3VsdGluZyBpbiBhIGJhbmQtbGltaXRlZCBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBkZWNvZGVyIG5vdCBjYXBhYmxlIG9mIGRlY29kaW5nIFBTIHdpbGwgb25seSBkZWNvZGUgdGhlIEFBQy1MQytTQlIgcGFydC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBjb250YWluZWQgUFMsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGEgZGVjb2RlZCBtb25vIGRvd25taXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIEFESUYgb3IgQURUUy4gRm9yIExPQVMvTEFUTSwgaXQgb25seSB3b3JrcyB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgKGRlZmF1bHQgZm9yIE1QRUctNCBiYXNlZCBBT1QncyBhbmQgZm9yIGFsbCB0cmFuc3BvcnQgZm9ybWF0cyBleGNsdWRpbmcgQURJRiBhbmQgQURUUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgY2FuIGJlIGRlY29kZWQgb25seSBieSBIRS1BQUMgZGVjb2RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG5vdCBkZWNvZGUgYSBzdHJlYW0gdGhhdCB1c2VzIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBkZWNvZGVyIG5vdCBjYXBhYmxlIG9mIGRlY29kaW5nIFBTIHdpbGwgbm90IGRlY29kZSB0aGUgc3RyZWFtIGF0IGFsbCBpZiBpdCBjb250YWluZWQgUFMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIEFESUYgb3IgQURUUy4gSXQgd29ya3Mgd2l0aCBMT0FTL0xBVE0gYW5kIHRoZSBNUEVHLTQgRmlsZSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyB3b3JrIHdpdGggZG93bnNhbXBsZWQgU0JSCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgYWx3YXlzIGV4cGVyaWVuY2VzIHRoZSBiZXN0IGF1ZGlvIHF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgYSBmdWxsIEhFLUFBQy1jYXBhYmxlIGRlY29kZXIgd2lsbCBkZWNvZGUgdGhvc2Ugc3RyZWFtcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF1ZGlvIGlzIHBsYXllZCBhdCBmdWxsIGJhbmR3aWR0aC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGJlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGl0IGlzIHJlY29tbWVuZGVkIHRvIGVuY29kZSB3aXRoIGltcGxpY2l0IFNCUiBzaWduYWxpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZGVjb2RlciBjYXBhYmxlIG9mIEFBQy1MQyBvbmx5IHdpbGwgdGhlbiBvbmx5IGRlY29kZSB0aGUgQUFDIHBhcnQsIHdoaWNoIG1lYW5zIHRoZSBkZWNvZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHdpbGwgc291bmQgYmFuZC1saW1pdGVkLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIE1QRUctMiB0cmFuc3BvcnQgdHlwZXMgKEFEVFMsQURJRiksIG9ubHkgaW1wbGljaXQgc2lnbmFsaW5nIGlzIHBvc3NpYmxlLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIExPQVMgYW5kIExBVE0sIGV4cGxpY2l0IGJhY2t3YXJkcyBjb21wYXRpYmxlIHNpZ25hbGluZyBvbmx5IHdvcmtzIHRvZ2V0aGVyIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0xLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhc29uIGlzIHRoYXQsIGZvciBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgQVNDLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGRlY29kZXIgdGhhdCBpcyBvbmx5IGNhcGFibGUgb2YgZGVjb2RpbmcgQUFDLUxDIHdpbGwgc2tpcCB0aGlzIHBhcnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldmVydGhlbGVzcywgZm9yIGp1bXBpbmcgdG8gdGhlIGVuZCBvZiB0aGUgQVNDLCBpdCBuZWVkcyB0byBrbm93IHRoZSBBU0MgbGVuZ3RoLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc21pdHRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgQVNDIGlzIGEgZmVhdHVyZSBvZiBBdWRpb011eFZlcnNpb249PTEsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0cmFuc21pdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBBU0Mgd2l0aCBBdWRpb011eFZlcnNpb249PTAsIHRoZXJlZm9yZSBhbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgbm90IGJlIGFibGUgdG8gcGFyc2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0FTL0xBVE0gc3RyZWFtIHRoYXQgd2FzIGJlaW5nIGVuY29kZWQgd2l0aCBBdWRpb011eFZlcnNpb249PTAuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZG93bnNhbXBsZWQgU0JSLCBleHBsaWNpdCBzaWduYWxpbmcgaXMgbWFuZGF0b3J5LiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBzYW1wbGluZyBmcmVxdWVuY3kgKHdoaWNoIGlzIGluIGNhc2Ugb2YgU0JSIHRoZSBzYW1wbGluZyBmcmVxdXFuY3kgb2YgdGhlIFNCUiBwYXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gb25seSBiZSBzaWduYWxlZCBpbiBleHBsaWNpdCBtb2RlLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFBQy1FTEQsIHRoZSBTQlIgaW5mb3JtYXRpb24gaXMgdHJhbnNtaXR0ZWQgaW4gdGhlIEVMRFNwZWNpZmljIENvbmZpZywgd2hpY2ggaXMgcGFydCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TcGVjaWZpY0NvbmZpZy4gVGhlcmVmb3JlLCB0aGUgc2V0dGluZ3MgaGVyZSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIEFBQy1FTEQuKi8KCiAgQUFDRU5DX1RQU1VCRlJBTUVTICAgICAgICAgICAgICA9IDB4MDMwMywgIC8qITwgTnVtYmVyIG9mIHN1YiBmcmFtZXMgaW4gYSB0cmFuc3BvcnQgZnJhbWUgZm9yIExPQVMvTEFUTSBvciBBRFRTIChkZWZhdWx0IDEpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURUUzogTWF4aW11bSBudW1iZXIgb2Ygc3ViIGZyYW1lcyByZXN0cmljdGVkIHRvIDQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBMT0FTL0xBVE06IE1heGltdW0gbnVtYmVyIG9mIHN1YiBmcmFtZXMgcmVzdHJpY3RlZCB0byAyLiovCgogIEFBQ0VOQ19QUk9URUNUSU9OICAgICAgICAgICAgICAgPSAweDAzMDYsICAvKiE8IENvbmZpZ3VyZSBwcm90ZWN0aW9uIGluIHRyYW5wc29ydCBsYXllcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIHByb3RlY3Rpb24uIChkZWZhdWx0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogQ1JDIGFjdGl2ZSBmb3IgQURUUyBiaXRzdHJlYW0gZm9ybWF0LiAqLwoKICBBQUNFTkNfQU5DSUxMQVJZX0JJVFJBVEUgICAgICAgID0gMHgwNTAwLCAgLyohPCBDb25zdGFudCBhbmNpbGxhcnkgZGF0YSBiaXRyYXRlIGluIGJpdHMvc2Vjb25kLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRWl0aGVyIG5vIGFuY2lsbGFyeSBkYXRhIG9yIGluc2VydCBleGFjdCBudW1iZXIgb2YgYnl0ZXMsIGRlbm90ZWQgdmlhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBwYXJhbWV0ZXIsIG51bUFuY0J5dGVzIGluIEFBQ0VOQ19JbkFyZ3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBlbHNlOiBJbnNlcnQgYW5jaWxsYXJ5IGRhdGEgd2l0aCBzcGVjaWZpZWQgYml0cmF0ZS4gKi8KCiAgQUFDRU5DX01FVEFEQVRBX01PREUgICAgICAgICAgICA9IDB4MDYwMCwgIC8qITwgQ29uZmlndXJlIE1ldGEgRGF0YS4gU2VlIDo6QUFDRU5DX01ldGFEYXRhIGZvciBmdXJ0aGVyIGRldGFpbHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEbyBub3QgZW1iZWQgYW55IG1ldGFkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogRW1iZWQgTVBFRyBkZWZpbmVkIG1ldGFkYXRhIG9ubHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBFbWJlZCBhbGwgbWV0YWRhdGEuICovCgogIEFBQ0VOQ19DT05UUk9MX1NUQVRFICAgICAgICAgICAgPSAweEZGMDAsICAvKiE8IFRoZXJlIGlzIGFuIGF1dG9tYXRpYyBwcm9jZXNzIHdoaWNoIGludGVybmFsbHkgcmVjb25maWd1cmVzIHRoZSBlbmNvZGVyIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGNoYW5nZWQgb3IgYW4gZXJyb3Igb2NjdXJlZC4gVGhpcyBwYXJhbWVydGVyIGFsbG93cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0aW5nIG9yIGdldHRpbmcgdGhlIGNvbnRyb2wgc3RhdHVzIG9mIHRoaXMgcHJvY2Vzcy4gU2VlIDo6QUFDRU5DX0NUUkxGTEFHUy4gKi8KCiAgQUFDRU5DX05PTkUgICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgLS0tLS0tICovCgp9IEFBQ0VOQ19QQVJBTTsKCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKLyoqCiAqIFxicmllZiAgT3BlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZW5jb2Rlci4KICoKICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBlbmNvZGVyIGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbmFsIHJhbmdlIGRlbm90ZWQgYnkgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCiAqIFByZWluaXRpYWxpemUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KICoKICogXHBhcmFtIHBoQWFjRW5jb2RlciAgQSBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCiAqIFxwYXJhbSBlbmNNb2R1bGVzICAgIFNwZWNpZnkgZW5jb2RlciBtb2R1bGVzIHRvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGVuY29kZXIgaW5zdGFuY2U6CiAqICAgICAgICAgICAgICAgICAgICAgIC0gMHgwOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBhdmFpbGFibGUgZW5jb2RlciBtb2R1bGVzLgogKiAgICAgICAgICAgICAgICAgICAgICAtIGVsc2U6IFNlbGVjdCBtZW1vcnkgYWxsb2NhdGlvbiByZWdhcmRpbmcgZW5jb2RlciBtb2R1bGVzLiBGb2xsb3dpbmcgZmxhZ3MgYXJlIHBvc3NpYmxlIGFuZCBjYW4gYmUgY29tYmluZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDAxOiBBQUMgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgwMjogU0JSIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDQ6IFBTIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MTA6IE1ldGFkYXRhIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV4YW1wbGU6ICgweDAxfDB4MDJ8MHgwNHwweDEwKSBhbGxvY2F0ZXMgYWxsIG1vZHVsZXMgYW5kIGlzIGVxdWl2YWxlbnQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGRlbm90ZXQgYnkgMHgwLgogKiBccGFyYW0gbWF4Q2hhbm5lbHMgICBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgYWxsb2NhdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5czoKICogICAgICAgICAgICAgICAgICAgICAgLSAwOiBBbGxvY2F0ZSBtYXhpbXVtIG51bWJlciBvZiBBQUMgYW5kIFNCUiBjaGFubmVscyBhcyBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkuCiAqICAgICAgICAgICAgICAgICAgICAgIC0gbkNoYW5uZWxzOiBVc2Ugc2FtZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBmb3IgYWxsb2NhdGluZyBtZW1vcnkgaW4gQUFDIGFuZCBTQlIgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAtIG5DaGFubmVscyB8IChuU2JyQ2g8PDgpOiBOdW1iZXIgb2YgU0JSIGNoYW5uZWxzIGNhbiBiZSBkaWZmZXJlbnQgdG8gQUFDIGNoYW5uZWxzIHRvIHNhdmUgZGF0YSBtZW1vcnkuCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlcy4KICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19NRU1PUllfRVJST1IsIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KICovCkFBQ0VOQ19FUlJPUiBhYWNFbmNPcGVuKAogICAgICAgIEhBTkRMRV9BQUNFTkNPREVSICAgICAgICAqcGhBYWNFbmNvZGVyLAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgZW5jTW9kdWxlcywKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIG1heENoYW5uZWxzCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmICBDbG9zZSB0aGUgZW5jb2RlciBpbnN0YW5jZS4KICoKICogRGVhbGxvY2F0ZSBlbmNvZGVyIGluc3RhbmNlIGFuZCBmcmVlIHdob2xlIG1lbW9yeS4KICoKICogXHBhcmFtIHBoQWFjRW5jb2RlciAgUG9pbnRlciB0byB0aGUgZW5jb2RlciBoYW5kbGUgdG8gYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBvbiBmYWlsdXJlLgogKi8KQUFDRU5DX0VSUk9SIGFhY0VuY0Nsb3NlKAogICAgICAgIEhBTkRMRV9BQUNFTkNPREVSICAgICAgICAqcGhBYWNFbmNvZGVyCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmIEVuY29kZSBhdWRpbyBkYXRhLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBmb3IgZW5jb2RpbmcgYXVkaW8gZGF0YS4gSW4gYWRkaXRpb24gdGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbiBlbmNvZGVyIChyZSljb25maWd1cmF0aW9uCiAqIHByb2Nlc3MuCiAqIC0gUENNIGlucHV0IGRhdGEgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSBleHRlcm5hbCBpbnB1dCBidWZmZXIgdW50aWwgdGhlIGZpbGwgbGV2ZWwgYWxsb3dzIGVuY29kaW5nIGEgc2luZ2xlIGZyYW1lLgogKiAgIFRoaXMgZnVuY3Rpb25hbGl0eSBhbGxvd3MgYW4gZXh0ZXJuYWwgYnVmZmVyIHdpdGggcmVkdWNlZCBzaXplIGluIGNvbXBhcmlzb24gdG8gdGhlIEFBQyBvciBIRS1BQUMgYXVkaW8gZnJhbWUgbGVuZ3RoLgogKiAtIElmIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCBpcyB6ZXJvLCBqdXN0IGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGl0IGlzCiAqICAgcmVxdWVzdGVkLgogKiAtIEF0IHRoZSBlbmQgb2YgYSBmaWxlIHRoZSBmbHVzaGluZyBwcm9jZXNzIGNhbiBiZSB0cmlnZ2VyZCB2aWEgc2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJndW1lbnQgdG8gLTEuCiAqICAgVGhlIGVuY29kZXIgZGVsYXkgbGluZXMgYXJlIGZ1bGx5IGZsdXNoZWQgd2hlbiB0aGUgZW5jb2RlciByZXR1cm5zIG5vIHZhbGlkIGJpdHN0cmVhbSBkYXRhIEFBQ0VOQ19PdXRBcmdzOjpudW1PdXRCeXRlcy4KICogICBGdXJ0aGVybW9yZSB0aGUgZW5kIG9mIGZpbGUgaXMgc2lnbmFsZWQgYnkgdGhlIHJldHVybiB2YWx1ZSBBQUNFTkNfRU5DT0RFX0VPRi4KICogLSBJZiBhbiBlcnJvciBvY2N1cmVkIGluIHRoZSBwcmV2aW91cyBmcmFtZSBvciBhbnkgb2YgdGhlIGVuY29kZXIgcGFyYW1ldGVycyBjaGFuZ2VkLCBhbiBpbnRlcm5hbCByZWluaXRpYWxpemF0aW9uCiAqICAgcHJvY2VzcyB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlIGVuY29kaW5nIHRoZSBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLgogKiAtIFRoZSBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIGZvciBhbiBpbmRlcGVuZGVudCByZWNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aXRob3V0IGVuY29kaW5nLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGhhcyB0byBiZSBhCiAqICAgdmFsaWQgZW5jb2RlciBoYW5kbGUgYW5kIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgdG8gTlVMTC4KICogLSBJZiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZXJuYWwgYml0YnVmZmVyIGluIG91dEJ1ZkRlc2MgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHdyaXRpbmcgdGhlIHdob2xlIGJpdHN0cmVhbSwgYW4gaW50ZXJuYWwKICogICBlcnJvciB3aWxsIGJlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGEgcmVjb25maWd1cmF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkLgogKgogKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogKiBccGFyYW0gaW5CdWZEZXNjICAgICAgICAgICAgIElucHV0IGJ1ZmZlciBkZXNjcmlwdG9yLCBzZWUgQUFDRU5DX0J1ZkRlc2M6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBdCBsZWFzdCBvbmUgaW5wdXQgYnVmZmVyIHdpdGggYXVkaW8gZGF0YSBpcyBleHBlY3RlZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE9wdGlvbmFsbHkgYSBzZWNvbmQgaW5wdXQgYnVmZmVyIHdpdGggYW5jaWxsYXJ5IGRhdGEgY2FuIGJlIGZlZC4KICogXHBhcmFtIG91dEJ1ZkRlc2MgICAgICAgICAgICBPdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IsIHNlZSBBQUNFTkNfQnVmRGVzYzoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFByb3ZpZGUgb25lIG91dHB1dCBidWZmZXIgZm9yIHRoZSBlbmNvZGVkIGJpdHN0cmVhbS4KICogXHBhcmFtIGluYXJncyAgICAgICAgICAgICAgICBJbnB1dCBhcmd1bWVudHMsIHNlZSBBQUNFTkNfSW5BcmdzLgogKiBccGFyYW0gb3V0YXJncyAgICAgICAgICAgICAgIE91dHB1dCBhcmd1bWVudHMsIEFBQ0VOQ19PdXRBcmdzLgogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX0VOQ09ERV9FUlJPUiwgb24gZmFpbHVyZSBpbiBlbmNvZGluZyBwcm9jZXNzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgQUFDRU5DX0lOSVRfRVJST1IsIEFBQ0VOQ19JTklUX0FBQ19FUlJPUiwgQUFDRU5DX0lOSVRfU0JSX0VSUk9SLCBBQUNFTkNfSU5JVF9UUF9FUlJPUiwKICogICAgICAgICAgICBBQUNFTkNfSU5JVF9NRVRBX0VSUk9SLCBvbiBmYWlsdXJlIGluIGVuY29kZXIgaW5pdGlhbGl6YXRpb24uCiAqICAgICAgICAgIC0gQUFDRU5DX0VOQ09ERV9FT0YsIHdoZW4gZmx1c2hpbmcgZnVsbHkgY29uY2x1ZGVkLgogKi8KQUFDRU5DX0VSUk9SIGFhY0VuY0VuY29kZSgKICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAogICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAqaW5CdWZEZXNjLAogICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAqb3V0QnVmRGVzYywKICAgICAgICBjb25zdCBBQUNFTkNfSW5BcmdzICAgICAgKmluYXJncywKICAgICAgICBBQUNFTkNfT3V0QXJncyAgICAgICAgICAgKm91dGFyZ3MKICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgIEFjcXVpcmUgaW5mbyBhYm91dCBwcmVzZW50IGVuY29kZXIgaW5zdGFuY2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGluZm9ybWF0aW9uIG9mIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24uIEluIGFkZGl0aW9uIHRvIGluZm9ybWF0aXZlIGludGVybmFsIHN0YXRlcywKICogYSBjb25maWd1cmF0aW9uIGRhdGEgYmxvY2sgb2YgdGhlIGN1cnJlbnQgZW5jb2RlciBzZXR0aW5ncyB3aWxsIGJlIHJldHVybmVkLiBUaGUgZm9ybWF0IGlzIGVpdGhlciBBdWRpbyBTcGVjaWZpYyBDb25maWcKICogaW4gY2FzZSBvZiBSYXcgUGFja2V0cyB0cmFuc3BvcnQgZm9ybWF0IG9yIFN0cmVhbU11eENvbmZpZyBpbiBjYXNlIG9mIExPQVMvTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiBUaGUgY29uZmlndXJhdGlvbgogKiBkYXRhIGJsb2NrIGlzIGJpbmFyeSBjb2RlZCBhcyBzcGVjaWZpZWQgaW4gSVNPL0lFQyAxNDQ5Ni0zIChNUEVHLTQgYXVkaW8pLCB0byBiZSB1c2VkIGRpcmVjdGx5IGZvciBNUEVHLTQgRmlsZSBGb3JtYXQKICogb3IgUkZDMzAxNiBvciBSRkMzNjQwIGFwcGxpY2F0aW9ucy4KICoKICogXHBhcmFtIGhBYWNFbmNvZGVyICAgICAgICAgICBBIHZhbGlkIEFBQyBlbmNvZGVyIGhhbmRsZS4KICogXHBhcmFtIHBJbmZvICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIEFBQ0VOQ19JbmZvU3RydWN0LiBGaWxsZWQgb24gcmV0dXJuLgogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXMuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOSVRfRVJST1IsIG9uIGZhaWx1cmUuCiAqLwpBQUNFTkNfRVJST1IgYWFjRW5jSW5mbygKICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAogICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0ICAgICAgICAqcEluZm8KICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgIFNldCBvbmUgc2luZ2xlIEFBQyBlbmNvZGVyIHBhcmFtZXRlci4KICoKICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgY29uZmlndXJhdGlvbiBvZiBhbGwgZW5jb2RlciBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiA6OkFBQ0VOQ19QQVJBTS4gRWFjaCBwYXJhbWV0ZXIgbXVzdCBiZQogKiBzZXQgd2l0aCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGNhbGwuIEFuIGludGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmFuZ2Ugd2lsbCBiZSBkb25lIGFuZCBhbgogKiBpbnRlcm5hbCByZWNvbmZpZ3VyYXRpb24gd2lsbCBiZSBzaWduYWxlZC4gVGhlIGFjdHVhbCBjb25maWd1cmF0aW9uIGFkb3B0aW9uIGlzIHBhcnQgb2YgdGhlIHN1YnNlcXVlbnQgYWFjRW5jRW5jb2RlKCkgY2FsbC4KICoKICogXHBhcmFtIGhBYWNFbmNvZGVyICAgICAgICAgICBBIHZhbGlkIEFBQyBlbmNvZGVyIGhhbmRsZS4KICogXHBhcmFtIHBhcmFtICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdG8gYmUgc2V0LiBTZWUgOjpBQUNFTkNfUEFSQU0uCiAqIFxwYXJhbSB2YWx1ZSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHZhbHVlLiBTZWUgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIGluIDo6QUFDRU5DX1BBUkFNLgogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgogKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiwgQUFDRU5DX0lOVkFMSURfQ09ORklHLCBvbiBmYWlsdXJlLgogKi8KQUFDRU5DX0VSUk9SIGFhY0VuY29kZXJfU2V0UGFyYW0oCiAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gICAgICAgIHBhcmFtLAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgdmFsdWUKICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgIEdldCBvbmUgc2luZ2xlIEFBQyBlbmNvZGVyIHBhcmFtZXRlci4KICoKICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgY29tcGxlbWVudCB0byBhYWNFbmNvZGVyX1NldFBhcmFtKCkuIEFmdGVyIGVuY29kZXIgcmVpbml0aWFsaXphdGlvbiB3aXRoIHVzZXIgZGVmaW5lZCBzZXR0aW5ncywKICogdGhlIGludGVybmFsIHN0YXR1cyBjYW4gYmUgb2J0YWluZWQgb2YgZWFjaCBwYXJhbWV0ZXIsIHNwZWNpZmllZCB3aXRoIDo6QUFDRU5DX1BBUkFNLgogKgogKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogKiBccGFyYW0gcGFyYW0gICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0byBiZSByZXR1cm5lZC4gU2VlIDo6QUFDRU5DX1BBUkFNLgogKgogKiBccmV0dXJuICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHZhbHVlIG9mIHNwZWNpZmVkIHBhcmFtZXRlciA6OkFBQ0VOQ19QQVJBTS4KICovClVJTlQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgKICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAogICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSAgICAgICAgcGFyYW0KICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBlbmNvZGVyIGxpYnJhcnkgYnVpbGQuCiAqCiAqIEZpbGwgYSBnaXZlbiBMSUJfSU5GTyBzdHJ1Y3R1cmUgd2l0aCBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24uCiAqCiAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3QuCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCiAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KICovCkFBQ0VOQ19FUlJPUiBhYWNFbmNHZXRMaWJJbmZvKAogICAgICAgIExJQl9JTkZPICAgICAgICAgICAgICAgICAqaW5mbwogICAgICAgICk7CgoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgICAvKiBfQUFDX0VOQ19MSUJfSF8gKi8K