ZGlmZiAtLWdpdCBhL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9NYWtlZmlsZSBiL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIyMTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsNjMgQEAKK1BSRUZJWCAgID0gLi4vaW5zdGFsbAorQ1JPU1MgICAgPSBhcm0tbm9uZS1saW51eC0KK1JPT1QgICAgID0gJChQUkVGSVgpLyQoQ1JPU1M6JS09JSkKKworI0ZvciBZb2N0byB1c2UKKworUkZYX1RFU1RfQ0xJRU5UID0gZmFsc2UKK1JGWF9URVNUX0FPU1AgPSBmYWxzZQorCiskKHdhcm5pbmcgIyMjIyMjIyMjIyBsb2ctcmlsdGVsIEJCX1RFTEVGV0tfT1BUSU9OICQoQkJfVEVMRUZXS19PUFRJT04pICMjIyMjIyMjIyMpCisKKwkJICAgCisKK1NVQkRJUlMgKz0gIGxvZy1yaWx0ZWwKKworCisKKworCiskKHdhcm5pbmcgIyMjIyMjIyMjIyBsb2ctcmlsdGVsIFNVQkRJUlMgICQoU1VCRElSUykgIyMjIyMjIyMjIykKK2V4cG9ydCBTSU1fQ09VTlQ/PTEKKworLlBIT05ZOiBhbGwgYnVpbGQgY2xlYW4gcGFja19yb290ZnMKKworYWxsOiBidWlsZAorCitidWlsZDogY2xlYW4KKworY2xlYW46CisJJCh3YXJuaW5nICMjIyMjIyMjIyMgY2xlYW4gcmlsICMjIyMjIyMjIyMpCisJZm9yIGkgaW4gJChTVUJESVJTKTsgZG8JCQlcCisJCShjZCAkJGkgJiYgbWFrZSBjbGVhbik7CQkJXAorCQlpZiBbICQkPyAhPSAwIF07IHRoZW4JCVwKKwkJCWV4aXQgMTsJCQkJCVwKKwkJZmkJCQkJCQkJXAorCWRvbmUKKworYnVpbGQ6CisJJCh3YXJuaW5nICMjIyMjIyMjIyMgYnVpbGQgcmlsICMjIyMjIyMjIyMpCisJZm9yIGkgaW4gJChTVUJESVJTKTsgZG8JCQlcCisJCShjZCAkJGkgJiYgbWFrZSk7CQkJXAorCQlpZiBbICQkPyAhPSAwIF07IHRoZW4JCVwKKwkJCWV4aXQgMTsJCQkJCVwKKwkJZmkJCQkJCQkJXAorCWRvbmUKKworaW5zdGFsbDoKKwkkKHdhcm5pbmcgIyMjIyMjIyMjIyBpbnN0YWxsIHJpbCAjIyMjIyMjIyMjKQorCWZvciBpIGluICQoU1VCRElSUyk7IGRvCQkJXAorCQkoY2QgJCRpICYmIG1ha2UgaW5zdGFsbCk7CQkJXAorCQlpZiBbICQkPyAhPSAwIF07IHRoZW4JCVwKKwkJCWV4aXQgMTsJCQkJCVwKKwkJZmkJCQkJCQkJXAorCWRvbmUKKworcGFja19yb290ZnM6CisJJCh3YXJuaW5nICMjIyMjIyMjIyMgcGFja19yb290ZnMgcmlsICMjIyMjIyMjIyMpCisJZm9yIGkgaW4gJChTVUJESVJTKTsgZG8JCQlcCisJCShjZCAkJGkgJiYgbWFrZSBwYWNrX3Jvb3Rmcyk7CQkJXAorCQlpZiBbICQkPyAhPSAwIF07IHRoZW4JCVwKKwkJCWV4aXQgMTsJCQkJCVwKKwkJZmkJCQkJCQkJXAorCWRvbmUKZGlmZiAtLWdpdCBhL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9OT1RJQ0UgYi9zcmMvbHlucS9saWIvbGlibHlucS1sb2cvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbHlucS9saWIvbGlibHlucS1sb2cvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL1JFQURNRSBiL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3ZTgyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9SRUFETUUKQEAgLTAsMCArMSwxMyBAQAorV0hBVCBJVCBET0VTPworPT09PT09PT09PT09PQorTVRLIHJpbCBwcm94eSBjb3JlIGxpYnJhcnkKKworSE9XIElUIFdBUyBCVUlMVD8KKz09PT09PT09PT09PT09PT09PQorVGhpcyBtb2R1bGUgaXMgc291cmNlIGNvZGUgcmVsZWFzZWQuCisKK0hPVyBUTyBVU0UgSVQ/Cis9PT09PT09PT09PT09PQorTVRLIHJpbCBwcm94eSBkYWVtb24gd2lsbCB1c2UgdGhpcyBsaWJyYXJ5IHRvIGNvbW11bmljYXRlIHdpdGggR1NNIGFuZCBDMksgUklMRC4KKworQWxsIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIGZvbGRlciB3ZXJlIHdyaXR0ZW4gYnkgTWVkaWFUZWsgY28uLgpkaWZmIC0tZ2l0IGEvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2luY2x1ZGUvbGlibG9nL2xpYmxvZy5oIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2luY2x1ZGUvbGlibG9nL2xpYmxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzZlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbHlucS9saWIvbGlibHlucS1sb2cvaW5jbHVkZS9saWJsb2cvbGlibG9nLmgKQEAgLTAsMCArMSwxNDAgQEAKKyNpZm5kZWYgX19MSUJMT0dfSF9fCisjZGVmaW5lIF9fTElCTE9HX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisvL0xvZ+aooeWdl+aYr+WQpuS9v+iDvQorI2RlZmluZSBMT0dfRU5BQkxFICAgICAgICAgICAgICAxICAgICAgCisKKworI2lmIExPR19FTkFCTEUKKworI2RlZmluZSBFTkFCTEUoWCkgICAgICAgICAgICAgICAoMTw8KFgpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqVXNlciBjb25maWd1cmF0aW9uIHN0YXJ0KioqKioqKioqKioqKioqKioqKioqKioqKiovLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8KKwordHlwZWRlZiBlbnVtCit7CisJTE9HX1ZFUkJPU0UgPSAwLCAgIC8v5LuOMOW8gOWniyzoh6rooYzmt7vliqAKKwlMT0dfRVJST1IsICAKKwlMT0dfV0FSTklORywKKwlMT0dfSU5GTywKKwlMT0dfREVCVUcsICAKKwlMT0dfTEVWRUxfTUFYLy/kuI3lj6/liKDpmaQKK31sb2dfbGV2ZWxfZW51bTsKKwordHlwZWRlZiBlbnVtCit7CisgIExPR19PVEhFUlMgPSAwLCAgICAgICAgLy/ku44w5byA5aeLLOiHquihjOa3u+WKoAorICBMT0dfTVFUVCwKKyAgTE9HX1NQSSwKKyAgTE9HX1RIUkVBRFRFU1RfREJVUywKKyAgTE9HX1RIUkVBREhBTkRMRSwKKyAgTE9HX0hUVFAsCisgIExPR19GVFAsCisgIExPR19UQUdfTUFYLCAgICAgICAgICAgIC8v5LiN5Y+v5Yig6ZmkCit9IGxvZ190YWdfZW51bTsKKworCit0eXBlZGVmIHN0cnVjdAoreworCWNoYXIgb3Blbl9sb2dfbGV2ZWw7CisJY2hhciBvcGVuX21vZHVsZV9sb2dfbnVtOworCWNoYXIgb3Blbl9tb2R1bGVfbG9nW0xPR19UQUdfTUFYXTsKK31sb2dfbGV2ZWxfc3RyOworCisKKy8vTG9n562J57qn5YWo5bGA5L2/6IO9ICAgICAgICAgICAgICAgICBFTkFCTEUoTE9HX1ZFUkJPU0Up5re75Yqg5q2k5p2h5Lu25o6n5Yi25piv5ZCm5Y+q5omn6KGM5LyY5YWI57qn6auY55qE77ya5re75Yqg5YiZ5Li65Y+q6KaB5Zyo5qih5Z2X5YaF6LCD55So55qE6YO95omT5Y2w77yM5LiN5re75Yqg5YiZ5Li65omn6KGM5qih5Z2X5LyY5YWI57qn5pyA6auY55qECisjZGVmaW5lIExPR19MRVZFTF9FTkFCTEUgICAgICAJICBFTkFCTEUoTE9HX1ZFUkJPU0UpCisvLyNkZWZpbmUgTE9HX0xFVkVMX0VOQUJMRSAgICAgICAgRU5BQkxFKExPR19WRVJCT1NFKXxFTkFCTEUoTE9HX0RFQlVHKXxFTkFCTEUoTE9HX0lORk8pfEVOQUJMRShMT0dfV0FSTklORyl8RU5BQkxFKExPR19FUlJPUikKKworCisvL+agueaNrlRhZ+aemuS4vue0ouW8leaOkuW6jworc3RhdGljIHVuc2lnbmVkIGludCBMb2dUYWdFbmFibGVJbmZvVGFibGVbTE9HX1RBR19NQVhdID0KK3sgICAKKy8vICAgIEVOQUJMRShMT0dfVkVSQk9TRSl8RU5BQkxFKExPR19ERUJVRyl8RU5BQkxFKExPR19JTkZPKXxFTkFCTEUoTE9HX1dBUk5JTkcpfEVOQUJMRShMT0dfRVJST1IpLCAKKy8vCUVOQUJMRShMT0dfVkVSQk9TRSksCisvLwlFTkFCTEUoTE9HX1ZFUkJPU0UpLAorLy8JRU5BQkxFKExPR19XQVJOSU5HKSwKK307CisKK2NvbnN0IHN0YXRpYyBjaGFyICogTG9nVGFnTmFtZUluZm9UYWJsZVtMT0dfVEFHX01BWF0gPQoreworICAgICJPVEhFUlMiLFwKKyAgICAiTVFUVCIsXAorICAgICJTUEkiLFwKKyAgICAiVEhSRUFEVEVTVF9EQlVTIixcCisgICAgIlRIUkVBREhBTkRMRSIsXAorICAgICJIVFRQIixcCisgICAgIkZUUCIsCit9OworCitjb25zdCBzdGF0aWMgY2hhciAqIExvZ0xldmVsTmFtZUluZm9UYWJsZVtMT0dfTEVWRUxfTUFYXSA9Cit7CisgICAgIltWRVJCT1NFXSIsIltFUlJPUl0iLCJbV0FSTklOR10iLCJbSU5GT10iLCJbREVCVUddIiAvL2x0IGFkZCBAMjAyMS43LjIyIGZvciBbXQorfTsKKworI2VuZGlmIC8vTE9HX0VOQUJMRQorCit2b2lkIGx5bnFfbG9nX2dsb2JhbF9vdXRwdXQobG9nX2xldmVsX2VudW0gTGV2ZWwsY29uc3QgY2hhciAqZm9ybWF0LC4uLik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uIG5hbWU6CQlseW5xX2xvZ19vdXRwdXQKKyoqIERlc2NyaXB0aW9uCQkJbHlucV9sb2dfb3V0cHV0CisqKiBJbnB1dCBwYXJhbWV0ZXJzOiAgICBUYWc6VGFn57G75Z6LKGxvZ19sZXZlbF9lbnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWw6VGFn5LiL5omT5Y2wbGV2ZWwobG9nX3RhZ19lbnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OnByaW50ZuaJk+WNsOeahOS4jeWumumVv+WPguaVsAorKiogUmV0dXJuZWQgdmFsdWU6CQlOb25lCisqKiBDcmVhdGVkIGJ5OgkJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGx5bnFfbG9nX291dHB1dChsb2dfdGFnX2VudW0gVGFnLGxvZ19sZXZlbF9lbnVtIExldmVsLGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiBuYW1lOgkJbHlucV91cGRhdGVfbG9nX291dHB1dAorKiogRGVzY3JpcHRpb24JCQnDlsOYw5DDgsK7w7HDiMKhbG9nwrXDiMK8wrbCssKiw4rCucOGw6TDicO6w5DCpworKiogSW5wdXQgcGFyYW1ldGVyczogICAgVGFnOlRhZ8OAw6DDkMONKGxvZ19sZXZlbF9lbnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWw6VGFnw4/DgsK0w7LDk8KhbGV2ZWwobG9nX3RhZ19lbnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OnByaW50ZsK0w7LDk8KhwrXDhMKywrvCtsKowrPCpMKyw47DisO9CisqKiBSZXR1cm5lZCB2YWx1ZToJCU5vbmUKKyoqIENyZWF0ZWQgYnk6CQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBseW5xX3VwZGF0ZV9sb2dfb3V0cHV0KGxvZ190YWdfZW51bSBUYWcsbG9nX2xldmVsX2VudW0gTGV2ZWwsY29uc3QgY2hhciAqZm9ybWF0LC4uLik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uIG5hbWU6CQlseW5xX2ZnZXRfbG9nX2xldmVsCisqKiBEZXNjcmlwdGlvbgkJCeivu+WPluaXpeW/l+mFjee9ruS/oeaBrworKiogSW5wdXQgcGFyYW1ldGVyczogICAgb3Blbl9sb2dfbGV2ZWw65byA5ZCvbG9n5pel5b+X562J57qnCisgICAgICAgICAgICAgICAgICAgICAgICBvcGVuX21vZHVsZV9sb2dfbnVtOuW8gOWQr+aXpeW/l+aooeWdl+eahOS4quaVsAorCQkJCQkJb3Blbl9tb2R1bGVfbG9nOuW8gOWQr+aXpeWtkOacjeWKoeeahOaooeWdlyAgICAgICAgICAgICAgICAgCisqKiBSZXR1cm5lZCB2YWx1ZToJCTDvvJrmiJDlip/vvIwtMe+8muWksei0pQorKiogQ3JlYXRlZCBieToJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbHlucV9yZWFkX3N0b3JlX2xvZ19kZXBsb3kobG9nX2xldmVsX3N0ciAqbG9nX2xldmVsX3JlYWRfbGV2ZWxfc3RyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gbmFtZToJCWx5bnFfZW5hYmxlX2xvZ19zZXJ2ZQorKiogRGVzY3JpcHRpb24JCQnkvb/og73ml6Xlv5fmnI3liqEKKyoqIElucHV0IHBhcmFtZXRlcnM6ICAgIE5vbmUgICAgICAgICAgICAgICAgCisqKiBSZXR1cm5lZCB2YWx1ZToJCU5vbmUKKyoqIENyZWF0ZWQgYnk6CQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBseW5xX2xvZ19wcmludGZfb3V0cHV0KGxvZ190YWdfZW51bSBUYWcsbG9nX2xldmVsX2VudW0gTGV2ZWwsY29uc3QgY2hhciAqZm9ybWF0LC4uLik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgbHlucV9sb2dfY29uZmlndXJhdGlvbl9zZXQoY2hhciAqbG9nX25hbWUsY2hhciBsb2dfZGF0YV9hcnIpOwordm9pZCBseW5xX2xvZ19jb25maWd1cmF0aW9uX2luaXQoY2hhciAqbG9nX25hbWUpOworCit2b2lkIGx5bnFfc3RvcmVfbG9nX3Rlc3Qodm9pZCk7Cit2b2lkIGx5bnFfcmVhZF9zZXRfbG9nX3Rlc3Qodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLy9fX0xPR19IX18KZGlmZiAtLWdpdCBhL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9pbmNsdWRlL2xpYmxvZy9seW5xX2RlZmxvZy5oIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2luY2x1ZGUvbGlibG9nL2x5bnFfZGVmbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4ODAwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9pbmNsdWRlL2xpYmxvZy9seW5xX2RlZmxvZy5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX19MWU5RX0RFRkxPR19IX18NCisjZGVmaW5lIF9fTFlOUV9ERUZMT0dfSF9fDQorI2luY2x1ZGUgImxpYmxvZy5oIg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYNCisNCisjaWZuZGVmIFVTRVJfTE9HX1RBRyANCisjZGVmaW5lIExZVkVSQkxPRyhYLi4uKSAgbHlucV9sb2dfZ2xvYmFsX291dHB1dChMT0dfVkVSQk9TRSxYKQ0KKyNkZWZpbmUgTFlFUlJMT0coWC4uLikgIGx5bnFfbG9nX2dsb2JhbF9vdXRwdXQoTE9HX0VSUk9SLFgpDQorI2RlZmluZSBMWVdBUk5MT0coWC4uLikgIGx5bnFfbG9nX2dsb2JhbF9vdXRwdXQoTE9HX1dBUk5JTkcsWCkNCisjZGVmaW5lIExZSU5GTE9HKFguLi4pICBseW5xX2xvZ19nbG9iYWxfb3V0cHV0KExPR19JTkZPLFgpDQorI2RlZmluZSBMWURCR0xPRyhYLi4uKSAgbHlucV9sb2dfZ2xvYmFsX291dHB1dChMT0dfREVCVUcsWCkNCisjZGVmaW5lIExZTE9HU0VUKGEpIGx5bnFfbG9nX2NvbmZpZ3VyYXRpb25fc2V0KFVTRVJfTE9HX1RBRyxhKQ0KKyNkZWZpbmUgTFlMT0dFSU5JVChZKSBseW5xX2xvZ19jb25maWd1cmF0aW9uX2luaXQoWSkNCisjZWxzZQ0KKyNkZWZpbmUgTFlWRVJCTE9HKFguLi4pICANCisjZGVmaW5lIExZRVJSTE9HKFguLi4pICANCisjZGVmaW5lIExZV0FSTkxPRyhYLi4uKSAgDQorI2RlZmluZSBMWUlORkxPRyhYLi4uKSAgDQorI2RlZmluZSBMWURCR0xPRyhYLi4uKSAgDQorI2RlZmluZSBMWUxPR1NFVChhKQ0KKyNkZWZpbmUgTFlMT0dFSU5JVChZKQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmDQorDQorI2VuZGlmICAvL19fTFlOUV9ERUZMT0dfSF9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2luY2x1ZGUvbGlibG9nL2x5bnFfbmFuZC5oIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2luY2x1ZGUvbGlibG9nL2x5bnFfbmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWYzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbHlucS9saWIvbGlibHlucS1sb2cvaW5jbHVkZS9saWJsb2cvbHlucV9uYW5kLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfX0xZTlFfTkFORF9IX18NCisjZGVmaW5lIF9fTFlOUV9OQU5EX0hfXw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKw0KKw0KK2ludCBseW5xX25hbmRfc3RvcmVfbG9nX21lc3NhZ2UoY2hhciAqbG9nX21lc3NhZ2Usc2l6ZV90IGxvZ19tZXNzYWdlX2xlbik7DQoraW50IGx5bnFfbmFuZF9nZXRfbG9nX21lc3NhZ2UoY2hhciAqbG9nX21lc3NhZ2Usc2l6ZV90IGxvZ19tZXNzYWdlX2xlbixvZmZfdCBvZmZzZXQpOw0KK2ludCBseW5xX25hbmRfcmVhZF9kYXRhX3Rlc3Qodm9pZCk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKl9fTFlOUV9OQU5EX0hfXyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2xvZy1yaWx0ZWwvbG9nLmMgYi9zcmMvbHlucS9saWIvbGlibHlucS1sb2cvbG9nLXJpbHRlbC9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA2NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2xvZy1yaWx0ZWwvbG9nLmMKQEAgLTAsMCArMSw0ODkgQEAKKyNpbmNsdWRlICJsaWJsb2cuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKwordm9pZCBoZXh0b3N0cmluZyh1bnNpZ25lZCBjaGFyIHZhbCwgY2hhciAqYnVmKTsKKworI2RlZmluZSBMT0dfTkFNRV9MRU4gMTI4CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nX2xldmVsID0gMDsgLy9sb2e1yLy2o6zQ6NKqv6q3osjL1LG2r8ysxeTWw2xvZ7XIvLajrMSsyM+1yLy2zqowCitzdGF0aWMgdW5zaWduZWQgY2hhciBsb2dfbmFtZV9hcnJbTE9HX05BTUVfTEVOXSA9IHswfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uIG5hbWU6CQlseW5xX2xvZ19vdXRwdXQKKyoqIERlc2NyaXB0aW9uCQkJbHlucV9sb2dfb3V0cHV0CisqKiBJbnB1dCBwYXJhbWV0ZXJzOiAgICBUYWc6VGFnwODQzShsb2dfbGV2ZWxfZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsOlRhZ8/CtPLToWxldmVsKGxvZ190YWdfZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpwcmludGa08tOhtcSyu7aos6Syzsr9CisqKiBSZXR1cm5lZCB2YWx1ZToJCU5vbmUKKyoqIENyZWF0ZWQgYnk6CQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBseW5xX2xvZ19vdXRwdXQobG9nX3RhZ19lbnVtIFRhZyxsb2dfbGV2ZWxfZW51bSBMZXZlbCxjb25zdCBjaGFyICpmb3JtYXQsLi4uKQoreworI2lmIExPR19FTkFCTEUKKyAgICBpZigoVGFnID49IExPR19UQUdfTUFYKXx8KExldmVsID49ICBMT0dfTEVWRUxfTUFYKSkKKyAgICAgICAgcmV0dXJuOworLy8JcHJpbnRmKCJtbzolZC0tLWxlOiVkLS0tTGV2ZWw6JWRcbiIsTG9nVGFnRW5hYmxlSW5mb1RhYmxlW1RhZ10sbG9nX2xldmVsLExldmVsKTsKKy8vCXByaW50Zigicm1vZHVsZTolZC0tLXJsZXZlbDolZFxuIiwoKExvZ1RhZ0VuYWJsZUluZm9UYWJsZVtUYWddID4+IExldmVsKSYweDAwMDAwMDAxKSwoKGxvZ19sZXZlbCA+PiBMZXZlbCkmMHgwMDAwMDAwMSkpOworICAgIGlmKCgoTG9nVGFnRW5hYmxlSW5mb1RhYmxlW1RhZ10gPj4gTGV2ZWwpJjB4MDAwMDAwMDEpJigobG9nX2xldmVsID4+IExldmVsKSYweDAwMDAwMDAxKSkKKyAgICB7CisgICAgICAgIHZhX2xpc3QgYXJnczsKKworICAgICAgICAvL1RhZ05hbWUKKyAgICAgICAgcHJpbnRmKCJbJXNdIixMb2dUYWdOYW1lSW5mb1RhYmxlW1RhZ10pOworCisgICAgICAgIC8vTGV2ZWxOYW1lCisgICAgICAgIHByaW50ZigiWyVzXToiLExvZ0xldmVsTmFtZUluZm9UYWJsZVtMZXZlbF0pOworCisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsZm9ybWF0KTsKKyAgICAgICAgdnByaW50Zihmb3JtYXQsYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICB9CisJcmV0dXJuIDsKKyNlbmRpZiAvL0xPR19FTkFCTEUKK30KKworCit2b2lkIGx5bnFfbG9nX2dsb2JhbF9vdXRwdXQobG9nX2xldmVsX2VudW0gTGV2ZWwsY29uc3QgY2hhciAqZm9ybWF0LC4uLikKK3sKKyNpZiBMT0dfRU5BQkxFCisKKyAgICBjaGFyIG91dF9idWZbMTEwMF0gPSB7MH07ICAgIAorICAgIGNoYXIgYnVmWzEwMjRdID0gezB9OworCQorICAgIGlmKExldmVsID49ICBMT0dfTEVWRUxfTUFYKQorICAgICAgICByZXR1cm47CisgICAgaWYoKGxvZ19sZXZlbCA+PiBMZXZlbCkmMHgwMDAwMDAwMSkKKyAgICB7CisgICAgICAgIHZhX2xpc3QgYXJnczsKKworICAgICAgICAvL1RhZ05hbWUKKyAgICAgICAgaWYobG9nX25hbWVfYXJyWzBdICA+IDApCisgICAgICAgIHsKKwkJcHJpbnRmKCJbJXNdIixsb2dfbmFtZV9hcnIpOworCSB9CisgICAgICAgIAorICAgICAgICAvL0xldmVsTmFtZQorICAgICAgICBwcmludGYoIiVzOiIsTG9nTGV2ZWxOYW1lSW5mb1RhYmxlW0xldmVsXSk7IC8vbHQgZGVsZSBAMjAyMS43LjIyIGZvciBbXQorCisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsZm9ybWF0KTsKKyAgICAgICAgdnByaW50Zihmb3JtYXQsYXJncyk7CisJIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGFyZ3MpOyAgLy9sdCBhZGQgQDIwMjEuNy4yMiBmb3Igd3JpdGUgYnVmCisgICAgICAgIHZhX2VuZChhcmdzKTsKKwlwcmludGYoIlxyXG4iKTsKKworCXNwcmludGYob3V0X2J1ZiwgIiVzICVzIiwgTG9nTGV2ZWxOYW1lSW5mb1RhYmxlW0xldmVsXSwgYnVmKTsvL2x0IGFkZCBAMjAyMS43LjIyIGZvciB3cml0ZSBvdXRidWYKKwlfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLGxvZ19uYW1lX2FyciwgIiVzIixvdXRfYnVmKTsgLy9sdCBhZGQgQDIwMjEuNy4yMiBmb3Igd3JpdGUgc3lzbG9nLmxvZworICAgIH0KKwlyZXR1cm4gOworI2VuZGlmIC8vTE9HX0VOQUJMRQorfQorCisKKwordm9pZCBseW5xX2xvZ19jb25maWd1cmF0aW9uX3NldChjaGFyICpsb2dfbmFtZSxjaGFyIGxvZ19kYXRhX2FycikKK3sKKwljaGFyIGxvZ19kYXRhX2J1ZltMT0dfTkFNRV9MRU5dID0geyJwZXJzaXN0LiJ9OworCWNoYXIgbG9nX2RhdGFfc3RyWzMyXSA9IHswfTsKKwlpZihsb2dfbmFtZSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIDsKKwl9CisJaWYobG9nX2RhdGFfYXJyIDwgTE9HX0xFVkVMX01BWCkKKwl7CisJCXNwcmludGYobG9nX2RhdGFfc3RyLCIlZCIsbG9nX2RhdGFfYXJyKTsKKy8vCQlwcmludGYoImxvZ19kYXRhX3N0cjolc1xuIixsb2dfZGF0YV9zdHIpOworCQlpZigoc3RybGVuKGxvZ19uYW1lKSkgPCAoTE9HX05BTUVfTEVOIC0gOSkpCisJCXsKKwkJCXN0cmNhdChsb2dfZGF0YV9idWYsbG9nX25hbWUpOworCQkJcHJvcGVydHlfc2V0KGxvZ19kYXRhX2J1Zixsb2dfZGF0YV9zdHIpOworCQl9CisJfQorCWx5bnFfbG9nX2NvbmZpZ3VyYXRpb25faW5pdChsb2dfbmFtZSk7Cit9CisKK3ZvaWQgbHlucV9kZWFsX3dpdGhfbGV2ZWwodW5zaWduZWQgaW50IGdldF9sb2dfbGV2ZWwpCit7CisJc3dpdGNoKGdldF9sb2dfbGV2ZWwpCisJeworCQljYXNlIExPR19ERUJVRzoKKwkJbG9nX2xldmVsIHw9IEVOQUJMRShMT0dfREVCVUcpOworCQljYXNlIExPR19JTkZPOgorCQlsb2dfbGV2ZWwgfD0gRU5BQkxFKExPR19JTkZPKTsKKwkJY2FzZSBMT0dfV0FSTklORzoKKwkJbG9nX2xldmVsIHw9IEVOQUJMRShMT0dfV0FSTklORyk7CisJCWNhc2UgTE9HX0VSUk9SOgorCQlsb2dfbGV2ZWwgfD0gRU5BQkxFKExPR19FUlJPUik7CisJCWNhc2UgTE9HX1ZFUkJPU0U6CisJCWxvZ19sZXZlbCB8PSBFTkFCTEUoTE9HX1ZFUkJPU0UpOworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJbG9nX2xldmVsIHw9IEVOQUJMRShMT0dfVkVSQk9TRSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBseW5xX2xvZ19jb25maWd1cmF0aW9uX2luaXQoY2hhciAqbG9nX25hbWUpCit7CisJY2hhciBsb2dfZGF0YV9idWZbTE9HX05BTUVfTEVOXSA9IHsicGVyc2lzdC4ifTsKKwljaGFyIGdldF9wcm9wdHlfbG9nX2RhdGFbMzJdID17MH07CisJdW5zaWduZWQgaW50IGdldF9sb2dfbGV2ZWwgPSAwOworCisJaWYobG9nX25hbWUgPT0gTlVMTCkKKwl7CisJCXJldHVybiA7CisJfQorCWlmKChzdHJsZW4obG9nX25hbWUpKSA8IChMT0dfTkFNRV9MRU4gLSA5KSkKKwl7CisJCXN0cmNweShsb2dfbmFtZV9hcnIsbG9nX25hbWUpOworCQlzdHJjYXQobG9nX2RhdGFfYnVmLGxvZ19uYW1lKTsKKwkJaWYocHJvcGVydHlfZ2V0KGxvZ19kYXRhX2J1ZiwoY2hhciAqKWdldF9wcm9wdHlfbG9nX2RhdGEsTlVMTCkgPiAwKSAKKwkJeworCQkJZ2V0X2xvZ19sZXZlbCA9IGF0b2koZ2V0X3Byb3B0eV9sb2dfZGF0YSk7CisvLwkJCXByaW50ZigiZ2V0X2xvZ19sZXZlbDolZFxuIixnZXRfbG9nX2xldmVsKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvZ19sZXZlbCA9IDA7CisvLwkJCXByaW50ZigiZ2V0IHByb3B0eSBkYXRhIGZhaWxcbiIpOworCQl9CisJCQorCX0KKwlseW5xX2RlYWxfd2l0aF9sZXZlbChnZXRfbG9nX2xldmVsKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiBuYW1lOgkJbHlucV91cGRhdGVfbG9nX291dHB1dAorKiogRGVzY3JpcHRpb24JCQnW2NDCu/HIoWxvZ7XIvLayosq5xuTJ+tCnCisqKiBJbnB1dCBwYXJhbWV0ZXJzOiAgICBUYWc6VGFnwODQzShsb2dfbGV2ZWxfZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsOlRhZ8/CtPLToWxldmVsKGxvZ190YWdfZW51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpwcmludGa08tOhtcSyu7aos6Syzsr9CisqKiBSZXR1cm5lZCB2YWx1ZToJCU5vbmUKKyoqIENyZWF0ZWQgYnk6CQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBseW5xX3VwZGF0ZV9sb2dfb3V0cHV0KGxvZ190YWdfZW51bSBUYWcsbG9nX2xldmVsX2VudW0gTGV2ZWwsY29uc3QgY2hhciAqZm9ybWF0LC4uLikKK3sKKyNpZiBMT0dfRU5BQkxFCisJbHlucV9lbmFibGVfbG9nX3NlcnZlKCk7CisgICAgaWYoKFRhZyA+PSBMT0dfVEFHX01BWCl8fChMZXZlbCA+PSAgTE9HX0xFVkVMX01BWCkpCisgICAgICAgIHJldHVybjsKKy8vCXByaW50ZigibW86JWQtLS1sZTolZC0tLUxldmVsOiVkXG4iLExvZ1RhZ0VuYWJsZUluZm9UYWJsZVtUYWddLGxvZ19sZXZlbCxMZXZlbCk7CisvLwlwcmludGYoInJtb2R1bGU6JWQtLS1ybGV2ZWw6JWRcbiIsKChMb2dUYWdFbmFibGVJbmZvVGFibGVbVGFnXSA+PiBMZXZlbCkmMHgwMDAwMDAwMSksKChsb2dfbGV2ZWwgPj4gTGV2ZWwpJjB4MDAwMDAwMDEpKTsKKyAgICBpZigoKExvZ1RhZ0VuYWJsZUluZm9UYWJsZVtUYWddID4+IExldmVsKSYweDAwMDAwMDAxKSYoKGxvZ19sZXZlbCA+PiBMZXZlbCkmMHgwMDAwMDAwMSkpCisgICAgeworICAgICAgICB2YV9saXN0IGFyZ3M7CisKKyAgICAgICAgLy9UYWdOYW1lCisgICAgICAgIHByaW50ZigiWyVzXSIsTG9nVGFnTmFtZUluZm9UYWJsZVtUYWddKTsKKworICAgICAgICAvL0xldmVsTmFtZQorICAgICAgICBwcmludGYoIlslc106IixMb2dMZXZlbE5hbWVJbmZvVGFibGVbTGV2ZWxdKTsKKworICAgICAgICB2YV9zdGFydChhcmdzLGZvcm1hdCk7CisgICAgICAgIHZwcmludGYoZm9ybWF0LGFyZ3MpOworICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgfQorCXJldHVybiA7CisjZW5kaWYgLy9MT0dfRU5BQkxFCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gbmFtZToJCWx5bnFfbG9nX3ByaW50Zl9vdXRwdXQKKyoqIERlc2NyaXB0aW9uCQkJt+LXsHByaW50ZgorKiogSW5wdXQgcGFyYW1ldGVyczogICAgVGFnOlRhZ8Dg0M0obG9nX2xldmVsX2VudW0pCisgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbDpUYWfPwrTy06FsZXZlbChsb2dfdGFnX2VudW0pCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6cHJpbnRmtPLTobXEsru2qLOkss7K/QorKiogUmV0dXJuZWQgdmFsdWU6CQlOb25lCisqKiBDcmVhdGVkIGJ5OgkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbHlucV9sb2dfcHJpbnRmX291dHB1dChsb2dfdGFnX2VudW0gVGFnLGxvZ19sZXZlbF9lbnVtIExldmVsLGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCit7CisjaWYgTE9HX0VOQUJMRQorICAgIGlmKChUYWcgPj0gTE9HX1RBR19NQVgpfHwoTGV2ZWwgPj0gIExPR19MRVZFTF9NQVgpKQorICAgICAgICByZXR1cm47CisKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICAvL1RhZ05hbWUKKyAgICBwcmludGYoIlslc10iLExvZ1RhZ05hbWVJbmZvVGFibGVbVGFnXSk7CisKKyAgICAvL0xldmVsTmFtZQorICAgIHByaW50ZigiWyVzXToiLExvZ0xldmVsTmFtZUluZm9UYWJsZVtMZXZlbF0pOworCisgICAgdmFfc3RhcnQoYXJncyxmb3JtYXQpOworICAgIHZwcmludGYoZm9ybWF0LGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIHJldHVybiA7CisjZW5kaWYgLy9MT0dfRU5BQkxFCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uIG5hbWU6CQlseW5xX2ZnZXRfbG9nX2xldmVsCisqKiBEZXNjcmlwdGlvbgkJCb+qxvRsb2fI1da+tci8tgorKiogSW5wdXQgcGFyYW1ldGVyczogICAgb3Blbl9sb2dfbGV2ZWw6v6rG9GxvZ8jV1r61yLy2CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVuX21vZHVsZV9sb2dfbnVtOr+qxvTI1da+xKO/6bXEuPbK/QorCQkJCQkJb3Blbl9tb2R1bGVfbG9nOr+qxvTI1dfTt/7O8bXExKO/6SAgICAgICAgICAgICAgICAgCisqKiBSZXR1cm5lZCB2YWx1ZToJCU5vbmUKKyoqIENyZWF0ZWQgYnk6CQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBseW5xX2ZnZXRfbG9nX2xldmVsKGxvZ19sZXZlbF9zdHIgbGV2ZWxfc3RyKQoreworCWxvZ19sZXZlbCA9IDA7CisJc3dpdGNoKGxldmVsX3N0ci5vcGVuX2xvZ19sZXZlbCkKKwl7CisJCWNhc2UgTE9HX0RFQlVHOgorCQlsb2dfbGV2ZWwgfD0gRU5BQkxFKExPR19ERUJVRyk7CisJCWNhc2UgTE9HX0lORk86CisJCWxvZ19sZXZlbCB8PSBFTkFCTEUoTE9HX0lORk8pOworCQljYXNlIExPR19XQVJOSU5HOgorCQlsb2dfbGV2ZWwgfD0gRU5BQkxFKExPR19XQVJOSU5HKTsKKwkJY2FzZSBMT0dfRVJST1I6CisJCWxvZ19sZXZlbCB8PSBFTkFCTEUoTE9HX0VSUk9SKTsKKwkJY2FzZSBMT0dfVkVSQk9TRToKKwkJbG9nX2xldmVsIHw9IEVOQUJMRShMT0dfVkVSQk9TRSk7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQlsb2dfbGV2ZWwgfD0gRU5BQkxFKExPR19WRVJCT1NFKTsKKwkJYnJlYWs7CisJfQorCQorCWZvcihpbnQgaSA9IDA7IGkgPCBsZXZlbF9zdHIub3Blbl9tb2R1bGVfbG9nX251bTsgaSsrKQorCXsKKwkJTG9nVGFnRW5hYmxlSW5mb1RhYmxlW2xldmVsX3N0ci5vcGVuX21vZHVsZV9sb2dbaV1dID0gRU5BQkxFKExPR19WRVJCT1NFKXxFTkFCTEUoTE9HX0RFQlVHKXxFTkFCTEUoTE9HX0lORk8pfEVOQUJMRShMT0dfV0FSTklORyl8RU5BQkxFKExPR19FUlJPUik7CisJfQkKKwlyZXR1cm4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiBuYW1lOgkJbHlucV9zdG9yZV9sb2dfZGVwbG95CisqKiBEZXNjcmlwdGlvbgkJCbGjtObI1da+xeTWw9DFz6IKKyoqIElucHV0IHBhcmFtZXRlcnM6ICAgIG9wZW5fbG9nX2xldmVsOr+qxvRsb2fI1da+tci8tgorICAgICAgICAgICAgICAgICAgICAgICAgb3Blbl9tb2R1bGVfbG9nX251bTq/qsb0yNXWvsSjv+m1xLj2yv0KKwkJCQkJCW9wZW5fbW9kdWxlX2xvZzq/qsb0yNXX07f+zvG1xMSjv+kgICAgICAgICAgICAgICAgIAorKiogUmV0dXJuZWQgdmFsdWU6CQlOb25lCisqKiBDcmVhdGVkIGJ5OgkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbHlucV9zdG9yZV9sb2dfZGVwbG95KGxvZ19sZXZlbF9zdHIgKmxvZ19sZXZlbF93cml0ZV9sZXZlbF9zdHIpCit7CisJY2hhciAqbG9nX2xldmVsX3dyaXRlZmlsZSA9ICJwZXJzaXN0LnN0b3JlX2xvZ19sZXZlbCI7CisJY2hhciBzdG9yZV9sb2dfc3RyX2J1Zls1MTJdID0gezB9OworCQorCXN0b3JlX2xvZ19zdHJfYnVmWzBdID0gJysnOworCWhleHRvc3RyaW5nKGxvZ19sZXZlbF93cml0ZV9sZXZlbF9zdHItPm9wZW5fbG9nX2xldmVsLCZzdG9yZV9sb2dfc3RyX2J1ZlsxXSk7CisJaGV4dG9zdHJpbmcobG9nX2xldmVsX3dyaXRlX2xldmVsX3N0ci0+b3Blbl9tb2R1bGVfbG9nX251bSwmc3RvcmVfbG9nX3N0cl9idWZbM10pOworCWZvcihpbnQgaSA9IDA7IGkgPCBsb2dfbGV2ZWxfd3JpdGVfbGV2ZWxfc3RyLT5vcGVuX21vZHVsZV9sb2dfbnVtOyBpKyspCisJeworCQloZXh0b3N0cmluZyhsb2dfbGV2ZWxfd3JpdGVfbGV2ZWxfc3RyLT5vcGVuX21vZHVsZV9sb2dbaV0sJnN0b3JlX2xvZ19zdHJfYnVmWzUraSoyXSk7CisJfQorCQorCXByb3BlcnR5X3NldChsb2dfbGV2ZWxfd3JpdGVmaWxlLChjaGFyICopc3RvcmVfbG9nX3N0cl9idWYpOwkKKwlyZXR1cm4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiBuYW1lOgkJbHlucV9mZ2V0X2xvZ19sZXZlbAorKiogRGVzY3JpcHRpb24JCQm2wcihyNXWvsXk1sPQxc+iCisqKiBJbnB1dCBwYXJhbWV0ZXJzOiAgICBvcGVuX2xvZ19sZXZlbDq/qsb0bG9nyNXWvrXIvLYKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5fbW9kdWxlX2xvZ19udW06v6rG9MjV1r7Eo7/ptcS49sr9CisJCQkJCQlvcGVuX21vZHVsZV9sb2c6v6rG9MjV19O3/s7xtcTEo7/pICAgICAgICAgICAgICAgICAKKyoqIFJldHVybmVkIHZhbHVlOgkJMKO6s8m5pqOsLTGjusqnsNwKKyoqIENyZWF0ZWQgYnk6CQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGx5bnFfcmVhZF9zdG9yZV9sb2dfZGVwbG95KGxvZ19sZXZlbF9zdHIgKmxvZ19sZXZlbF9yZWFkX2xldmVsX3N0cikKK3sKKwljaGFyICpsb2dfbGV2ZWxfcmVhZGZpbGUgPSAicGVyc2lzdC5zdG9yZV9sb2dfbGV2ZWwiOworCisJaWYocHJvcGVydHlfZ2V0KGxvZ19sZXZlbF9yZWFkZmlsZSwoY2hhciAqKWxvZ19sZXZlbF9yZWFkX2xldmVsX3N0cixOVUxMKSA+IDApIAorICAgIHsKKy8vCQlwcmludGYoInJlYWQgbG9nIGxldmVsIGRlcGxveSBzdWNjZXNzISEhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwl7CisvLwkJcHJpbnRmKCJnZXQgZmlsZSBlcnJvciEhIVxuIik7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK2ludCBpdG9hKGludCB2YWwsIGNoYXIgKmJ1ZixpbnQgc2l6ZSkgLy8xNr341sbXqru7s8nX1rf7tK4KK3sKKyAgICBjaGFyICpwID0gYnVmOworICAgIGNoYXIgdCA9ICcwJzsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBpbnQgc2xlbiA9IHNpemU7CisgICAgd2hpbGUodmFsID4gMCAmJiBsZW4gPCBzbGVuKSB7CisgICAgICAgIHQgPSB2YWwgJSAxNjsKKyAgICAgICAgdmFsIC09IHQ7CisgICAgICAgIHZhbCAvPSAxNjsKKyAgICAgICAgaWYgKHQgPiA5KSB7CisgICAgICAgICAgICAqcCsrID0gdC0gMTAgKyAnYSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcCsrID0gdCArICcwJzsKKyAgICAgICAgfQorICAgICAgICArK2xlbjsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7aSA8IGxlbi8yOysraSkgeworICAgICAgICBjaGFyIGMgPSBidWZbaV07CisgICAgICAgIGJ1ZltpXSA9IGJ1ZltsZW4tMS1pXTsKKyAgICAgICAgYnVmW2xlbi0xLWldID0gYzsKKyAgICB9CisgICAgYnVmW2xlbl0gPSAnXDAnOworICAgIHJldHVybiBsZW47Cit9CisKK3ZvaWQgaGV4dG9zdHJpbmcodW5zaWduZWQgY2hhciB2YWwsIGNoYXIgKmJ1ZikKK3sKKwljaGFyIHN0cmJ1Zls2NF0gPSB7MH07CisJaXRvYSh2YWwsc3RyYnVmLDIpOworCW1lbWNweShidWYsc3RyYnVmLDMpOworCWlmKCh2YWwgPj0gMCkgJiYgKHZhbCA8PSAxNSkpCisJeworCQlidWZbMF0gPSAnMCc7CisJCWJ1ZlsxXSA9IHN0cmJ1ZlswXTsKKwkJYnVmWzJdID0gJ1wwJzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcG93cyhpbnQgeCwgaW50IHkpCit7CisJaW50IHJlc3VsdCA9IDE7CisKKwl3aGlsZSAoeS0tKQorCQlyZXN1bHQgKj0geDsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgc3RyaW5nMmhleChjb25zdCBjaGFyICpidWZmZXIsIGludCBjbnQpCit7CisJaW50IGMgPSAwOworCWNoYXIgdCA9IDA7CisJaW50IGNvdW50ID0gY250OworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJdCA9ICooYnVmZmVyICsgY250IC0gY291bnQgLSAxKTsKKwkJaWYgKHQgPj0gJ0EnICYmIHQgPD0gJ0YnKQorCQkJYyArPSAoKHQgLSAnQScpICsgMTApICogcG93cygxNiwgY291bnQpOworCQkJZWxzZSBpZiAodCA+PSAnYScgJiYgdCA8PSAnZicpCQkKKwkJCWMgKz0gKCh0IC0gJ2EnKSArIDEwKSAqIHBvd3MoMTYsIGNvdW50KTsJCisJCWVsc2UgaWYgKHQgPj0gJzAnICYmIHQgPD0gJzknKQorCQkJYyArPSAodCAtICcwJykgKiBwb3dzKDE2LCBjb3VudCk7CisJCWVsc2UKKwkJCWMgPSAtMTsKKwl9CisJcmV0dXJuIGM7Cit9CisKK2ludCBnZXRfaGV4YnVmZmVyKGNoYXIgKmRhdGFfYnVmZmVyLCBjaGFyICpoZXhfYnVmZmVyKQoreworCWNoYXIgKnB0ciA9IGRhdGFfYnVmZmVyOworCWludCBpbmRleCA9IDA7CisJaW50IGRhdGFfb2Zmc2V0ID0gMDsKKworCXdoaWxlICgqcHRyICYmICorK3B0cikgeworCQkqKGhleF9idWZmZXIgKyBpbmRleCsrKSA9IHN0cmluZzJoZXgocHRyIC0gMSwgMik7CisJCXB0cisrOworCQlkYXRhX29mZnNldCsrOworCX0KKwkqKGhleF9idWZmZXIgKyBpbmRleCkgPSAwOworCXJldHVybiBkYXRhX29mZnNldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uIG5hbWU6CQlseW5xX2VuYWJsZV9sb2dfc2VydmUKKyoqIERlc2NyaXB0aW9uCQkJyrnE3MjV1r63/s7xCisqKiBJbnB1dCBwYXJhbWV0ZXJzOiAgICBOb25lICAgICAgICAgICAgICAgIAorKiogUmV0dXJuZWQgdmFsdWU6CQlOb25lCisqKiBDcmVhdGVkIGJ5OgkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbHlucV9lbmFibGVfbG9nX3NlcnZlKHZvaWQpCit7CisJbG9nX2xldmVsX3N0ciByZWFkX2xldmVsX3N0cjsKKwlpbnQgc2NhbmZfcmV0ID0gMDsKKwljaGFyIHJlYWRfYnVmW10gPSB7MH07CisJY2hhciBzaGlmdF9yZWFkX2J1ZlsxMjhdID0gezB9OworCXN0YXRpYyBjaGFyIHN0Y3BfcmVhZF9idWZbMTI4XSA9IHswfTsKKwljaGFyICpsb2dfbGV2ZWxfcmVhZGZpbGUgPSAicGVyc2lzdC5zdG9yZV9sb2dfbGV2ZWwiOworCisJaWYocHJvcGVydHlfZ2V0KGxvZ19sZXZlbF9yZWFkZmlsZSwmcmVhZF9idWYsTlVMTCkgPiAwKQorCXsKKwkJaWYoc3RyY21wKHJlYWRfYnVmLHN0Y3BfcmVhZF9idWYpID09IDApCisJCXsKKy8vCQkJcHJpbnRmKCJzdHJjbXAocmVhZF9idWYsc3RjcF9yZWFkX2J1ZikgPT0gMFxuIik7CisJCQlyZXR1cm4gOworCQl9CisJCXN0cmNweShzdGNwX3JlYWRfYnVmLHJlYWRfYnVmKTsKKwkJCisJCWlmKHJlYWRfYnVmWzBdID09ICcrJykKKwkJeworLy8JCQlwcmludGYoInN0YXJ0XG4iKTsKKwkJCXNjYW5mX3JldCA9IHNzY2FuZigmcmVhZF9idWZbMV0sIiUxMjhzIixzaGlmdF9yZWFkX2J1Zik7CisvLwkJCXByaW50Zigic2NhbmZfcmV0OiVzXG4iLHJlYWRfYnVmKTsKKwkJCWlmKHNjYW5mX3JldCkKKwkJCXsKKwkJCQkKKwkJCQlnZXRfaGV4YnVmZmVyKHNoaWZ0X3JlYWRfYnVmLHJlYWRfYnVmKTsKKwkJCQlyZWFkX2xldmVsX3N0ci5vcGVuX2xvZ19sZXZlbCA9IHJlYWRfYnVmWzBdOworCQkJCXJlYWRfbGV2ZWxfc3RyLm9wZW5fbW9kdWxlX2xvZ19udW0gPSByZWFkX2J1ZlsxXTsKKwkJCQltZW1jcHkocmVhZF9sZXZlbF9zdHIub3Blbl9tb2R1bGVfbG9nLCZyZWFkX2J1ZlsyXSxyZWFkX2xldmVsX3N0ci5vcGVuX21vZHVsZV9sb2dfbnVtKTsKKy8vCQkJCXByaW50ZigiZGF0YTolZCAlZFxuIixyZWFkX2xldmVsX3N0ci5vcGVuX2xvZ19sZXZlbCxyZWFkX2xldmVsX3N0ci5vcGVuX21vZHVsZV9sb2dfbnVtKTsKKwkJCX0KKworCQl9CisJCWVsc2UKKwkJeworCQkJbHlucV9yZWFkX3N0b3JlX2xvZ19kZXBsb3koJnJlYWRfbGV2ZWxfc3RyKTsKKwkJfQorCQlpZigocmVhZF9sZXZlbF9zdHIub3Blbl9sb2dfbGV2ZWwgPCBMT0dfTEVWRUxfTUFYKSAmJiAocmVhZF9sZXZlbF9zdHIub3Blbl9tb2R1bGVfbG9nX251bSA8IExPR19UQUdfTUFYKSkKKwkJeworCQkJbHlucV9mZ2V0X2xvZ19sZXZlbChyZWFkX2xldmVsX3N0cik7CQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiBuYW1lOgkJbHlucV9zdG9yZV9sb2dfdGVzdAorKiogRGVzY3JpcHRpb24JCQnF5NbDyNXWvtDFz6KjqMXk1sPN6rPJuvOjrMj0srvQ3rjExeTWw9DFz6KjrL/J0tS69sLUo6kKKyoqIElucHV0IHBhcmFtZXRlcnM6ICAgIE5vbmUgICAgICAgICAgICAgIAorKiogUmV0dXJuZWQgdmFsdWU6CQlOb25lCisqKiBDcmVhdGVkIGJ5OgkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTU9EVUxFX0xPR19OVU0gNgordm9pZCBseW5xX3N0b3JlX2xvZ190ZXN0KHZvaWQpCit7CisJbG9nX2xldmVsX3N0ciB3cml0ZV9sZXZlbF9zdHI7CisJbG9nX2xldmVsX3N0ciByZWFkX2xldmVsX3N0cjsKKwkKKwljaGFyIG9wZW5fbG9nX2xldmVsID0gTE9HX1dBUk5JTkc7CQorCWNoYXIgbW9kdWxlX2xvZ19idWZbTU9EVUxFX0xPR19OVU1dID0ge0xPR19NUVRULExPR19TUEksTE9HX1RIUkVBRFRFU1RfREJVUywgTE9HX1RIUkVBREhBTkRMRSwgTE9HX0hUVFAsIExPR19GVFB9OworCisJd3JpdGVfbGV2ZWxfc3RyLm9wZW5fbG9nX2xldmVsID0gb3Blbl9sb2dfbGV2ZWw7CisJd3JpdGVfbGV2ZWxfc3RyLm9wZW5fbW9kdWxlX2xvZ19udW0gPSBNT0RVTEVfTE9HX05VTTsKKwltZW1jcHkod3JpdGVfbGV2ZWxfc3RyLm9wZW5fbW9kdWxlX2xvZyxtb2R1bGVfbG9nX2J1ZixNT0RVTEVfTE9HX05VTSk7CisJaWYobHlucV9yZWFkX3N0b3JlX2xvZ19kZXBsb3koJnJlYWRfbGV2ZWxfc3RyKSAhPSAwKQorCXsKKwkJbHlucV9zdG9yZV9sb2dfZGVwbG95KCZ3cml0ZV9sZXZlbF9zdHIpOworCQlseW5xX3N0b3JlX2xvZ19kZXBsb3koJndyaXRlX2xldmVsX3N0cik7CisJfQorCisvLwlwcmludGYoIndyaXRlIGxvZyBkZXBsb3kgc3VjY2VzcyEhIVxuIik7CisJcmV0dXJuIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gbmFtZToJCWx5bnFfcmVhZF9zZXRfbG9nX3Rlc3QKKyoqIERlc2NyaXB0aW9uCQkJyrnE3MXk1sPQxc+iCisqKiBJbnB1dCBwYXJhbWV0ZXJzOiAgICBOb25lICAgICAgICAgICAgICAKKyoqIFJldHVybmVkIHZhbHVlOgkJTm9uZQorKiogQ3JlYXRlZCBieToJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGx5bnFfcmVhZF9zZXRfbG9nX3Rlc3Qodm9pZCkKK3sKKwlseW5xX2VuYWJsZV9sb2dfc2VydmUoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2xvZy1yaWx0ZWwvbHlucV9uYW5kLmMgYi9zcmMvbHlucS9saWIvbGlibHlucS1sb2cvbG9nLXJpbHRlbC9seW5xX25hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWI0ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2xvZy1yaWx0ZWwvbHlucV9uYW5kLmMKQEAgLTAsMCArMSwyNDAgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisNCisjaW5jbHVkZSAibXRrX2RldmljZV93cmFwLmgiDQorI2luY2x1ZGUgImx5bnFfbmFuZC5oIg0KKw0KKyNpZiAxDQorI2RlZmluZSBOQU5EX0xPR19QQVRDSCAiL2Rldi9tdGQxOSINCisjZWxzZQ0KKyNkZWZpbmUgTkFORF9MT0dfUEFUQ0ggIi9kZXYvbXRkMTkvbHlucV9sb2cudHh0Ig0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTkFORF9QUklNSVRJVkVfT0ZGU0VUIDIqMTAyNA0KKyNkZWZpbmUgTkFORF9UT1RBTF9TSVpFIDIwKjEwMjQqMTAyNA0KKyNkZWZpbmUgTkFORF9DVVJSRU5UX0xFTiAyKjEwMjQNCisjZGVmaW5lIE5BTkRfT0xEX0NVUlJFTlRfTEVOIDANCisNCitzdGF0aWMgIGludCBseW5xX25hbmRfb2Zmc2V0X2dsb2JhbCA9IDA7DQorc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBuYW5kX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsNCitjaGFyIG5hbmRfY291bnQgPSAwOw0KKw0KK3ZvaWQgbHlucV9zdG9yZV9uYW5kX29mZnNldF9kYXRhKGNoYXIgKnN0b3JlX25hbmRfb2Zmc2V0X2RhdGEpOw0KK2ludCBseW5xX3JlYWRfbmFuZF9vZmZzZXRfZGF0YShjaGFyICpyZWFkX25hbmRfb2Zmc2V0X2RhdGEpOw0KKw0KKw0KK2ludCBseW5xX25hbmRfc3RvcmVfbG9nX21lc3NhZ2UoY2hhciAqbG9nX21lc3NhZ2Usc2l6ZV90IGxvZ19tZXNzYWdlX2xlbikNCit7DQorCXB0aHJlYWRfbXV0ZXhfbG9jaygmbmFuZF9tdXRleCk7DQorCWludCBmZDsNCisJaW50IGVyciA9IDA7DQorCWNoYXIgbmFuZF9jdXJyZW50X2J1ZltOQU5EX0NVUlJFTlRfTEVOXSA9IHswfTsNCisJdW5zaWduZWQgaW50IG5hbmRfcGFnZSA9IDA7DQorCWludCBuYW5kX29mZnNldF9jb3VudCA9IDA7DQorCWNoYXIgbmFuZF9vZmZzZXRfYnVmWzhdID0gezB9Ow0KKwljaGFyIHJlYWRfbmFuZF9idWZbOF0gPSB7MH07DQorCQ0KKwlpZihsb2dfbWVzc2FnZV9sZW4gPT0gMCkNCisJew0KKwkJcmV0dXJuIC0xOw0KKwl9DQorCQ0KKwlmZD1tdGtfZGV2aWNlX3dyYXBfb3BlbihOQU5EX0xPR19QQVRDSCxPX1JEV1IpOw0KKwlpZihmZCA8IDApDQorCXsNCisJCXBlcnJvcigib3BlbiBuYW5kIGxvZyBtZXNzYWdlIGVycm9yMSEhISEiKTsNCisJCXJldHVybiBmZDsNCisJfQ0KKw0KKwlpZihseW5xX3JlYWRfbmFuZF9vZmZzZXRfZGF0YShuYW5kX29mZnNldF9idWYpID09IDApDQorCXsNCisJCW5hbmRfb2Zmc2V0X2NvdW50ID0gYXRvaShuYW5kX29mZnNldF9idWYpOw0KKwkJbHlucV9uYW5kX29mZnNldF9nbG9iYWwgPSBuYW5kX29mZnNldF9jb3VudDsNCisJfQ0KKw0KKwkJKChsb2dfbWVzc2FnZV9sZW4gJSAyMDQ4KSA9PSAwICkgPyAobmFuZF9wYWdlID0gbG9nX21lc3NhZ2VfbGVuIC8gMjA0OCkgOiAobmFuZF9wYWdlID0gKGxvZ19tZXNzYWdlX2xlbiAvIDIwNDgpKzEpOw0KKy8vcHJpbnRmKCJuYW5kX3BhZ2U6JWRcbiIsbmFuZF9wYWdlKTsJCQ0KKwl3aGlsZSgxKQ0KKwl7DQorCQllcnIgPSBtdGtfZGV2aWNlX3dyYXBfc2VlayhmZCwgbHlucV9uYW5kX29mZnNldF9nbG9iYWwsIFNFRUtfU0VUKTsNCisJCWlmKGVyciA9PSAtMSkNCisJCXsNCisJCQlwZXJyb3IoInNlZWsgbmFuZCBsb2cgbWVzc2FnZSBlcnJvcjghISEhIik7DQorCQkJcmV0dXJuIGVycjsNCisJCX0NCisJCW10a19kZXZpY2Vfd3JhcF9yZWFkKGZkLCByZWFkX25hbmRfYnVmLCA4KTsNCisJaWYoKChyZWFkX25hbmRfYnVmWzBdID09IDB4ZmYpICYmIChyZWFkX25hbmRfYnVmWzFdID09IDB4ZmYpICYmIChyZWFkX25hbmRfYnVmWzJdID09IDB4ZmYpICYmKHJlYWRfbmFuZF9idWZbM10gPT0gMHhmZikpIHx8XA0KKyAgICAgICAJKChseW5xX25hbmRfb2Zmc2V0X2dsb2JhbCAlICgxMjggKjEwMjQpICkgPT0gMCkpDQorCSAgIHsNCisJCSAJZm9yKGludCBpID0gMDsgaSA8IG5hbmRfcGFnZTsgaSsrKQ0KKwkJCXsNCisJCQkJbWVtc2V0KG5hbmRfY3VycmVudF9idWYsMCxOQU5EX0NVUlJFTlRfTEVOKTsNCisJCQkJZXJyID0gbXRrX2RldmljZV93cmFwX3NlZWsoZmQsIGx5bnFfbmFuZF9vZmZzZXRfZ2xvYmFsLCBTRUVLX1NFVCk7DQorCQkJCWlmKGVyciA9PSAtMSkNCisJCQkJew0KKwkJCQkJcGVycm9yKCJzZWVrIG5hbmQgbG9nIG1lc3NhZ2UgZXJyb3I4ISEhISIpOw0KKwkJCQkJcmV0dXJuIGVycjsNCisJCQkJfQ0KKwkJCQlpZigoaSsxKSA9PSBuYW5kX3BhZ2UpDQorCQkJCXsNCisJCQkJCW1lbWNweShuYW5kX2N1cnJlbnRfYnVmLCZsb2dfbWVzc2FnZVtpKk5BTkRfQ1VSUkVOVF9MRU5dLChsb2dfbWVzc2FnZV9sZW4tKGkqMjA0OCkpKTsNCisvLwkJCQkJcHJpbnRmKCIoaSsxKSA9PSBuYW5kX3BhZ2UtLS0lZFxuIiwobG9nX21lc3NhZ2VfbGVuLShpKjIwNDgpKSk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQltZW1jcHkobmFuZF9jdXJyZW50X2J1ZiwmbG9nX21lc3NhZ2VbaSpOQU5EX0NVUlJFTlRfTEVOXSxOQU5EX0NVUlJFTlRfTEVOKTsNCisJCQkJCXByaW50ZigiKGkrMSkgIT0gbmFuZF9wYWdlXG4iKTsNCisJCQkJfQ0KKwkJCQkNCisJCQkJZXJyID0gbXRrX2RldmljZV93cmFwX3dyaXRlKGZkLCBuYW5kX2N1cnJlbnRfYnVmLCBOQU5EX0NVUlJFTlRfTEVOKTsNCisJCQkJaWYoZXJyID09IC0xKQ0KKwkJCQl7DQorCQkJCQlwZXJyb3IoIndyaXRlIG5hbmQgbG9nIG1lc3NhZ2UgZXJyb3I5ISEhISIpOw0KKwkJCQkJcmV0dXJuIGVycjsNCisJCQkJfQ0KKwkJCQlseW5xX25hbmRfb2Zmc2V0X2dsb2JhbCArPSBOQU5EX0NVUlJFTlRfTEVOOw0KKwkJCQlpZihseW5xX25hbmRfb2Zmc2V0X2dsb2JhbCA+IE5BTkRfVE9UQUxfU0laRSkNCisJCQkJew0KKwkJCQkJbHlucV9uYW5kX29mZnNldF9nbG9iYWwgPSAwOw0KKwkJCQl9DQorCQkJfQkgIA0KKwkJICAgYnJlYWs7DQorCSAgIH0NCisvL3ByaW50ZigibHlucV9uYW5kX29mZnNldF9nbG9iYWw6JWQtLS1uYW5kX29mZnNldF9jb3VudDolZFxuIixseW5xX25hbmRfb2Zmc2V0X2dsb2JhbCxuYW5kX29mZnNldF9jb3VudCk7CQ0KKwkJbHlucV9uYW5kX29mZnNldF9nbG9iYWwgKz0gTkFORF9DVVJSRU5UX0xFTjsNCisJCWlmKGx5bnFfbmFuZF9vZmZzZXRfZ2xvYmFsID4gTkFORF9UT1RBTF9TSVpFKQ0KKwkJew0KKwkJCWx5bnFfbmFuZF9vZmZzZXRfZ2xvYmFsID0gMDsNCisJCX0NCisJfQ0KKwkNCisJaWYobmFuZF9jb3VudCA+PSA2NCkNCisJew0KKwkJbmFuZF9jb3VudCA9IDA7DQorCQlzcHJpbnRmKG5hbmRfb2Zmc2V0X2J1ZiwiJWQiLGx5bnFfbmFuZF9vZmZzZXRfZ2xvYmFsKTsNCisJCWx5bnFfc3RvcmVfbmFuZF9vZmZzZXRfZGF0YShuYW5kX29mZnNldF9idWYpOw0KKwl9DQorDQorCWVyciA9IG10a19kZXZpY2Vfd3JhcF9jbG9zZShmZCk7DQorCQ0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmbmFuZF9tdXRleCk7DQorCXJldHVybiAwOw0KK30NCisNCisNCitpbnQgbHlucV9uYW5kX2dldF9sb2dfbWVzc2FnZShjaGFyICpsb2dfbWVzc2FnZSxzaXplX3QgbG9nX21lc3NhZ2VfbGVuLG9mZl90IG9mZnNldCkNCit7DQorCWludCBmZDsNCisJaW50IGVyciA9IDA7DQorDQorCXB0aHJlYWRfbXV0ZXhfbG9jaygmbmFuZF9tdXRleCk7DQorCQ0KKwl1bnNpZ25lZCBpbnQgbHlucV9uYW5kX29mZnNldF9wYXJ0ID0gMDsNCisJDQorCWZkPW10a19kZXZpY2Vfd3JhcF9vcGVuKE5BTkRfTE9HX1BBVENILE9fUkRPTkxZKTsNCisJaWYoZmQgPCAwKQ0KKwl7DQorCQlwZXJyb3IoIm9wZW4gbmFuZCBsb2cgbWVzc2FnZSBlcnJvciEhISEiKTsNCisJCXJldHVybiBmZDsNCisJfQ0KKwkNCisJbHlucV9uYW5kX29mZnNldF9wYXJ0ID0gTkFORF9QUklNSVRJVkVfT0ZGU0VUICsgb2Zmc2V0Ow0KKy8vcHJpbnRmKCJseW5xX25hbmRfb2Zmc2V0X3BhcnQgMTM6JWRcbiIsbHlucV9uYW5kX29mZnNldF9wYXJ0KTsNCisJZXJyID0gbXRrX2RldmljZV93cmFwX3NlZWsoZmQsIGx5bnFfbmFuZF9vZmZzZXRfcGFydCwgU0VFS19TRVQpOw0KKy8vcHJpbnRmKCJseW5xX25hbmRfb2Zmc2V0X3BhcnQgMTQ6JWQtLS0tbmFuZCBzZWVrIDQ6JWRcbiIsbHlucV9uYW5kX29mZnNldF9wYXJ0LGVycik7DQorCWlmKGVyciA9PSAtMSkNCisJew0KKwkJcGVycm9yKCJzZWVrIG5hbmQgbG9nIG1lc3NhZ2UgZXJyb3IgMTUhISEhIik7DQorCQlyZXR1cm4gZXJyOw0KKwl9DQorCQ0KKwltdGtfZGV2aWNlX3dyYXBfcmVhZChmZCwgbG9nX21lc3NhZ2UsIGxvZ19tZXNzYWdlX2xlbik7DQorCQ0KKwllcnIgPSBtdGtfZGV2aWNlX3dyYXBfY2xvc2UoZmQpOw0KKwkNCisJcHRocmVhZF9tdXRleF91bmxvY2soJm5hbmRfbXV0ZXgpOw0KKwlyZXR1cm4gZXJyOw0KK30NCisNCisNCitpbnQgbHlucV9uYW5kX3JlYWRfZGF0YV90ZXN0KHZvaWQpDQorew0KKwlpbnQgZmQ7DQorCUZJTEUgKmZpbGVfZmQgPSBOVUxMOw0KKwlpbnQgZXJyOw0KKwljaGFyIGxvZ19kYXRhX2J1Zls2KjEwMjRdID0gezB9Ow0KKwljaGFyIGxvZ19uYW5kX2J1ZlsyMDQ4XSA9IHsweDExLDB4MjIsMHgzMywweDQ0LDB4NTUsMHg2NiwweDc3LDB4ODgsMHg5OX07DQorCXN0YXRpYyB1bnNpZ25lZCBpbnQgbmFuZF9vZmZzZXRfdGVzdCA9IDA7DQorCWNoYXIgKmZpbGVQYXRoID0gIi91c3IvbG9jYWwvbG5hbmRfbG9nLnR4dCI7DQorCQ0KKwlzeXN0ZW0oInRvdWNoIC91c3IvL2xvY2FsL2xuYW5kX2xvZy50eHQiKTsNCisJc3lzdGVtKCJjaG1vZCA3NzcgL3Vzci8vbG9jYWwvbG5hbmRfbG9nLnR4dCIpOw0KKwkNCisJZmQ9bXRrX2RldmljZV93cmFwX29wZW4oTkFORF9MT0dfUEFUQ0gsT19SRFdSKTsNCisNCisJaWYoZmQgPCAwKQ0KKwl7DQorCQlwZXJyb3IoIm9wZW4gbmFuZCBsb2cgbWVzc2FnZSBlcnJvciEhISEiKTsNCisJCXJldHVybiBmZDsNCisJfQ0KKwkNCisJZmlsZV9mZCA9IGZvcGVuKGZpbGVQYXRoLCJydCsiKTsNCisJaWYoTlVMTCA9PSBmaWxlX2ZkKQ0KKwl7DQorCQlwZXJyb3IoImZpbGVfZmQiKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlmb3IoaW50IGkgPSAwIDtpIDwgMTAwOyBpKyspDQorCXsNCisJCW1lbXNldChsb2dfZGF0YV9idWYsMCw2KjEwMjQpOw0KKwkJZXJyID0gbXRrX2RldmljZV93cmFwX3NlZWsoZmQsIG5hbmRfb2Zmc2V0X3Rlc3QsIFNFRUtfU0VUKTsNCisJCQ0KKwkJDQorCQlpZihlcnIgPT0gLTEpDQorCQl7DQorCQkJcGVycm9yKCJzZWVrIG5hbmQgbG9nIG1lc3NhZ2UgZXJyb3IhISEhIik7DQorCQkJcmV0dXJuIGVycjsNCisJCX0NCisJDQorCQlmc2VlayhmaWxlX2ZkLG5hbmRfb2Zmc2V0X3Rlc3QsU0VFS19TRVQpOw0KKw0KKwkJbXRrX2RldmljZV93cmFwX3JlYWQoZmQsIGxvZ19kYXRhX2J1ZiwgNioxMDI0KTsJDQorCQluYW5kX29mZnNldF90ZXN0ICs9ICg2KjEwMjQpOw0KKwkJDQorCQlmd3JpdGUoJmxvZ19kYXRhX2J1ZixzaXplb2YobG9nX2RhdGFfYnVmKSwgMSwgZmlsZV9mZCk7DQorCQkNCisJfQ0KKw0KKwlmY2xvc2UoZmlsZV9mZCk7DQorCW10a19kZXZpY2Vfd3JhcF9jbG9zZShmZCk7DQorCQ0KK30NCisNCisNCisNCit2b2lkIGx5bnFfc3RvcmVfbmFuZF9vZmZzZXRfZGF0YShjaGFyICpzdG9yZV9uYW5kX29mZnNldF9kYXRhKQ0KK3sNCisJY2hhciAqbG9nX2xldmVsX3dyaXRlZmlsZSA9ICJwZXJzaXN0LnN0b3JlX25hbmRfZGF0YSI7DQorCXByb3BlcnR5X3NldChsb2dfbGV2ZWxfd3JpdGVmaWxlLChjaGFyICopc3RvcmVfbmFuZF9vZmZzZXRfZGF0YSk7CQ0KKwlyZXR1cm4gOw0KK30NCisNCitpbnQgbHlucV9yZWFkX25hbmRfb2Zmc2V0X2RhdGEoY2hhciAqcmVhZF9uYW5kX29mZnNldF9kYXRhKQ0KK3sNCisJY2hhciAqbG9nX2xldmVsX3JlYWRmaWxlID0gInBlcnNpc3Quc3RvcmVfbmFuZF9kYXRhIjsNCisNCisJaWYocHJvcGVydHlfZ2V0KGxvZ19sZXZlbF9yZWFkZmlsZSwoY2hhciAqKXJlYWRfbmFuZF9vZmZzZXRfZGF0YSxOVUxMKSA+IDApIA0KKyAgICB7DQorLy8JCXByaW50ZigicmVhZCBsb2cgbGV2ZWwgZGVwbG95IHN1Y2Nlc3MhISFcbiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJZWxzZQ0KKwl7DQorLy8JCXByaW50ZigiZ2V0IGZpbGUgZXJyb3IhISFcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9sb2ctcmlsdGVsL21ha2VmaWxlIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtbG9nL2xvZy1yaWx0ZWwvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5MjlhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9seW5xL2xpYi9saWJseW5xLWxvZy9sb2ctcmlsdGVsL21ha2VmaWxlCkBAIC0wLDAgKzEsMTAxIEBACitTSEVMTCA9IC9iaW4vc2gKK1JNID0gcm0gLWYKKworTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIFwKKyAgICAgICAgICAgICAgICAtc3RkPWdudSsrMTQgXAorICAgICAgICAgICAgICAgIC1nIC1PcyBcCisgICAgICAgICAgICAgICAgLWZsdG8gXAorICAgICAgICAgICAgICAgIC1EUklMX1NITElCIFwKKyAgICAgICAgICAgICAgICAtREFUQ0lfUEFSU0UgXAorICAgICAgICAgICAgICAgIC1ES0VFUF9BTElWRSBcCisgICAgICAgICAgICAgICAgLURFQ0FMTF9TVVBQT1JUIFwKKyAgICAgICAgICAgICAgICAtZnBlcm1pc3NpdmUgXAorCitDRkxBR1MgKz0gLWZQSUMgLU8yICQoSU5DTFVERSkgLURfTEFSR0VGSUxFNjRfU09VUkNFCisKKyQod2FybmluZyAjIyMjIyMjIyMjIyMjIyMjIyBDMksgc3VwcG9ydDogJChSQVRfQ09ORklHX0MyS19TVVBQT1JUKSkKK2lmZXEgKCQoc3RyaXAgJChSQVRfQ09ORklHX0MyS19TVVBQT1JUKSksIHllcykKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURDMktfU1VQUE9SVAorCitlbmRpZgorCitpZmVxICgkKHN0cmlwICQoTVRLX01VTFRJX1NJTV9TVVBQT1JUKSksIGRzZHMpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TSU1fQ09VTlRfMiBcCisgICAgICAgICAgICAgICAgICAgICAtREFORFJPSURfTVVMVElfU0lNIFwKKyAgICAgICAgICAgICAgICAgICAgIC1ETU9ERV9EU0RTCitlbmRpZgorCitpZmVxICgkKHN0cmlwICQoTVRLX01VTFRJX1NJTV9TVVBQT1JUKSksIGRzc3MpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1ETU9ERV9EU1NTCitlbmRpZgorCiskKHdhcm5pbmcgIyMjIyMjIyMjIyMjIyMjIyMgVEFSR0VUX1BMQVRGT1JNOiAkKFRBUkdFVF9QTEFURk9STSkpCitpZmVxICgkKHN0cmlwICQoVEFSR0VUX1BMQVRGT1JNKSksIG10MjczMSkKKyMkKHdhcm5pbmcgIyMjIyMjIyMjIyMjIyMjIyNhZGQgZm9yIGRlYnVnICQoUk9PVCksICQoaW5jbHVkZWRpcikpCiskKHdhcm5pbmcgIyMjIyMjIyMjIyMjIyMjIyMgVEFSR0VUX1BMQVRGT1JNX01UMjczMSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURUQVJHRVRfUExBVEZPUk1fTVQyNzMxIFwKKyAgICAgICAgICAgICAgICAgICAgLURNRF85M19TVVBQT1JUCitlbHNlIGlmZXEgKCQoc3RyaXAgJChUQVJHRVRfUExBVEZPUk0pKSwgbXQyNjM1KQorJCh3YXJuaW5nICMjIyMjIyMjIyMjIyMjIyMjIFRBUkdFVF9QTEFURk9STV9NVDI2MzUpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVEFSR0VUX1BMQVRGT1JNX01UMjYzNSBcCisgICAgICAgICAgICAgICAgICAgIC1ETURfOTBfU1VQUE9SVAorZW5kaWYKKworJCh3YXJuaW5nICMjIyMjIyMjIyMjIyMjIyMjIFJJVEEgUk9PVDogJChST09UKSxpbmNsdWRlZGlyOiQoaW5jbHVkZWRpcikpCitMT0NBTF9QQVRIICAgPSAuCisKK0xPQ0FMX0NfSU5DTFVERVMgPSBcCisgIC1JLiBcCisgIC1JJChMT0NBTF9QQVRIKS8uLi9pbmNsdWRlL2xpYmxvZyBcCisgIC1JJChST09UKSQoaW5jbHVkZWRpcikgXAorIC1JJChST09UKSQoaW5jbHVkZWRpcikvbG9nZ2VyIFwKKyAgIAorCisKKworTE9DQUxfTElCUyA6PSBcCisgICAgLUwuIFwKKyAgICAtbGRsIFwKKyAgICAtbHN0ZGMrKyBcCisgICAgLWxsb2cgXAorICAgIC1sY3V0aWxzIFwKKyAgICAtbHV0aWxzIFwKKyAgICAtbHBvd2VyIFwKKyAgICAtbHBhbCBcCisgICAgLWxuYW5kYXBpIFwKKyAgICAtbHNuY2ZnIFwKKworU09VUkNFUyA9ICQod2lsZGNhcmQgKi5jIHdpbGRjYXJkICouaCkKKworRVhFQ1VUQUJMRSA9IGxpYmx5bnEtbG9nLnNvCisKK09CSkVDVFM9JChTT1VSQ0VTOi5jPS5vKQorCisKKy5QSE9OWTogYnVpbGQgY2xlYW4gaW5zdGFsbCBwYWNrX3Jvb3RmcyAKKworYWxsOiBidWlsZAorJChFWEVDVVRBQkxFKTogJChPQkpFQ1RTKQorCSQoQ1hYKSAtc2hhcmVkIC1XbCwtLW5vLXVuZGVmaW5lZCAkKE9CSkVDVFMpICQoTE9DQUxfTElCUykgJChDRkxBR1MpICQoTE9DQUxfQ0ZMQUdTKSAkKExPQ0FMX0NfSU5DTFVERVMpIC1vICRACisKKyUubyA6ICUuYworCSQoQ0MpICQoTE9DQUxfQ19JTkNMVURFUykgJChDRkxBR1MpICQoTE9DQUxfQ0ZMQUdTKSAkKExPQ0FMX0xJQlMpIC1vICRAIC1jICQ8IAorCitidWlsZDogICQoRVhFQ1VUQUJMRSkKKwkkKHdhcm5pbmcgIyMjIyMjIyMjIyBidWlsZCAkKEVYRUNVVEFCTEUpICAjIyMjIyMjIyMjKQorCitpbnN0YWxsOgorCW1rZGlyIC1wICQoUk9PVCkkKGJhc2VfbGliZGlyKS8KKwlpbnN0YWxsICQoRVhFQ1VUQUJMRSkgJChST09UKSQoYmFzZV9saWJkaXIpLworCW1rZGlyIC1wICQoUk9PVCkkKGluY2x1ZGVkaXIpLyQoTkFNRSkvc2RrCisKK3BhY2tfcm9vdGZzOgorCW1rZGlyIC1wICQoUEFDS19JTklUUkFNRlNfVE8pJChiYXNlX2xpYmRpcikvCisJY3AgLWFmICQoRVhFQ1VUQUJMRSkgJChQQUNLX0lOSVRSQU1GU19UTykkKGJhc2VfbGliZGlyKS8KKwkkKENST1NTKXN0cmlwICQoUEFDS19JTklUUkFNRlNfVE8pJChiYXNlX2xpYmRpcikvJChFWEVDVVRBQkxFKQorCW1rZGlyIC1wICQoUEFDS19UTykkKGJhc2VfbGliZGlyKS8KKwljcCAtYWYgJChFWEVDVVRBQkxFKSAkKFBBQ0tfVE8pJChiYXNlX2xpYmRpcikvCisJJChDUk9TUylzdHJpcCAkKFBBQ0tfVE8pJChiYXNlX2xpYmRpcikvJChFWEVDVVRBQkxFKQorLlBIT05ZOiBjbGVhbgorY2xlYW46CisJJChSTSkgJChPQkpFQ1RTKSAkKEVYRUNVVEFCTEUpCg==